算法设计与实现_第1页
算法设计与实现_第2页
算法设计与实现_第3页
算法设计与实现_第4页
算法设计与实现_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论