在MatLab中FFT和IFFT的互相转换

    FFT变换是将信号从时域转换到频域,这样在时域复杂的信号转换到频域看起来就方便容易了很多。但有时候也需要将频域信号转换到时域,所以这时运用到IFFT变换。

    其实IFFT的计算原理之一就是将频域(注意频域是复数)数据进行取共轭复数(虚部取反),然后再进行FFT变换,这样便将频域信号转换到时域。因为FFT变换的结果是复数,所以从频域进行FFT变换过来的结果也是复数,而此时只需取复数的实部,便是原时域信号(同时此复数的虚部已经比非常小了,就省略不要了)。

    而MATLAB自带函数并没有说明IFFT的所以然,所以我进行对IFFT的验证。计算了MATLAB自带的IFFT函数和进行虚部取反再计算FFT。两种计算方式表明:结果相同。所以说IFFT的计算,其实跟FFT计算原理一样。

以下为MATLAB代码。这是第一篇博客,望多多指教。

MATLAB
%% 将正弦波做FFT计算,50%的重叠。验证IFFT的计算——对比自带函数IFFT函数,和对FFT结果取共轭,再进行FFT计算的区别。
clear;clf;
Fs=24000;t = 0:1/Fs:0.07;y=sin(200*2*pi*t+50);      % 24k采样率下,生成200Hz、0.07秒正弦波
i=(floor(length(y)/512)-1)*2;                       % 因为分帧计算,这里计算循环次数。因为要50%的重叠,所以需要乘以2
yfft=zeros(1,length(y));            % 初始化函数
yifft=zeros(1,length(y));           % 初始化函数
Windows=hamming(512);               % 取窗函数
for a =0:i
    StartPoint=1+256*a;            
    y0(1:512)=y(StartPoint:(StartPoint+512-1)); %取每次要处理的512个数据
    y0=y0.*Windows';                % 加窗
    TempData=fft(y0);               % 做FFT计算
    Yifft=ifft(TempData);           % MATLAB自带IFFT函数
    Yfft=conj(TempData);            % 取共轭复数
    Yfft=fft(Yfft);                 % 虚部取反做FFT计算
    Yfft=(real(Yfft)/512)*0.98;     % 取出实部,并对其除以N。乘以0.98为了做图进行对比
    yfft(StartPoint:StartPoint+512-1)=yfft(StartPoint:StartPoint+512-1)+Yfft;       %重组
    yifft(StartPoint:StartPoint+512-1)=yifft(StartPoint:StartPoint+512-1)+Yifft;    %重组
end
%% 作图
figure(1);
plot(y,'*');            hold on
plot(yfft,'r');         hold on ;
plot(yifft,'k');        grid on
legend('原信号时域','虚部取反做fft时域','Ifft时域');
xlabel('时域(t)');
ylabel('幅值');

 

作图截屏:

在MatLab中FFT和IFFT的互相转换_第1张图片

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

你可能感兴趣的:(MATLAB,FFT运算)