赞
踩
在上一篇博客中,介绍了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图
- clear;clc;clf;
- %% 参数
- Fs=24000;
- timeS = 0.2; %长度参数
- t1 = 0:1/Fs:timeS; %周期信号时间参数
- t = 0:1/Fs:timeS+0.002; %非周期信号时间参数
- plotX = 39; %作图参数
- plotY = 1700; %作图参数
-
- %% 周期性信号
- y1=sin(200*2*pi*t1); %24k采样率下,生成200Hz正弦波
- yfft1=fft(y1);
- yifft1=ifft(yfft1);
-
- %% 非周期性信号
- y=sin(200*2*pi*t+50); %24k采样率下,生成200Hz正弦波
- yfft=fft(y); %不加窗运算
- yifft=ifft(yfft);
-
- %% 非周期性信号加窗函数
- Windows=hanning(length(y));
- yWindows=y.*Windows'; %加窗运算
- yfftWindows=fft(yWindows);
- yifftWindows=ifft(yfftWindows);
- %% 作图
- figure(1);
- subplot(331);plot(y1);xlabel('周期性信号时域');
- subplot(334);plot(abs(yfft1));axis([plotX,plotX*1.2,-plotY,plotY*1.5]);xlabel('周期性信号频域');
- subplot(337);plot(real(yifft1));xlabel('IFFT信号时域');
- subplot(332);plot(y);xlabel('非周期性信号时域');
- subplot(335);plot(abs(yfft));axis([plotX,plotX*1.2,-plotY,plotY*1.5]);xlabel('非周期性信号频域');
- subplot(338);plot(real(yifft));xlabel('IFFT信号时域');
- subplot(333);plot(yWindows);xlabel('加窗函数信号时域');
- subplot(336);plot(abs(yfftWindows));axis([plotX,plotX*1.2,-plotY,plotY*1.5]);xlabel('加窗函数信号频域');
- subplot(339);plot(real(yifftWindows));xlabel('IFFT信号时域');
- figure(2);
- plot(abs(yfft),'r');hold on
- yfftWindows = yfftWindows*(max(abs(yfft))/max(abs(yfftWindows))); %把最大值转换成一样,方便作图对比查看
- plot(abs(yfftWindows),'b');axis([plotX,plotX*1.2,-plotY*0.5,plotY*1.8]);grid on
- xlabel('非周期性信号加窗函数和不加窗函数时域对比');
- legend('不加窗函数','加窗函数');
- %% 使用不同窗函数效果
- WindowsHanning=hanning(length(y));
- WindowsHamming=hamming(length(y));
- WindowsTri=triang(length(y));
- yW1=y.*WindowsHanning'; %加窗运算
- yW1=fft(yW1);
- yW2=y.*WindowsHamming'; %加窗运算
- yW2=fft(yW2);
- yW3=y.*WindowsTri'; %加窗运算
- yW3=fft(yW3);
-
- figure(3);
- plot(abs(yfft),'b');hold on;
- plot(abs(yW1),'k');hold on;
- plot(abs(yW2),'r');hold on;
- plot(abs(yW3),'g');axis([plotX*0.95,plotX*1.2,-plotY*0.05,plotY*1.1]);grid on
- xlabel('不同窗函数的对比');
- legend('不加窗函数','汉宁窗','海明窗','三角窗');
-
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。