• 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 : )










  • 相关阅读:
    web总结
    工作总结
    python积累
    学习地图
    position:absolute绝对定位解读
    利用C++ RAII技术自动回收堆内存
    C++封装常用对象和对头文件探索
    String.split()方法你可能不知道的一面
    动态内存分配(new)和释放(delete)
    C#实现的异步Socket服务器
  • 原文地址:https://www.cnblogs.com/blfbuaa/p/6860681.html
Copyright © 2020-2023  润新知