提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
FFT运算的加深理解——栅栏效应、补零、物理分辨率、计算分辨率
栅栏效应和计算分辨率
栅栏效应是指离散傅里叶变换计算的频谱被限制在基频整数倍处,只能在相应离散点处看到输出的现象。栅栏效应可以通过补0来进行缓解。
我们以一个具体的例子来描述补0对FFT分析带来的变化:
我们需要分析 一个频率为 1.0413Hz的点频。
FFT64个点,其中1Hz和1.125Hz都是基频的整数倍,但1.0413Hz离1Hz更近,那么最高点肯定落于1Hz处。
N = 64
fs = 8;
fi1 = 1+ 2/N+0.01;
x = 1*exp(j*2*pi*fi1/fs*[0:1*N-1]) ;
%x = [x zeros(1,64*1)];
x_fft = fft(x);
plot([-4:8/N:4-1/N],fftshift(abs(x_fft))/64)
hold on
stem([-4:8/N:4-1/N],fftshift(abs(x_fft))/64)
假设我们补64个的0,相当于FFT分析精度提升了1倍,现在1Hz和1.0625Hz都是基频的整数倍,1.0413Hz离1Hz更近,那么最高点肯定落于1.0413Hz处
N = 64
fs = 8;
fi1 = 1+ 2/N+0.01;
x = 1*exp(j*2*pi*fi1/fs*[0:1*N-1]) ;
x = [x zeros(1,64*1)];
x_fft = fft(x);
plot([-4:4/N:4-1/N],fftshift(abs(x_fft))/64)
hold on
stem([-4:4/N:4-1/N],fftshift(abs(x_fft))/64)
假设我们192个的0,相当于FFT分析精度提升了2倍,现在1Hz和1.03125Hz都是基频的整数倍,1.0413Hz离1.03125Hz更近,那么最高点肯定落于1.03125Hz处
N = 64
fs = 8;
fi1 = 1+ 2/N+0.01;
x = 1*exp(j*2*pi*fi1/fs*[0:1*N-1]) ;
x = [x zeros(1,64*3)];
x_fft = fft(x);
plot([-4:2/N:4-1/N],fftshift(abs(x_fft))/64)
hold on
stem([-4:2/N:4-1/N],fftshift(abs(x_fft))/64)
确实,通过补0,我们慢慢的接近了真实点频的频率。这就是提高了计算分辨率
物理分辨率
那如果是两个很近的点频能够通过补0来进行区分吗?从三个FFT结果的叠加来看,其谱线的宽度基本不变,也就是说,补零操作增加了频域的插值点数,让频域曲线看起来更加光滑,提升了计算分辨率,但无法将频谱更细致化的展现出来,这样如果同时有两个频率很接近的点频,通过补0是没办法区分开的。
为了验证这句话,我们设定如下数据仿真
N = 64
fs = 8;
fi1 = 1+ 2/N+0.01;
fi2 = 1+ 2/N+0.06;
x = 1*exp(j*2*pi*fi1/fs*[0:4*N-1]) + 1*exp(j*2*pi*fi2/fs*[0:4*N-1]);
我们通过补192个数据与192个0的频谱分析图进行对比,除了能跟补0一样将频率估计的更准确,同时还将频谱变的更细致。这样如果同时有两个频率很接近的点频,则可以区分开来,这样就提高了FFT的物理分辨率
总结
从上面的描述可以知道,物理分辨率的提升计算分辨率肯定也提升了。那为什么还需要补0的操作呢。
1、补0的运算量远小于补数据的计算量,对于一个大部分数据都是0的FFT运算,是有办法进行一些简化操作的
2、数据只有有限时间的相位是连续的,这样就限制了我们采用更长的数据进行分析,这个时候为了提升分辨率精度,就只能通过补0的方式了。
最后注意这两个概念:
物理分辨率与计算分辨率。
物理分辨率是跟分析数据长度有关
计算分辨率则跟FFT的点数有关
补零能够通过提升计算分辨率来缓解栅栏效应,但无法提升物理分辨率来进行对相近频点的区分
2022-1-31 写于除夕日