



免费预览已结束,剩余1页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
基2的DIT蝶形算法源代码及注释如下: /*FFT*/ /整个程序输入和输出利用同一个空间xN,节约空间 #include #include #include #define N 1000 /定义输入或者输出空间的最大长度 typedef struct double real; double img; complex; /定义复数型变量的结构体 void fft(); /快速傅里叶变换函数声明 void initW(); /计算W(0)W(size_x-1)的值函数声明 void change(); /码元位置倒置函数函数声明 void add(complex,complex,complex *); /*复数加法*/ void mul(complex,complex,complex *); /*复数乘法*/ void sub(complex,complex,complex *); /*复数减法*/ void divi(complex,complex,complex *); /*复数除法*/ void output(); /*输出结果*/ complex xN,*W; /*输出序列的值*/ int size_x=0; /*输入序列的长度,只限2的N次方*/ double PI; /pi的值 int main() int i; system(cls); PI=atan(1)*4; printf(Please input the size of x:n); /*输入序列的长度*/ scanf(%d,&size_x); printf(Please input the data in xN:(such as:5 6)n); /*输入序列对应的值*/ for(i=0;isize_x;i+) scanf(%lf %lf,&xi.real,&xi.img); initW(); /计算W(0)W(size_x-1)的值 fft(); /利用fft快速算法进行DFT变化 output(); /顺序输出size_x个fft的结果 return 0; /*进行基-2 FFT运算,蝶形算法。这个算法的思路就是, 先把计算过程分为log(size_x)/log(2)-1级(用i控制级数); 然后把每一级蝶形单元分组(用j控制组的第一个元素起始下标); 最后算出某一级某一组每一个蝶形单元(用k控制个数,共l个)。*/ void fft() int i=0,j=0,k=0,l=0; complex up,down,product; change(); /实现对码位的倒置 for(i=0;ilog(size_x)/log(2);i+) /循环算出fft的结果 l=1i; for(j=0;jsize_x;j+=2*l) /算出第m=i级的结果【i从0到(log(size_x)/log(2))-1】 for(k=0;kl;k+) /算出第i级内j组蝶形单元的结果 /算出j组中第k个蝶形单元 mul(xj+k+l,W(size_x/2/l)*k,&product); /*size/2/l是该级W的相邻上标差,l是该级该组取的W总个数*/ add(xj+k,product,&up); sub(xj+k,product,&down); xj+k=up; /up为蝶形单元右上方的值 xj+k+l=down; /down为蝶形单元右下方的值 void initW() /计算W的实现函数 int i; W=(complex *)malloc(sizeof(complex) * size_x); /*申请size_x个复数W的空间(这部申请的空间有点多,实际上只要申请size_x/2个即可)*/ for(i=0;i(size_x/2);i+) /*预先计算出size_x/2个W的值,存放,由于蝶形算法只需要前size_x/2个值即可*/ Wi.real=cos(2*PI/size_x*i); /计算W的实部 Wi.img=-1*sin(2*PI/size_x*i); /计算W的虚部 void change() /输入的码组码位倒置实现函数 complex temp; unsigned short i=0,j=0,k=0; double t; for(i=0;i0) j=j1; if(ji) temp=xi; xi=xj; xj=temp; void output() /输出结果实现函数 int i; printf(The result are as followsn); for(i=0;i=0.0001) /如果虚部的值大于0.0001,输出+jx.img的形式 printf(+j%.4fn,xi.img); else if(fabs(xi.img)real = a.real + b.real; /复数实部相加 c-img = a.img + b.img; /复数虚部相加 void mul(complex a,complex b,complex *c) /复数乘法实现函数 c-real = a.real*b.real - a.img*b.img; /获取相乘结果的实部 c-img = a.real*b.img + a.img*b.real; /获取相乘结果的虚部 void sub(complex a,complex b,complex *c) /复数减法实现函数 c-real = a.real - b.real; /复数实部相减 c-img = a.img - b.img; /复数虚部相减 void divi(complex a,complex b,complex *c) /复数除法实现函数 c-real = (a.real*b.real + a.img*b.img) / (b.real*b.real+b.img*b.img); /获取相除结果的实部 c-img = (a.img*b.real - a.real*b.img) / (b.real*b.real+b.img*b.img); /获取相除结果的虚部 由于输入序列和输出序列存储(包括中间结果)在同一个空间数组x【size_x】,故每进行一个蝶形算法,相应的存储单元有两个值被替换。该程序框图如下:开始计算出前size_x/2个exp(-j*2*k/size_x)个值,即W的值输入序列对应值(例如5+j3,输入5 3)输入序列长度size_x飞级
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 工业设备操作课件前言
- 娱三姨安全培训课件
- 威海荣成课件研发
- 工业机器人介绍课件
- 威巴克生产安全培训室课件
- 威信押运司机安全培训课件
- Fentomycin-生命科学试剂-MCE
- E-Z-Rivanicline-E-Z-RJR-2403-生命科学试剂-MCE
- 工业安全培训定义课件
- 2025年八宿事业单位真题
- 附睾结核护理查房
- 膝关节炎中医护理
- 氦氖激光机治疗仪讲课件
- 公司中小型会议策划方案
- 2025年工程机械行业发展研究报告
- 购买工抵房合同协议
- 医院管理制度汇编
- 2025-2030中国偏头痛药行业市场发展趋势与前景展望战略研究报告
- 2025南宁市隆安县辅警考试试卷真题
- 《高粱酿造过程中的有害物质控制技术》论文
- 大疆行业解决方案
评论
0/150
提交评论