一、定义
栅栏效应是指离散傅里叶变换(DFT)计算的频谱被限制在基频的整数倍处,只能在相应的离散点处看到输出,而丢失了其他频率成分的信息的现象。(就好像透过一道栅栏看风景,只能看到透过栅栏缝隙的景色一样~)
(参考:栅栏效应 (数字信号处理术语))
二、产生原因
栅栏效应的本质就是频率分辨率不够,导致部分频率信息丢失,而丢失的这些频率信息很有可能就是重要的或具有重要特征的成分,所以可能会对信号处理的结果产生很大的影响。
(参考:信号降低栅栏效应)
(参考:栅栏效应)
三、如何解决栅栏效应?
1. 增加频域抽样点数 N(即 FFT 点数);
2. 时域信号延拓,增加数据点数。
感性上理解:周期延拓相当于 ”加强“ 了信号,所以 FFT 结果会得到优化。
注意:时域补零,相当于频域上内插,内插的效果只是让谱线更平滑,但不能增加频率分辨率!频域分辨率 F=fs/N=1/(N*Ts)=1/T,也就是说,频率分辨率为信号累积时间 T 的倒数,所以补零并不改变频率分辨率!
(参考:傅里叶变换学习笔记(二)——栅栏效应、频谱泄漏与加窗)
(参考:FFT造成的频谱混叠,栅栏效应,频谱泄露,谱间干扰)
(参考:信号降低栅栏效应)
(参考:补零与离散傅里叶变换的分辨率)
四、举个栗子~
现对一个由两个单频信号相加得到的合成信号进行频域分析,单频信号的频率分别为 6Hz 和 5Hz,时域的采样频率为 100Hz,下面是求 FFT 的 Matlab 代码:
频率分辨率 F = fs / N,其中fs 为采样频率,N 为 FFT 点数。也就是说,DFT 的频率分辨率不仅与采样频率有关,也与 FFT点数有关!
(参考:补零与离散傅里叶变换的分辨率)
%% 栅栏效应
clear; clc; close all; warning off;
%% 参数设置
fs = 100; % 采样频率(满足奈奎斯特采样定理:要大于信号最大频率的两倍!!!)
L = 10; % 时间长度
t = 0 : 1/fs : L; % 时间坐标
%% 生成信号
f1 = 6; % 信号1频率
f2 = 5; % 信号2频率
s1 = 10 * sin(2 * pi * f1 * t);
s2 = 10 * sin(2 * pi * f2 * t);
s = s1 + s2; % 合成信号
%% FFT
numfft = 128; % FFT点数
s_fft = fft(s, numfft);
p = pow2db(abs(s_fft(1:numfft/2)) .^ 2); % 功率(只取正频部分)
f = (0 : numfft/2-1) / numfft * fs; % 频率(只取正频部分)
magnitude = abs(s_fft(1:numfft/2)) ./ numfft; % 幅度谱
phase = angle(s_fft(1:numfft/2)); % 相位谱
%% 作图
figure(1);
subplot(3, 1, 1);
plot(f, p, 'linewidth', 1.5); axis('tight'); title([num2str(numfft), '点傅里叶变换']);
subplot(3, 1, 2);
plot(f, magnitude, 'linewidth', 1.5); axis('tight'); title('幅度谱');
subplot(3, 1, 3);
plot(f, phase, 'linewidth', 1.5); axis('tight'); title('相位谱');
(1)128 点 FFT 的运行结果
(2)256 点 FFT 的运行结果
(3)512 点 FFT 的运行结果
(4)64 点 FFT 的运行结果
(5)32 点 FFT 的运行结果
(6)16 点 FFT 的运行结果
从上图可以看出,FFT 点数越高,频率分辨率越高,就越能分辨出不同的频率成分能量尖峰,5Hz 和 6Hz 的两个信号频率只相差 1Hz,对于 64 点的傅里叶变换,频率分辨率为 F=fs/N=100/64≈1.56,显然,这样的频率分辨率不足以分辨出这两种不同的频率成分~
(参考:FFT中的栅栏效应)