IFFT 的实现

IFFT 的实现

               前些天给出了FFT的实现,如今给出IFFT(inverse FFT)的实现





基于IFFT 算法。对FFT的核心程序稍作改动就可以 : )


%%***************************************************************************************
% code writer 	: EOF
% code date     : 2014.09.17
% e-mail 	      : jasonleaster@gmail.com
% code file	    : IFFT_EOF.m
% Version       : 1.0
%
% code purpose :
% 
%       	It's time to finish my demo for DFT. I would like to share my code with
% someone who is interesting in DSP. If there is something wrong with my code,
%	please touche me by e-mail. Thank you!
%
%%***************************************************************************************

clear all;

%*************************************************
% The number of all the signal that our sensor got
%*************************************************
TotalSample = 8;

% We assume that the preiod of the signal we generated is 'circle';
circle = TotalSample/2;

%**************************************************************
%       This varible is used for recording the signal which 
%  were processed by inverse-DFT in time domain
%**************************************************************
SignalInT = zeros(TotalSample,1);

SignalInT_reversed = zeros(TotalSample,1);
%This varible is used for recording the signal which were processed by inverse-DFT in time domain

OutPutSignal = zeros(TotalSample,1);

OriginalSignal = zeros(TotalSample,1);
%This varible is used for recording the original signal that we got.

%% initialize a square wave
for SampleNumber = -(TotalSample/2):(TotalSample/2)-1

    if (mod(abs(SampleNumber),circle) < (circle/2))&&(SampleNumber>0)

        OriginalSignal((TotalSample/2)+1+SampleNumber) = 5;

    elseif (mod(abs(SampleNumber),circle) >= (circle/2))&&(SampleNumber>0)

        OriginalSignal((TotalSample/2)+1+SampleNumber) = 0;

    elseif (mod(abs(SampleNumber),circle) < (circle/2))&&(SampleNumber<0)

        OriginalSignal((TotalSample/2)+1+SampleNumber) = 0;   

    elseif (mod(abs(SampleNumber),circle) >= (circle/2))&&(SampleNumber<0)

        OriginalSignal((TotalSample/2)+1+SampleNumber) = 5;
    end
end

InPutSignal = fft(OriginalSignal); % for testing

TotalSample = size(InPutSignal,1);

OutPutSignal_to_time = zeros(TotalSample,1);

tmp = TotalSample - 1;

%%***********************************************************************
% @Bits : describe how many bits should be used to make up the TotalSample
%%*********************************************************************** 
Bits = 0;

while	tmp > 0

    %%  floor (X) Return the largest integer not greater than X.
    tmp = floor(tmp/2);

    Bits = Bits + 1;	
end

%*******************************************************************
%                |         |        |        |
%   input X(n)   | layer 3 |layer 2 |layer 1 | x(n) output
%                |         |        |        |      
%                
%
%            @layyer      :  the number of layyer
%            @SampleNumber:  the start number of point which 
%                            is going to do butter-fly operation.
%            @pre_half    :  the pre_half point of current butter-fly
%***********************************************************************
for  layyer = Bits:-1:1
      
      for SampleNumber = 1 : 2^(layyer) : TotalSample
      
            for  pre_half = SampleNumber:(SampleNumber+2^(layyer-1) -1)
                          
                 r = -get_r_in_Wn(pre_half-1,layyer,TotalSample,Bits);
                 
                 W_rN = exp(-2*pi*j*(r)/TotalSample) ;
                 
                 OutPutSignal_to_time(pre_half) = ...
                 0.5*(InPutSignal(pre_half) +  ...
                 InPutSignal(pre_half + 2^(layyer-1)));
               
                 OutPutSignal_to_time(pre_half  + 2^(layyer-1)) =  ...
                 0.5*W_rN *(InPutSignal(pre_half) -  ...
                 InPutSignal(pre_half + 2^(layyer-1)));

           end          
      end
      
      InPutSignal = OutPutSignal_to_time;
end

%******************************************
%   Reverse the bits of output number
%******************************************
for SampleNumber = 1 : TotalSample
    
    ret	 = bit_reverse(SampleNumber - 1,Bits);
    
    OutPutSignal_to_time(SampleNumber) = InPutSignal(ret+1);
end

对照原始时间领域的输入信号和最后IFFT的输出信号,一致。于是IFFT实现成功 




以后给出对应版本号的C 语言实现 

wait for update : )










原文地址:https://www.cnblogs.com/blfbuaa/p/6860681.html