一、频谱泄露
1. 定义
频谱泄露会导致主谱线旁边有很多旁瓣,这会造成谱线间的干扰,严重的可能是旁瓣能量强到分不清哪个是主瓣,这就是所谓的谱间干扰。
(参考:FFT造成的频谱混叠,栅栏效应,频谱泄露,谱间干扰)
2. 产生原因
信号被非周期截断,导致延拓信号和原信号的相位不连续,那么做 FFT 变换,得到的频谱就会发生频谱泄露。所以发生频谱泄露的原因是:信号被非周期截断/加窗。
如下图:图 1 的第 1 个子图是信号被周期截断,第 2 个子图是被非周期截断,它们的傅里叶变换见图 2。可以看到第 1 个子图的 FFT 能量集中在某个频率,而第 2 个子图在主频点附近的频点上,也有许多不可忽视的能量,即主频点能量泄漏到附近频点上。
(参考:如何理解频谱泄露?)
(参考:傅里叶变换学习笔记(二)——栅栏效应、频谱泄漏与加窗)
图1
图2
(参考:频谱泄露和加窗)
3. 解决办法
时域中的突变点会对 FFT 之后的频谱有明显的影响,并且频谱泄露的程度取决于时域信号边界的不连续程度,解决办法是:周期截断信号。
但很难做到周期截断,只能引入分窗算法,通过加窗的方式使截断加窗后的信号尽可能地接近周期信号(只不过一个窗信号就是一个周期)
注:加窗只能减少频谱泄露,但不能解决频谱泄露!
二、举个栗子
%% 频谱泄露
clear; clc; close all; warning off;
%% 参数设置
fs = 100; % 采样频率(满足奈奎斯特采样定理:要大于信号最大频率的两倍!!!)
L = 5; % 时间长度
t = 0 : 1/fs : L; % 时间坐标
t(1) = [];
%% 生成信号
f = 6; % 信号频率
s0 = sin(2 * pi * f * t);
% 加窗
winFunc = hamming(length(s0))'; % 汉明窗
s1 = s0 .* winFunc;
%% FFT
numfft = 1024; % FFT点数
f = (0 : numfft/2-1) / numfft * fs; % 频率(只取正频部分)
s_fft = fft(s0, numfft);
p = abs(s_fft(1:numfft/2)) / numfft; % 功率(只取正频部分)
s1_fft = fft(s1, numfft);
p1 = abs(s1_fft(1:numfft/2)) / numfft; % 功率(只取正频部分)
%% 作图
figure(1);
subplot(2, 1, 1);
plot(s0, 'linewidth', 1.5); title('原始信号时域波形'); axis('tight'); ylim([-1.2, 1.2]);
subplot(2, 1, 2);
plot(s1, 'linewidth', 1.5); title('加窗信号时域波形'); axis('tight'); ylim([-1.2, 1.2]);
figure(2);
sp1 = subplot(2, 1, 1);
plot(f, p, 'linewidth', 1.5); axis('tight'); title(['原始信号s0的', num2str(numfft), '点傅里叶变换']);
sp2 = subplot(2, 1, 2);
plot(f, p1, 'linewidth', 1.5); axis('tight'); title(['加窗信号s1的', num2str(numfft), '点傅里叶变换']);
linkaxes([sp1, sp2], 'x');
局部放大之后:
从上图分析得到,原始信号是被非周期截断的,所以得到的 FFT 发生了频谱泄露现象,体现在主频附近一些频点有较高的能量。而经过加窗处理后的信号类似于周期信号,所以加窗信号的 FFT 的频谱泄露现象减少(但不是消除!)。
原理见下图:
(参考:频谱泄露和吉布斯现象)