#define"> #define" />
欢迎来到天天文库
浏览记录
ID:62029304
大小:70.58 KB
页数:5页
时间:2021-04-15
《实验三 快速傅里叶算法(FFT)实验----实验箱C语言程序注释.docx》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、实验三快速傅里叶算法(FFT)实验----实验箱C语言程序注释#include"myapp.h"#include"ICETEK-VC5509-EDU.h"#include"scancode.h"#include#definePI3.1415926#defineSAMPLENUMBER128voidInitForFFT();/*蝶形算子乘数(也称旋转因子)exp(-j*2*PI*i/N)初始化;方便调用*/voidMakeWave(); /*该函数能产生各种各样的谐波*/intINPUT[SAMPLENUMBER],DATA[SAMPLENUMBE
2、R];floatfWaveR[SAMPLENUMBER],fWaveI[SAMPLENUMBER],w[SAMPLENUMBER];floatcos_tab[SAMPLENUMBER],sin_tab[SAMPLENUMBER];main(){inti;InitForFFT();/*蝶形算子中的乘数(也称旋转因子)exp(-j*2*PI*i/N)事先初始化好,方便调用*/MakeWave();/*该函数能产生各种各样的谐波*/for(i=0;i3、,INPUT也是输入信号的实数部分fWaveR,序列fWaveR作为FFT()函数的实参,对应FFT()函数的第1个形参dataR:也对应信号流图的输入输出的实数部分dataR*/fWaveI[i]=0.0f;/*因输入时间序列信号INPUT为实数序列信号,所以输入信号的虚数部分fWaveI=0,序列fWaveI作为FFT()函数的实参,对应FFT()函数的第2个形参dataI:也对应信号流图蝶形算子的输入输出的虚数部分dataI*/w[i]=0.0f;/*初始化输入信号波形的频谱值为0*/}FFT(fWaveR,fWaveI);/*对输入波形进行FFT变换,FF4、T算法采用同址运算,实参fWaveR,fWaveI既是信号流图第一级的输入信号,也作为信号流图每级蝶形算子的输出的存储数组,也是每级蝶形算子的输入数组,即可递推下去*/for(i=0;i5、的实数部分dataR[],此时实部dataR[]是实数,虚部dataI[]=0),*dataR[],dataI[]又作为信号流图中每级FFT蝶形算子的输出的存储数组单元,每级的输出是复数,此时虚部就可能不是0,*因输入信号的虚部dataI[]=0,在计算每级蝶形算子的输出前,dataI[]又用来暂存将输入信号序列进行序号码位倒置后的重新排列的数据,将序号码位倒置后的重排数据传给dataR[]后,再恢复dataI[]=0*/voidFFT(floatdataR[SAMPLENUMBER],floatdataI[SAMPLENUMBER]){/*原程序是128点的FF6、T算法(可改成256点或其他值),采用时间抽取DIT的FFT算法,对应算法信号流图的输入信号时间序列序号按码位倒置顺序排列,输出频域序列顺序排列。*/intx0,x1,x2,x3,x4,x5,x6,xx;/*二进制序号值(x6x5x4x3x2x1x0)的各个位*/inti,j,k,b,p,L;floatTR,TI,temp;/**********followingcodeinvertsequence*****下面进行时间序列序号的码位倒置,二进制序号值(x6x5x4x3x2x1x0)的各个位独立出来再反向*******/for(i=0;i7、;i++){x0=x1=x2=x3=x4=x5=x6=0;//128点FFT序号值用7位二进制(x6x5x4x3x2x1x0)表示,x0=i&0x01;x1=(i/2)&0x01;x2=(i/4)&0x01;x3=(i/8)&0x01;x4=(i/16)&0x01;x5=(i/32)&0x01;x6=(i/64)&0x01;/*/号代表除,可用右移实现*///提取128点输入信号序列的原顺序排列的序号(即算法信号流图上从上向下按顺序排列的位置序号)i对应的7位二进制数(b6b5b4b3b2b1b0)每位的值(x6x5x4x3x2x1x0)xx=x0*64+x1*38、2+x2*
3、,INPUT也是输入信号的实数部分fWaveR,序列fWaveR作为FFT()函数的实参,对应FFT()函数的第1个形参dataR:也对应信号流图的输入输出的实数部分dataR*/fWaveI[i]=0.0f;/*因输入时间序列信号INPUT为实数序列信号,所以输入信号的虚数部分fWaveI=0,序列fWaveI作为FFT()函数的实参,对应FFT()函数的第2个形参dataI:也对应信号流图蝶形算子的输入输出的虚数部分dataI*/w[i]=0.0f;/*初始化输入信号波形的频谱值为0*/}FFT(fWaveR,fWaveI);/*对输入波形进行FFT变换,FF
4、T算法采用同址运算,实参fWaveR,fWaveI既是信号流图第一级的输入信号,也作为信号流图每级蝶形算子的输出的存储数组,也是每级蝶形算子的输入数组,即可递推下去*/for(i=0;i5、的实数部分dataR[],此时实部dataR[]是实数,虚部dataI[]=0),*dataR[],dataI[]又作为信号流图中每级FFT蝶形算子的输出的存储数组单元,每级的输出是复数,此时虚部就可能不是0,*因输入信号的虚部dataI[]=0,在计算每级蝶形算子的输出前,dataI[]又用来暂存将输入信号序列进行序号码位倒置后的重新排列的数据,将序号码位倒置后的重排数据传给dataR[]后,再恢复dataI[]=0*/voidFFT(floatdataR[SAMPLENUMBER],floatdataI[SAMPLENUMBER]){/*原程序是128点的FF6、T算法(可改成256点或其他值),采用时间抽取DIT的FFT算法,对应算法信号流图的输入信号时间序列序号按码位倒置顺序排列,输出频域序列顺序排列。*/intx0,x1,x2,x3,x4,x5,x6,xx;/*二进制序号值(x6x5x4x3x2x1x0)的各个位*/inti,j,k,b,p,L;floatTR,TI,temp;/**********followingcodeinvertsequence*****下面进行时间序列序号的码位倒置,二进制序号值(x6x5x4x3x2x1x0)的各个位独立出来再反向*******/for(i=0;i7、;i++){x0=x1=x2=x3=x4=x5=x6=0;//128点FFT序号值用7位二进制(x6x5x4x3x2x1x0)表示,x0=i&0x01;x1=(i/2)&0x01;x2=(i/4)&0x01;x3=(i/8)&0x01;x4=(i/16)&0x01;x5=(i/32)&0x01;x6=(i/64)&0x01;/*/号代表除,可用右移实现*///提取128点输入信号序列的原顺序排列的序号(即算法信号流图上从上向下按顺序排列的位置序号)i对应的7位二进制数(b6b5b4b3b2b1b0)每位的值(x6x5x4x3x2x1x0)xx=x0*64+x1*38、2+x2*
5、的实数部分dataR[],此时实部dataR[]是实数,虚部dataI[]=0),*dataR[],dataI[]又作为信号流图中每级FFT蝶形算子的输出的存储数组单元,每级的输出是复数,此时虚部就可能不是0,*因输入信号的虚部dataI[]=0,在计算每级蝶形算子的输出前,dataI[]又用来暂存将输入信号序列进行序号码位倒置后的重新排列的数据,将序号码位倒置后的重排数据传给dataR[]后,再恢复dataI[]=0*/voidFFT(floatdataR[SAMPLENUMBER],floatdataI[SAMPLENUMBER]){/*原程序是128点的FF
6、T算法(可改成256点或其他值),采用时间抽取DIT的FFT算法,对应算法信号流图的输入信号时间序列序号按码位倒置顺序排列,输出频域序列顺序排列。*/intx0,x1,x2,x3,x4,x5,x6,xx;/*二进制序号值(x6x5x4x3x2x1x0)的各个位*/inti,j,k,b,p,L;floatTR,TI,temp;/**********followingcodeinvertsequence*****下面进行时间序列序号的码位倒置,二进制序号值(x6x5x4x3x2x1x0)的各个位独立出来再反向*******/for(i=0;i7、;i++){x0=x1=x2=x3=x4=x5=x6=0;//128点FFT序号值用7位二进制(x6x5x4x3x2x1x0)表示,x0=i&0x01;x1=(i/2)&0x01;x2=(i/4)&0x01;x3=(i/8)&0x01;x4=(i/16)&0x01;x5=(i/32)&0x01;x6=(i/64)&0x01;/*/号代表除,可用右移实现*///提取128点输入信号序列的原顺序排列的序号(即算法信号流图上从上向下按顺序排列的位置序号)i对应的7位二进制数(b6b5b4b3b2b1b0)每位的值(x6x5x4x3x2x1x0)xx=x0*64+x1*38、2+x2*
7、;i++){x0=x1=x2=x3=x4=x5=x6=0;//128点FFT序号值用7位二进制(x6x5x4x3x2x1x0)表示,x0=i&0x01;x1=(i/2)&0x01;x2=(i/4)&0x01;x3=(i/8)&0x01;x4=(i/16)&0x01;x5=(i/32)&0x01;x6=(i/64)&0x01;/*/号代表除,可用右移实现*///提取128点输入信号序列的原顺序排列的序号(即算法信号流图上从上向下按顺序排列的位置序号)i对应的7位二进制数(b6b5b4b3b2b1b0)每位的值(x6x5x4x3x2x1x0)xx=x0*64+x1*3
8、2+x2*
此文档下载收益归作者所有