fft 1k点 c语言,自数字信号处理实验fft快速傅里叶变换c语言 .docx

数字信号处理实验(第八章 FFT)

一、实验内容针对典型序列,用C语言编程实现基2-FFT,并与MATLAB自带的FFT函数的计算结果进行比较。二、实验工具1.VC++6.02.matlab2012三、实验涉及知识

图1

按时间抽选的基2—FFT算法 根据蝶形运算图,如图1,可以看出,一个2n点基2-FFT运算由n级蝶形运算构成,每一个蝶形结构完成下属基本迭代运算:Xmk=Xm-1k+Xm-1jWNr Xmj=Xm-1k-Xm-1jWNr 式中m表示第m列迭代,k,j为数据所在行数。上式的蝶形运算如图2所示。

图2

四、实验设计思路首先,根据基2-FFT的算法特点,可以整理出程序设计的大致思路。基2-FFT主要运用的就是蝶形运算来降低进行DFT运算时的运算量。因为是基2,所以进行DFT计算的点数N必须的2n。程序设计中主要解决3个问题,变址运算,复数运算,节点距离运算,及旋转因子的计算。下面对这三个模块进行说明。变址运算由蝶形图我们可以看出,FFT的输出X(k)是按正常顺序排列在存储单元中,即按X(0),X(1),…,X(7)的顺序排列,但是这时输入x(n)却不是按自然顺序存储的,而是按x(0),x(4),…,x(7)的顺序存入存储单元,所以我们要对输入的按正常顺序排列的数据进行变址存储,最后才能得到输出的有序的X(K)。通过观察,可以发现,如果说输出数据是按原位序排列的话,那么输入数据是按倒位序排列的。即如果输入序列的序列号用二进制数n2n1n0,则到位序就为n0n1n2。我们需将输入的数据变为输出的倒位序存储,这里用雷德算法来实现。下面给出雷德算法。假如使用A[I]存的是顺序位序,而B[J]存的是倒位序。    例如   N = 8 的时候,倒位序 顺序          二进制表示      倒位序 顺序0  0                                       000         0004 1                                       100         0012 2                                       010         010           6 3                                       110         0111 4                                       001         1005  5                                       101         1013  6                                       011         1107  7                                       111         111

由上面的表可以看出,按自然顺序排列的二进制数,其下面一个数总是比其上面一个数大1,即下面一个数是上面一个数在最低位加1并向高位进位而得到的。而倒位序二进制数的下面一个数是上面一个数在最高位加1并由高位向低位进位而得到。I、J都是从0开始,若已知某个倒位序J,要求下一个倒位序数,则应先判断J的最高位是否为0,这可与k=N/2相比较,因为N/2总是等于100..的。如果k>J,则J的最高位为0,只要把该位变为1(J与k=N/2相加即可),就得到下一个倒位序数;如果K<=J,则J的最高位为1,可将最高位变为0(J与k=N/2相减即可)。然后还需判断次高位,这可与k=N\4相比较,若次高位为0,则需将它变为1(加N\4即可)其他位不变,既得到下一个倒位序数;若次高位是1,则需将它也变为0。然后再判断下一位。

复数运算由于每一个蝶形结构完成的迭代运算为 Xmk=Xm-1k+Xm-1jWNr Xmj=Xm-1k-Xm-1jWNr 算式中涉及到了复数的运算,而计算机是不能自己实现复数运算的,所以需要我们自己设计进行复数运算的程序。迭代运算式中,WNr= c

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值