matlab 倒位序fft程序,快速傅里叶变换的c程序实现思路分析matlab仿真.docx

41528d3028836879cd698677c3999917.gif快速傅里叶变换的c程序实现思路分析matlab仿真.docx

现代通信原理设计报告快速傅里叶变换的C程序实现思路分析MATLAB仿真组长孙建东组员赵玉兰2013年12月8号快速傅里叶变换的C程序实现思路分析MATLAB仿真一、设计目的快速傅里叶变换在频谱分析、信号处理方面应用十分广泛,在实际实现中常使用DSP器件作为硬件平台,利用C程序设计实现的信号的快速傅里叶变换,并在频域中完成对信号的处理。故如何实现用C程序实现快速傅里叶变换(FFT)便成为了十分重要的任务。该次仿真设计以MATLAB为软件仿真平台用C语言的编程思路来编写MATLAB程序完成任意点数的FFT运算,并通过编写相应的仿真测试文件,通过调用MATLAB内部自带的FFT与调用自带的FFT进行对比,验证该FFT的C程序设计思路思路是否正确。二、FFT的基本原理FFT是一种DFT的高效算法,称为快速傅立叶变换(FASTFOURIERTRANS)。FFT算法可分为按时间抽取算法和按频率抽取算法,简要介绍FFT的基本原理。从DFT运算开始,说明FFT的基本原理。DFT的运算为1式中由这种方法计算DFT对于X(K)的每个K值,需要进行4N次实数相乘和(4N2)次相加,对于N个K值,共需NN乘和N(4N2)次实数相加。改进DFT算法,减小它的运算量,利用DFT中的周期性和对称性,使整个DFT的计算变成一系列迭代运算,可大幅度提高运算过程和运算量,这就是FFT的基本思想。FFT基本上可分为两类,时间抽取法和频率抽取法,而一般的时间抽取法和频率抽取法只能处理长度N2M的情况,另外还有组合数基四FFT来处理一般长度的FFT基于时间抽取的FFT算法设N点序列XN,,将XN按奇偶分组,公式如下图改写为一个N点DFT分解为两个N/2点的DFT,继续分解,迭代下去,其运算量约为1其算法有如下规律两个4点组成的8点DFT蝶形算法四个2点组成的8点DFT按时间抽取的8点DFT原位计算当数据输入到存储器中以后,每一级运算的结果仍然储存在同一组存储器中,直到最后输出,中间无需其它存储器序数重排对按时间抽取FFT的原位运算结构,当运算完毕时,这种结构存储单元A1、A2,,A8中正好顺序存放着X0,X1,X2,,X7,因此可直接按顺序输出,但这种原位运算的输入XN却不能按这种自然顺序存入存储单元中,而是按X0,X4,X2,X6,,X7的顺序存入存储单元,这种顺序看起来相当杂乱,然而它也是有规律的。当用二进制表示这个顺序时,它正好是“码位倒置”的顺序。蝶形类型随迭代次数成倍增加每次迭代的蝶形类型比上一次蝶代增加一倍,数据点间隔也增大一倍三、基于时间抽取的设计思路通过对上述思路的进一步研究发现,FFT的每级蝶形运算都是有规律可循的接下来我们便探究FFT的规律;1、倒位序算法设计在FFT的基于时间抽取的算法中,输入序列必须按倒位序进行重排对于8点输入序列XN输入原始序列下标号二进制重排后序列下标号二进制X0000X0000X1001X4100X2010X2010X3011X6110X4100X1001X5101X5101X6110X3110X7111X7111由上面的序列重排我们发现重排的序列与原始序列只是在脚标上按其二进制的顺序高低位进行了交换一次实现倒排;便实现倒位序的算法,只需将每个元素的组号转换成二进制按倒序排列后,再把倒序好的二进制转化成十进制作为元素的组号,并把对应原始数组存入该数组的元素中,程序实现见程序五2、蝶形运算中旋转因子的规律每级旋转因子及其个数第M级个数旋转因子XN序列中X1N与X2N的间隔N8120𝑊0𝑁20221𝑊0𝑁𝑊2𝑁21322𝑊0𝑁𝑊1𝑁𝑊2𝑁𝑊3𝑁22N16120𝑊0𝑁20221𝑊0𝑁𝑊4𝑁21322𝑊0𝑁𝑊2𝑁𝑊4𝑁𝑊6𝑁22423𝑊0𝑁𝑊1𝑁𝑊3𝑁𝑊4𝑁𝑊7𝑁21N点120𝑊0∗2𝑀‒1𝑁20221𝑊0∗2𝑀‒2𝑁𝑊1∗2𝑀‒2𝑁213K0,1,2,322𝑊0∗2𝑀‒3𝑁𝑊𝑘∗2𝑀‒3𝑁22KK0,1,,2𝑘‒1𝑊0∗2𝑀‒𝑘𝑁𝑊𝑘∗2𝑀‒𝑘𝑁2𝑘‒12𝑘‒1MK0,1,2,3,,2𝑀‒1𝑊0∗20𝑁𝑊𝑘∗20𝑁2𝑀‒1‒12𝑀‒1由上述的规律可得,第一级蝶形运算旋转因子只有一个,原因是重排后两点相距为1,故旋转因子只有一个,以后每级旋转因子随级数的变化按上表的规律变化3、每级蝶形运算序列的原位运算规律第1级第2级第3级第4级0102040823131519454626210675737311898108124121011911913513121312141014614141513151115715我们尝试用一个通项公式表示出这张表中所有的排列定义I蝶形运算的级数A序列所分的组数;K每组中元素的个数第1级I0;A8;K0;第2级I1A4K0,1第3级I2A2K0,1,2,3第4级I3A0K0,1,2,3,4,5,6,7X1N的通项公式为X1NAK,X2N的通项公式X2NA1K2𝑖2𝑖且A满足AA2;验证当A4;I1K0,1{X1N,X2N}{0,2,1,3,4,6,5,7,8,10,9,11,12,14,13,15}对于N点M级的蝶形运算;则I1,2,,M1K1而每级只有N/2个蝶形运算则A的最大取值就随每级K的取值2𝑖而定有了以上的FFT运算规律的分析便能轻易的实现FFT的算法的设计了。四、用MATLAB模拟C程序设计思路编程实现实现该FFT设计的MATLAB程序文件如下程序一完成乘方运算自定义函数名称JIECHENG完成乘方运算N是底数M是指数FUNCTIONYJIECHENGN,MTEMP1存储累乘的结果FORI1M完成M次累乘运算TEMPTEMPN实现NM的运算ENDYTEMP输出乘方的结果END程序二完成复数的加减运算自定义函数名称FUJIA完成复数加法X1,X2是参与蝶形运算的复数点,K判断复数运算是加还是减FUNCTIONYFUJIAX1,X2,KIFK0K0进行复数加运算Y1,1X11,1X21,1实部加法运算Y2,1X12,1X22,1虚部加法运算ELSEIFK1K1进行复数加法运算Y1,1X11,1X21,1完成实部的加法运算Y2,1X12,1X22,1完成虚部的加法运算ENDEND程序三完成复数的乘法运算自定义FUCHENG完成复数乘法ABJCDJACBDADBCJX是输入序列得点W是参与运算旋转因子FUNCTIONYFUCHENGX,WY1,1X1,1W1,1X2,1W2,1完成实部的乘法运算Y2,1X2,1W1,1W2,1X1,1完成虚部的乘法运算END程序四完成一个蝶形运算自定义函数名称DIEXING完成一个蝶形单元的运算X1,X2参与蝶形运算的输入序列,W参与蝶形运算的旋转因子FUNCTIONX1,X2DIEXINGX1,X2,W因为蝶形运算是满足原位运算所以必须将X1,X2W的保存到暂存变量中TEMPX1X1暂存到TEMP中TEMP1FUCHENGX2,W将X2与W的复数乘积保存到TEMP1中X1FUJIATEMP,TEMP1,0完成X1的原位运算X2FUJIATEMP,TEMP1,1完成X2的原

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值