当前位置:   article > 正文

Matlab中FFT运算加窗函数的验证_matlab fft加窗

matlab fft加窗

在上一篇博客中,介绍了MATLAB中的IFFT和虚部取反后的FFT的验证,结果表明是一致的。

https://blog.csdn.net/weixin_42316458/article/details/80462145#comments_13197383

有人提问:“做了逆变换之后为啥头部和尾部的信号和原始信号不一致了啊?能否通过某种方式恢复呢”

通过图形可以看出,在“IFFT时域”和“虚部取反做FFT时域”,结果是一致的。同时也看出,在头部和尾部与“原信号”均有差异。原因是加了窗函数的原因。而加窗函数的原因,是为了减少泄露。

泄露的产生

因为对于傅里叶变化运算的前提是:信号是周期性的信号。如果是周期性信号,则FFT后的模值更加聚集在一起,而如果是非周期性信号,则频域模值会分散。如下图所示:

加窗函数的目的

在实操中,也只有加窗函数,把头部和尾部都通过乘以系数衰减,这样才能把信号认为是周期信号。(比如上图红线和黑线,在时域上再复制一个它,依然是连接起来的)。

如果不加窗函数,那么就会造成泄漏。关于泄漏,可以理解为是由于信号不是周期性信号,在FFT后,由于头部和尾部的原因,造成结果在模值上看有一些其他成分。具体可看下图:

如果不加窗函数,FFT的结果就是在周围也会存在其他频率(上图红线)。而可以通过增加窗函数,使频率更加聚集(上图蓝线)。

窗函数类型

窗函数有:矩形窗,三角形窗,汉宁窗(Hanning),海明窗(Hamming),布莱克曼窗(Blackman)……等,每个都有各自的特性。上一篇博客中,我使用汉宁窗hanning。档使用矩形窗函数时,相当于是没有加窗,这样可以验证不加窗函数的结果。以下图片是针对一正弦波加不同窗函数结果。

以下MATLAB程序在2016a版上运行,可直接生成以上3图

  1. clear;clc;clf;
  2. %% 参数
  3. Fs=24000;
  4. timeS = 0.2; %长度参数
  5. t1 = 0:1/Fs:timeS; %周期信号时间参数
  6. t = 0:1/Fs:timeS+0.002; %非周期信号时间参数
  7. plotX = 39; %作图参数
  8. plotY = 1700; %作图参数
  9. %% 周期性信号
  10. y1=sin(200*2*pi*t1); %24k采样率下,生成200Hz正弦波
  11. yfft1=fft(y1);
  12. yifft1=ifft(yfft1);
  13. %% 非周期性信号
  14. y=sin(200*2*pi*t+50); %24k采样率下,生成200Hz正弦波
  15. yfft=fft(y); %不加窗运算
  16. yifft=ifft(yfft);
  17. %% 非周期性信号加窗函数
  18. Windows=hanning(length(y));
  19. yWindows=y.*Windows'; %加窗运算
  20. yfftWindows=fft(yWindows);
  21. yifftWindows=ifft(yfftWindows);
  22. %% 作图
  23. figure(1);
  24. subplot(331);plot(y1);xlabel('周期性信号时域');
  25. subplot(334);plot(abs(yfft1));axis([plotX,plotX*1.2,-plotY,plotY*1.5]);xlabel('周期性信号频域');
  26. subplot(337);plot(real(yifft1));xlabel('IFFT信号时域');
  27. subplot(332);plot(y);xlabel('非周期性信号时域');
  28. subplot(335);plot(abs(yfft));axis([plotX,plotX*1.2,-plotY,plotY*1.5]);xlabel('非周期性信号频域');
  29. subplot(338);plot(real(yifft));xlabel('IFFT信号时域');
  30. subplot(333);plot(yWindows);xlabel('加窗函数信号时域');
  31. subplot(336);plot(abs(yfftWindows));axis([plotX,plotX*1.2,-plotY,plotY*1.5]);xlabel('加窗函数信号频域');
  32. subplot(339);plot(real(yifftWindows));xlabel('IFFT信号时域');
  33. figure(2);
  34. plot(abs(yfft),'r');hold on
  35. yfftWindows = yfftWindows*(max(abs(yfft))/max(abs(yfftWindows))); %把最大值转换成一样,方便作图对比查看
  36. plot(abs(yfftWindows),'b');axis([plotX,plotX*1.2,-plotY*0.5,plotY*1.8]);grid on
  37. xlabel('非周期性信号加窗函数和不加窗函数时域对比');
  38. legend('不加窗函数','加窗函数');
  39. %% 使用不同窗函数效果
  40. WindowsHanning=hanning(length(y));
  41. WindowsHamming=hamming(length(y));
  42. WindowsTri=triang(length(y));
  43. yW1=y.*WindowsHanning'; %加窗运算
  44. yW1=fft(yW1);
  45. yW2=y.*WindowsHamming'; %加窗运算
  46. yW2=fft(yW2);
  47. yW3=y.*WindowsTri'; %加窗运算
  48. yW3=fft(yW3);
  49. figure(3);
  50. plot(abs(yfft),'b');hold on;
  51. plot(abs(yW1),'k');hold on;
  52. plot(abs(yW2),'r');hold on;
  53. plot(abs(yW3),'g');axis([plotX*0.95,plotX*1.2,-plotY*0.05,plotY*1.1]);grid on
  54. xlabel('不同窗函数的对比');
  55. legend('不加窗函数','汉宁窗','海明窗','三角窗');

本人新建了个QQ群,如想进一步沟通可添加:947187213。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/287734
推荐阅读
相关标签
  

闽ICP备14008679号