版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、FFT算法研究报告 1、 程序设计背景(FFT算法理解)FFT(fast fourier transformation),快速傅里叶变换。是对DFT算法的改进,其利用了WNnk的周期性、共轭对称性和可约性,使得DFT中有些项可以合并,大大减小了计算量。按输入序列在时间上的次序是属于偶数还是奇数来分解称为“按时间抽取法”(DIT)。另一种是把输出序列X(k)按顺序的奇偶分解为越来越短的序列,称为按频率抽样的FFT算法(DIF)。DIT算法是先作复乘后作加减,而DIF的复乘只出现在减法之后。本次程序采用DIT算法实现FFT。用c语言实现FFT的难点在于数据倒位序的处理,以及各级蝶形运算的实现。倒位
2、序的实现可以使用“反向进位加法”,即倒位序二进制数的下面一个数是上面一个数在最高位加一并由高位向低位进位而得到的。对于点数为N = 2L的FFT运算,可以分解为L阶蝶形图级联,第M阶蝶形图内又分为2(L-M)个蝶形组,每个蝶形组内包含2(M-1)个蝶形。而且旋转因子与蝶形阶数和蝶形分组内的蝶形个数存在关联。因此我们就可以构造循环来实现蝶形运算。2、 FFT算法流程图输入数组指针a,长度n倒位序流程图:n=0? Yi=0Ni<n?N i%2=0?Y NTempi=ai/2temp(n+i)/2=ai Yi=i+1a=tempn=n/2结束Y3、 FFT程序代码#include <st
3、dio.h> #include <stdlib.h> #include <math.h> #include <time.h>#define PI 3.141592653 #define SIZE 16#define MAX 10 /定义复数结构体 typedef struct Complex double real; double imag; comp; /定义复数乘法,加法,减法 void Add_(comp * a1,comp *a2,comp *b) b->imag=a1->imag+a2->imag; b->real=a
4、1->real+a2->real; void Sub_(comp * a1,comp *a2,comp *b) b->imag=a1->imag-a2->imag; b->real=a1->real-a2->real; void Mul_(comp * a1,comp *a2,comp *b) double r1=0.0,r2=0.0; double i1=0.0,i2=0.0; r1=a1->real; r2=a2->real; i1=a1->imag; i2=a2->imag; b->imag=r1*i2+r2*
5、i1; b->real=r1*r2-i1*i2; /利用srand()、rand()随机生成一个输入并显示数据 void Input(double *data,int n) printf("输入信号为:n"); srand(int)time(0); for(int i=0;i<SIZE;i+) datai=rand()%MAX; printf("%lfn",datai); /定义WN的n次方项void WN(double n,double size_n,comp * b) double x=2.0*PI*n/size_n; b->ima
6、g=-sin(x); b->real=cos(x); /处理FFT的数据位置,输入倒位序,输出自然顺序(正序),用递归结构实现 int reverse(double * a,int n) if(n=1) return 0; double * temp=(double *)malloc(sizeof(double)*n); for(int i=0;i<n;i+) if(i%2=0) tempi/2=ai; else temp(n+i)/2=ai; for(int i=0;i<n;i+) ai=tempi; free(temp); reverse(a, n/2); reverse
7、(a+n/2, n/2); return 1; /定义FFT函数 void FFT(double * a,comp * b,int n) reverse(a, n); /对输入信号进行倒位序处理 int k=n; int m=0; while (k/=2) /记录需要蝶形运算的级数 m+; k=m; comp * a_comp=(comp*)malloc(sizeof(comp)*n); for(int i=0;i<n;i+) a_compi.real=ai; a_compi.imag=0; /将输入数据赋值给 a_comp for(int i=0;i<k;i+) /依次计算各级蝶
8、形运算 z=0; for(int j=0;j<n;j+) if(j/(2(i-1)%2=1) comp wn; WN(z, n, &wn); Mul_(&a_compj, &wn,&a_compj); z+=2(k-i-2); comp temp; int company=j-(2(i-1); temp.real=a_compcompany.real; temp.imag=a_compcompany.imag; Add_(&temp, &a_compj, &a_compcompany ); Sub_(&temp, &
9、a_compj, &a_compj); else m=0; printf("nnFFT处理结果:n"); for(int i=0;i<n;i+) if(a_compi.imag>=0.0) printf("%lf+%lfjn",a_compi.real,a_compi.imag); else printf("%lf%lfjn",a_compi.real,a_compi.imag); for(int i=0;i<n;i+) bi.imag=a_compi.imag; bi.real=a_compi.real;
10、int main() double arraySIZE; comp bSIZE; Input(array,SIZE); /随机生成16个输入数据 FFT(array, b, SIZE); 4、 与MATLAB自带FFT函数运行结果的比较自编FFT结果:将输入信号在matlab中进行FFT运算,结果如下:由以上截图可知,函数成功地完成了对于序列xn的FFT计算,但是可以看出matlab的准确度更高,应该是matlab计算使用的pi值更为精确。为比较二者的时间,将数据长度重新定义为215Matlab FFT程序: 自编FFT程序: 由于计算matlab用时使用的数据与自编FFT程序所用数据不同,可能会有不可预料的误差
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二零二四年度货物买卖合同(含退换货条款)
- 劳务派遣框架合同
- 农业种植合同协议
- 招标文件案例解析深度解析
- 房屋买卖合同样本国内格式
- 环保产品质量共检协议
- 鸡粪有机肥订购协议
- 维修服务精益求精
- 网络营销服务合同签订注意事项
- 财务代理委托事宜
- 2024年贵州省贵阳修文县事业单位招聘133人历年管理单位遴选500模拟题附带答案详解
- 读书分享《非暴力沟通》课件(图文)
- 宁夏回族自治区银川市2025届高三上学期第三次月考数学试卷含答案
- 2024-2030年中国家禽饲养行业发展前景预测和投融资分析报告
- 2024-2030年中国净菜加工行业市场营销模式及投资规模分析报告
- 2024-2025学年广东省佛山市九年级(上)期中数学试卷(含答案)
- 湖南省长沙市雅礼教育集团2024-2025学年高一上学期期中考试数学试题 含解析
- 中国视觉小说行业现状调查与竞争趋势分析研究报告(2024-2030版)
- 仓储物流中心物业安全管理
- 第二章 空气、物质的构成(选拔卷)(原卷版)
- 咨询师基础心理学课件
评论
0/150
提交评论