文章目录

  • 理想情况
  • 频谱泄露
  • 频谱泄露的解决方法1:改变采样时长
  • 频谱泄露的解决方法2:加窗
  • 栅栏效应——补零
  • 栅栏效应和频谱泄露的关系

理想情况


假设一个信号由两个频率不一样的余弦波组成cos(2πft)=cos(2πf1t)+cos(2πf2t)cos(2\pi ft)=cos(2\pi f_1t)+cos(2\pi f_2t)cos(2πft)=cos(2πf1​t)+cos(2πf2​t)组成,其中f1=50Hz,f2=65Hzf_1=50Hz,f_2=65Hzf1​=50Hz,f2​=65Hz我们以采样率fs=500Hzf_s=500Hzfs​=500Hz对该信号进行采集,采样时间长度T=0.4sT=0.4sT=0.4s,对该信号做FFT后得到的信号如下图所示,此时在频谱上可以清楚地找到两个信号频率对应的位置。

代码:

%% 理想情况
% 当采样时间正好为周期的整数倍时,没有频谱泄露;
% 因为序列时实值信号,所以FFT结果关于N/2对称,fftshift之后关于0对称
f0 = 50; f1 = 65; fs = 500; T = 0.4;
S = @(t) cos(2*pi*f0.*t) + cos(2*pi*f1.*t);
t = 0:1/fs:T-1/fs;
y = S(t);nsamps = numel(y);
y_spec = fft(y);
y_spec = fftshift(y_spec)./nsamps;
f = ((0:nsamps-1)-nsamps/2)/T; figure(1);
subplot(2,1,1);plot(y,'linewidth',1.5); xlabel('time (s)'); ylabel('y');title('理想情况');
subplot(2,1,2);plot(f, abs(y_spec),'linewidth',1.5); xlabel('frequency (Hz)'); ylabel('Amplitude');
axis([0,inf,0,inf]);

频谱泄露


频谱泄露是对无限长信号进行截取操作时引入的旁瓣干扰,其在频域上的表现为除了主要频率之外还有不希望存在的频率成分。当对非周期信号进行截取操作时,无论怎么截取都会引起频谱泄露当对周期信号进行截取操作时,如果截取时间长度为原信号周期的整数倍,则不会产生频谱泄露反之则会。(因为DFT默认对截断的时域信号进行了周期延拓,在整数倍周期处截断再进行延拓可以完整地恢复出原始信号,反之如果在非周期处截断信号并延拓得到就不是原先的信号了)。

这里依然以上述信号为例。假设此时采样时间变成了0.3s,那么在该时间窗口内,cos(2πf1t)cos(2\pi f_1t)cos(2πf1​t)可以被截断为整数倍信号周期,然而cos(2πf2t)cos(2\pi f_2t)cos(2πf2​t)则不是整数倍的信号周期。此时对采样信号做FFT结果如下。可以看到频谱上f=50Hzf=50Hzf=50Hz处幅度大于f=65Hzf=65Hzf=65Hz的幅度,cos(2πf2t)cos(2\pi f_2t)cos(2πf2​t)的能量被泄露到了其他频点上。

代码:

%% 频谱泄露
% 当采样时间不是周期的整数倍时,发生了频谱泄露;
f0 = 50; f1 = 67; fs = 500; T = 0.3;
S = @(t) cos(2*pi*f0.*t) + cos(2*pi*f1.*t);
t = 0:1/fs:T-1/fs;
y = S(t);nsamps = numel(y);
y_spec = fft(y);
y_spec = fftshift(y_spec)./nsamps;
f = ((0:nsamps-1)-nsamps/2)/T; figure(2);
subplot(2,1,1);plot(y,'linewidth',1.5); xlabel('time (s)'); ylabel('y');title('频谱泄露');
subplot(2,1,2);plot(f, abs(y_spec),'linewidth',1.5); xlabel('frequency (Hz)'); ylabel('Amplitude');
axis([0,inf,0,inf]);

频谱泄露的解决方法1:改变采样时长


既然频谱泄露是由于采样时长不是信号整数倍周期导致的,那么只要将采样时长变成各主频信号周期的最大公倍数就可以了。比如我们将采样时长延长为0.2s,此时做FFT得到下图,虽然采样时长变短导致频率分辨率降低,但是频谱泄露的问题解决了。

代码:

%% 抑制频谱泄露——方案一:采样到两个信号成分的整数倍周期
% 改变采样时长,使采样时长为各主频信号周期的整数倍
f0 = 50; f1 = 65; fs = 500; T = 0.2;
S = @(t) cos(2*pi*f0.*t) + cos(2*pi*f1.*t);
t = 0:1/fs:T-1/fs;
y = S(t);nsamps = numel(y);
y_spec = fft(y);
y_spec = fftshift(y_spec)./nsamps;
f = ((0:nsamps-1)-nsamps/2)/T; figure(3);
subplot(2,1,1);plot(y,'linewidth',1.5); xlabel('time (s)'); ylabel('y');title('采样到整数倍周期');
subplot(2,1,2);plot(f, abs(y_spec),'linewidth',1.5); xlabel('frequency (Hz)'); ylabel('Amplitude');
axis([0,inf,0,inf]);

频谱泄露的解决方法2:加窗


对时域信号采样实际上默认对原信号增加了矩形窗,但是矩形窗的旁瓣能量较高,因此在采样时长不是信号整数倍周期时频谱泄露的效应比较明显。为了降低频谱泄露对主频率的影响,可以通过加入各种窗口的方法抑制旁瓣能量,常用的窗口包括汉宁窗、哈明窗、布莱克曼窗等,这里以哈明窗为例展示加窗作用。可以看到相比原先存在频谱泄露的频谱,加窗以后频谱能量更加集中了。(比如看75Hz处的幅度,加窗之后明显比没加窗时幅度低)

代码:

%% 抑制频谱泄露——方案二:加窗抑制频谱泄露
f0 = 50; f1 = 65; fs = 500; T = 0.3;
S = @(t) cos(2*pi*f0.*t) + cos(2*pi*f1.*t);
t = 0:1/fs:T-1/fs;
y = S(t);w = hamming(fs * T);
y_hamm = y.*w.';nsamps = numel(y_hamm);
y_spec = fft(y_hamm);
y_spec = fftshift(y_spec)./nsamps;
f = ((0:nsamps-1)-nsamps/2)/T; figure(4);
subplot(2,1,1);plot(y_hamm,'linewidth',1.5); xlabel('time (s)'); ylabel('y');title('hamming窗');
subplot(2,1,2);plot(f, abs(y_spec),'linewidth',1.5); xlabel('frequency (Hz)'); ylabel('Amplitude');
axis([0,inf,0,inf]);

更加直观地理解加窗的作用,可以认为加窗后,强行将阶段信号两端的信号幅度收敛到了0附近,增加了延拓后信号在衔接处的连贯性。 比如原先没加窗的信号是这样的:


加入窗函数之后变成:

强行使得信号连接上,从而降低了阶段处非整数倍信号周期的影响。

栅栏效应——补零


我们注意到加窗后得到的频谱依然无法得到65Hz65Hz65Hz的频率分量。这是因为信号的采样时长为0.3s,因此物理分辨率是fs/N=1/T=3.333Hzf_s/N=1/T=3.333Hzfs​/N=1/T=3.333Hz。此时65Hz不是整数倍的分辨率,因此无法在频谱上体现出来。这就是栅栏效应,解决该问题的常用方法为时域补零。(注意:时域补零不会增加信号的物理分辨率,但是会增加信号的计算分辨率,信号的物理分辨率只和采样时长有关)我个人觉得这里可以理解为DFT是对DTFT频域上的采样,补零相当于增加了采样点,如果DTFT本身就无法将两个频率成分区别开的话,那么频域上插再多的值(时域上补再多的零)也没有用。这里我们知道两个信号之间的频差为15Hz,大于3.33Hz所以理论上可以在频谱上将两个频点区分开,但是由于采样点数的限制,65Hz落在了两个采样的频点之间,为了将65Hz的频率成分提取出来,这里可以进行补零操作。结果如下:


代码:

%% 出现了栅栏效应——补零
f0 = 50; f1 = 65; fs = 500; T = 0.3;
S = @(t) cos(2*pi*f0.*t) + cos(2*pi*f1.*t);
t = 0:1/fs:T-1/fs;
y = S(t);w = hamming(fs * T);
y_hamm = y.*w.';
y_hamm_add_0 = [y_hamm, zeros(1,fs*T/3)];nsamps = numel(y_hamm_add_0);
y_spec = fft(y_hamm_add_0);
y_spec = fftshift(y_spec)./nsamps;
f = ((0:nsamps-1)-nsamps/2)/T; figure(5);
subplot(2,1,1);plot(y_hamm_add_0,'linewidth',1.5); xlabel('time (s)'); ylabel('y');title('补零');
subplot(2,1,2);plot(f, abs(y_spec),'linewidth',1.5); xlabel('frequency (Hz)'); ylabel('Amplitude');
axis([0,inf,0,inf]);

通过在时域信号上补零,65Hz的频率成分被分辨出来了。但是这里依然存在频谱泄露。说明补零只能缓解栅栏效应,但是不能解决频谱泄露的问题。

栅栏效应和频谱泄露的关系


(这是我的猜测,如果有不对的地方,还望大佬纠正。)如果不考虑补0操作,那么栅栏效应一定会导致频谱泄露,反之也成立 证明:

设信号对应的角频率为ω0\omega_0ω0​,采样点数为NNN。那么当信号频率不是频率分辨率的整数倍时,会产生栅栏效应,此时可得
ω0≠k2πN\omega_0 \neq k\frac{2\pi}{N}ω0​​=kN2π​
由ω0=2πf0/fs\omega_0=2\pi f_0/f_sω0​=2πf0​/fs​可得
2πf0/fs≠k2πN2\pi f_0/f_s \neq k\frac{2\pi}{N}2πf0​/fs​​=kN2π​
fsf_sfs​为采样频率,f0f_0f0​为原信号频率

f0≠kfsNf_0 \neq k\frac{f_s}{N}f0​​=kNfs​​

TTT为采样时长,T0T_0T0​为原始信号周期
1T0≠k1T\frac{1}{T_0} \neq k\frac{1}{T}T0​1​​=kT1​
T≠kT0T \neq kT_0T​=kT0​

所以可得采样时长不是信号周期的整数倍,所以同样会产生频谱泄露,反之也成立。其中栅栏效应可通过补零的操作缓解,而频谱泄露可通过改变采样时长或者加窗缓解。

总而言之,两问题最根本的解决方法是改变采样时长,使得采样时长为整数倍信号周期,但是这在实际过程中常常难以实现,所以需要用加窗和补零的操作分别缓解频谱泄露和栅栏效应。

频谱泄露、栅栏效应、补零实验相关推荐

  1. 频谱泄露栅栏效应及其解决方法

    DFT中时域补零,频域对于单周期的FFT会更加细致,因为本来的DTFT就是对补零的部分取零的,补零反而能使DFT的采样更精细,何乐而不为呢?当然,补零对周期信号的DFT是一定存在影响的,毕竟周期变了. ...

  2. 图解DFT频谱分析及产生的问题(频谱混叠,频谱泄露,栅栏效应)

    具体步骤 频域和时域对应关系 频谱混叠 频谱泄露 栅栏效应 混叠现象 频谱泄露 栅栏效应 结合matlab对应分析 PDF版本笔记 参考南京信息工程大学的<数字信号处理>,仅作学习总结

  3. FFT频谱分析(补零、频谱泄露、栅栏效应、加窗、细化、频谱混叠、插值),Matlab、C语言代码

    文章目录 引言 Matlab FFT函数 频谱混叠 栅栏效应 细化技术 什么是细化技术? 细化FFT技术的应用: Zoom-FFT算法介绍及MATLAB实现 Zoom-FFT根本没有实现"细 ...

  4. 补零不能提高频率分辨率的原因

    离散傅里叶变换(DFT)的输入是一组离散的值,输出同样是一组离散的值,FFT是DFT的快速算法. 在输入信号而言,相邻两个采样点的间隔为采样时间Ts.在输出信号而言,相邻两个采样点的间隔为频率分辨率d ...

  5. 分析时域窗长度和FFT计算点数对频率分辨率和栅栏效应的影响

    目录 频率分辨率 栅栏效应 频谱泄漏 实验结果: 窗长度改变: 改变fft计算点数 分析: 代码: 频率分辨率 频率分辨率是指将两个相邻谱峰分开的能力.在实际应用中是指分辨两个不同频率信号的最小间隔. ...

  6. 栅栏效应、频谱泄露、细化技术

    fft在分析频谱分析的时候,会有下面四个方面的误差: (1)频谱混叠 奈奎斯特定理已被众所周知了,所以几乎所有人的都知道为了不让频谱混叠,理论上采样频谱大于等于信号的最高频率.那和时域上联系起来的关系 ...

  7. 数字信号处理的栅栏效应和时域补零

    根据我上篇转载的文章,我又继续翻了翻<数字信号处理>,对离散信号的DFT又有了进一步的了解.以前在考试后就把书本上的内容扔掉了,现在用到它的时候还得重新学习一遍.... 下面是数字信号处理 ...

  8. 栅栏效应,频谱泄露,旁瓣效应

    http://139791733.blog.163.com/blog/static/1786396420112715530734/ 栅栏效应: 对采样信号的频谱,为提高计算效率,通常采用FFT算法进行 ...

  9. FFT造成的频谱混叠,栅栏效应,频谱泄露,谱间干扰

    fft在分析频谱分析的时候,会有下面四个方面的误差: (1)频谱混叠: 奈奎斯特定理已被众所周知了,所以几乎所有人的都知道为了不让频谱混叠,理论上采样频谱大于 等于信号的最高频率.那和时域上联系起来的 ...

  10. FFT运算的加深理解——栅栏效应、补零、物理分辨率、计算分辨率

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 FFT运算的加深理解--栅栏效应.补零.物理分辨率.计算分辨率 栅栏效应和计算分辨率 物理分辨率 总结 栅栏效应和计算分辨率 栅栏效应 ...

最新文章

  1. 看动画轻松理解「链表」实现「LRU缓存淘汰算法」
  2. 12个现实世界中的机器学习真相
  3. 解决oracle11g的ORA-12505问题
  4. 蓝桥杯 如何计算 X^X = 10 来求X呢?
  5. idea工程本地依赖_IDEA最新版2020.1的maven工程本地依赖仓库无法使用问题(已解决)...
  6. css3动画animation,transition
  7. Spring Cloud Config 规范 1
  8. DaDa英语宣布12月31日起全面停止所有外教服务
  9. MATLAB编程与应用系列-第3章 矩阵运算(4)
  10. [MATLAB]设置坐标轴标签
  11. 2021牛客寒假算法基础集训营5,签到题BF
  12. Linux的安装和使用技巧
  13. 《Java就业培训教程》_张孝祥_书内源码_11
  14. 锐起无盘4.2服务器设置,锐起无盘4.5免费版
  15. Hexo博客与Next主题的高级应用
  16. 职业规划-三大职业生涯阶段
  17. phpcms php5.5,phpcms_v9.5.8_GBK源码下载
  18. 使用lio_sam建图,然后使用LIO-SAM_based_relocalization-master导航
  19. 外卖优惠券公众号怎么做回复小程序链接
  20. MATLAB彩色图像读写

热门文章

  1. 零基础转行网络安全可以做什么工作
  2. PFC离散元仿真核心技术与应用
  3. (最新)Win7安装配置IIS7.5详细图文教程 (一)
  4. JAVA打卡记录计算时间
  5. PS和AE、PR的区别是什么?
  6. IP地址及子网划分计算题
  7. CS 61A FALL 2020 Project-cats
  8. MATLAB----小波去噪
  9. 通用阿里云的短信验证码(详细)
  10. 经典python题目练习