【20211217】【信号处理】从 Matlab 仿真角度理解栅栏效应

一、定义

        栅栏效应是指离散傅里叶变换(DFT)计算的频谱被限制在基频的整数倍处,只能在相应的离散点处看到输出,而丢失了其他频率成分的信息的现象。(就好像透过一道栅栏看风景,只能看到透过栅栏缝隙的景色一样~)

【20211217】【信号处理】从 Matlab 仿真角度理解栅栏效应

         (参考:栅栏效应 (数字信号处理术语)

二、产生原因

        栅栏效应的本质就是频率分辨率不够,导致部分频率信息丢失,而丢失的这些频率信息很有可能就是重要的或具有重要特征的成分,所以可能会对信号处理的结果产生很大的影响。

        (参考:信号降低栅栏效应

        (参考:栅栏效应

三、如何解决栅栏效应?

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 的运行结果

【20211217】【信号处理】从 Matlab 仿真角度理解栅栏效应

 (2)256 点 FFT 的运行结果

【20211217】【信号处理】从 Matlab 仿真角度理解栅栏效应

 (3)512 点 FFT 的运行结果

【20211217】【信号处理】从 Matlab 仿真角度理解栅栏效应

(4)64 点 FFT 的运行结果 

【20211217】【信号处理】从 Matlab 仿真角度理解栅栏效应

 (5)32 点 FFT 的运行结果

【20211217】【信号处理】从 Matlab 仿真角度理解栅栏效应

 (6)16 点 FFT 的运行结果

【20211217】【信号处理】从 Matlab 仿真角度理解栅栏效应

        从上图可以看出,FFT 点数越高,频率分辨率越高,就越能分辨出不同的频率成分能量尖峰,5Hz 和 6Hz 的两个信号频率只相差 1Hz,对于 64 点的傅里叶变换,频率分辨率为 F=fs/N=100/64≈1.56,显然,这样的频率分辨率不足以分辨出这两种不同的频率成分~

        (参考:FFT中的栅栏效应) 

上一篇:傅里叶变换


下一篇:lamda表达式导致运行时VerifyError