IFFT 的实现

IFFT 的实现

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

基于IFFT 算法,对FFT的核心程序稍作修改即可 : )

%%***************************************************************************************
% code writer 	: EOF
% code date     : 2014.09.17
% e-mail 	      : [email protected]
% 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 : )

时间: 2024-10-10 06:50:17

IFFT 的实现的相关文章

二维FFT,IFFT,c语言实现

学习DIP第6天 网上关于FFT的实例有很多,具体也可以参照上一篇,其实Matlab,OpenCV都可以很轻松的实现相关操作,但是对于学习其原理,还是自己操作下比较好. 二维FFT的是实现方法是先对行做FFT将结果放回该行,然后再对列做FFT结果放在该列,计算完所有的列以后,结果就是响应的二维FFT. 本次所有操作都是对基2的数据进行的操作. 二维IFFT网上很少见到,操作过程是:上述的傅里叶变换结果,先对每行做一维IFFT,结果放在该行,对偶数列取其共轭,然后再按照每列做一维IFFT,其结果放

用于ARM上的FFT与IFFT源代码-C语言

/********************************************************************************* 程序名称:快速傅里叶变换(FFT) ** 程序描述:本程序实现快速傅里叶变换 ** 程序作者:宋元瑞 ** 最后修改:2011年4月5日 *******************************************************************************/#include <stdio.h>

Python语言学习笔记

获得人生中的成功需要的专注与坚持不懈多过天才与机会.  ——C.W. Wendte Python将很快成为你最喜欢的编程语言! Qt库?  PyQt  Perl-Qt 简单易学,功能强大,高效率的高层数据结构,简单而有效地实现面向对象编程. Python简洁的语法和对动态输入的支持,再加上解释性语言的本质,使得它在大多数平台上的许多领域都是一个理想的脚本语言,特别适用于快速的应用程序开发. 注重的是如何解决问题而不是编程语言的语法和结构. wxPython,Twisted,Boa Constru

SciPy 基础

SciPy以NumPy为基础,提供了应用更加广泛的科学计算工具. 其在以下方面有着优秀的函数库: 1.线性代数 2.数值积分 3.插值 4.优化 5.随机数生成 6.信号处理 7.其他 与NumPy一样,SciPy有着稳定,成熟,且应用广泛的数值运算库. 许多SciPy函数仅仅是给诸如LAPACK,BLAS这样的Fortran数值计算工业标准库提供了接口. 在本文中,我们仅仅讨论一些常用的函数和特性,不做深入讨论. 一·SciPy与NumPy 由于SciPy以NumPy为基础,那么import

自适应滤波——第二章:维纳滤波器(1)

作者:桂. 时间:2017-03-23  06:28:45 链接:http://www.cnblogs.com/xingshansi/p/6603263.html 声明:欢迎被转载,不过记得注明出处哦~ 前言 仍然是西蒙.赫金的<自适应滤波器原理>第四版,距离上次看这本书已经过去半个月,要抓点紧了.本文主要包括: 1)何为维纳滤波器(Wiener Filter); 2)Wiener滤波器的推导: 内容为自己的学习总结,内容多有参考他人,最后一并给出链接. 一.维纳滤波器简介 A-基本概念 对于

BZOJ 2179 FFT快速傅立叶 ——FFT

[题目分析] 快速傅里叶变换用于高精度乘法. 其实本质就是循环卷积的计算,也就是多项式的乘法. 两次蝴蝶变换. 二进制取反化递归为迭代. 单位根的巧妙取值,是的复杂度成为了nlogn 范德蒙矩阵计算逆矩阵又减轻了拉格朗日插值法的复杂度. 十分神奇. [代码] #include <cstdio> #include <cstring> #include <cstdlib> #include <cmath> #include <set> #includ

hihocoder 1388 Periodic Signal

Periodic Signal 时间限制:5000ms 单点时限:5000ms 内存限制:256MB Description Profess X is an expert in signal processing. He has a device which can send a particular 1 second signal repeatedly. The signal is A0 ... An-1 under n Hz sampling. One day, the device fel

ACM学习历程—51NOD1028 大数乘法V2(FFT)

题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1028 题目大意就是求两个大数的乘法. 但是用普通的大数乘法,这个长度的大数肯定不行. 大数可以表示点值表示法,然后卷积乘法就能用FFT加速运算了. 这道题是来存模板的. 代码: #include <iostream> #include <cstdio> #include <cstdlib> #include <cmath>

梅尔频率倒谱系数(MFCC) 学习笔记

最近学习音乐自动标注的过程中,看到了有关使用MFCC提取音频特征的内容,特地在网上找到资料,学习了一下相关内容.此笔记大部分内容摘自博文 http://blog.csdn.net/zouxy09/article/details/9156785 有小部分标注和批改时我自己加上的,以便今后查阅. 语音信号处理之(四)梅尔频率倒谱系数(MFCC) [email protected] http://blog.csdn.net/zouxy09 在任意一个Automatic speech recogniti