当前位置:首页 >> 信息与通信 >>

FFT的C语言算法实现


FFT 的 C 语言算法实现
程序如下: /************FFT***********/ #include <stdio.h> #include <math.h> #include <stdlib.h>

#define N 1000 typedef struct { double real; double img; }complex; void fft(); /*快速傅里叶变换*/ void ifft(); /*快速傅里叶逆变换*/ void initW(); void change(); void add(complex ,complex ,complex 数加法*/ void mul(complex ,complex ,complex 数乘法*/ void sub(complex ,complex ,complex 数减法*/

*); *); *);

/*复 /*复 /*复

void 除法*/ void

divi(complex

,complex

,complex

*);/*复数

output(); /*输出结果*/

complex x[N], *W;/*输出序列的值*/ int size_x=0;/*输入序列的长度,只限 2 的 N 次方*/ double PI; int { int main() i,method;

system("cls"); PI=atan(1)*4; printf("Please input the size of x:\n"); /*输入序列的长度*/ scanf("%d",&size_x); printf("Please input the data in x[N]:(such as:5 6)\n"); /*输入序列对应的值*/ for(i=0;i<size_x;i++) scanf("%lf %lf",&x[i].real,&x[i].img); initW(); /*选择 FFT 或逆 FFT 运算*/ printf("Use FFT(0) or IFFT(1)?\n"); scanf("%d",&method);

if(method==0) fft(); else ifft(); output(); return 0; } /*进行基-2 FFT 运算*/ void fft() { int i=0,j=0,k=0,l=0; complex up,down,product; change(); for(i=0;i< log(size_x)/log(2) ;i++) { l=1<<i; for(j=0;j<size_x;j+= 2*l ) { for(k=0;k<l;k++) { mul(x[j+k+l],W[size_x*k/2/l],&product); add(x[j+k],product,&up); sub(x[j+k],product,&down); x[j+k]=up; x[j+k+l]=down;

} } } }

void ifft() { int i=0,j=0,k=0,l=size_x; complex up,down; for(i=0;i< (int)( log(size_x)/log(2) */ { l/=2; for(j=0;j<size_x;j+= 2*l ) { for(k=0;k<l;k++) { add(x[j+k],x[j+k+l],&up); up.real/=2;up.img/=2; sub(x[j+k],x[j+k+l],&down); down.real/=2;down.img/=2; divi(down,W[size_x*k/2/l],&down); x[j+k]=up; x[j+k+l]=down; }

);i++) /*蝶形运算

} } change(); }

void initW() { int i; W=(complex *)malloc(sizeof(complex) for(i=0;i<size_x;i++) { W[i].real=cos(2*PI/size_x*i); W[i].img=-1*sin(2*PI/size_x*i); } }

*

size_x);

void change() { complex temp; unsigned short i=0,j=0,k=0; double t; for(i=0;i<size_x;i++) { k=i;j=0;

t=(log(size_x)/log(2)); while( (t--)>0 ) { j=j<<1; j|=(k & 1); k=k>>1; } if(j>i) { temp=x[i]; x[i]=x[j]; x[j]=temp; } } }

void output() /*输出结果*/ { int i; printf("The result are as for(i=0;i<size_x;i++) { printf("%.4f",x[i].real); if(x[i].img>=0.0001) printf("+%.4fj\n",x[i].img);

follows\n");

else if(fabs(x[i].img)<0.0001) printf("\n"); else printf("%.4fj\n",x[i].img); } } void add(complex a,complex { c->real=a.real+b.real; c->img=a.img+b.img; }

b,complex

*c)

void mul(complex a,complex b,complex { 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->real=a.real-b.real; c->img=a.img-b.img; } void divi(complex a,complex b,complex { c->real=( a.real*b.real+a.img*b.img )/(

*c)

*c)

*c)

b.real*b.real+b.img*b.img); c->img=( mg); } a.img*b.real-a.real*b.img)/(b.real*b.real+b.img*b.i


赞助商链接
相关文章:
FFT算法设计与实现
FFT算法设计与实现_信息与通信_工程科技_专业资料。c语言实现FFT算法 FFT 算法研究报告 1、 程序设计背景(FFT 算法理解) FFT(fast fourier transformation),快速傅...
用C语言编写FFT算法
C语言编写FFT算法_数学_自然科学_专业资料。用 C 语言编写 FFT 算法 用 simulink 建模的方法实现 FFT 的问题特别多,还不如手工编写,也不是很复杂。 以下是 ...
C语言、Matlab实现FFT几种编程实例
FFT 的 C 语言算法实现 ///程序如下: /***FFT***/ #include #include #include #define typedef { double double }complex; void void void void void vo...
C语言实现FFT(快速傅里叶变换)
C语言实现FFT(快速傅里叶变换)_信息与通信_工程科技_专业资料。C语言实现FFT(...若使用查表法计算 sin 值和 cos 值,应在调用 FFT 函数前调用 create_sin_...
C语言编写FFT程序
DSP 课程作业用 C 语言编写 FFT 程序 1,快速傅里叶变换 FFT 简介快速傅氏变换(FFT) ,是离散傅氏变换的快速算法,它是根据离散傅氏变换的奇、 偶、虚、实等...
C语言实现FFT
C语言实现FFT_信息与通信_工程科技_专业资料。#include <iom128.h> #include ...[i]=t; //变址运算,即把自然顺序变成倒位序,采用雷德算法 //如果 i<j,...
FFT的C语言算法实现
FFT原理及实现 17页 免费如要投诉违规内容,请到百度文库投诉中心;如要提出功能问题或意见建议,请点击此处进行反馈。 FFT的C语言算法实现 DIT-FFT的C语言算法实现DIT...
FFT相位差算法的C语言实现
FFT相位差算法的C语言实现_计算机软件及应用_IT/计算机_专业资料。FFT算法的C语言实现,用在相位差算法上,程序已验证可运行,放心使用/...
基于DSP的FFT算法实现
FFT的DSP实现 15页 免费 C语言实现FFT(快速傅里叶变... 12页 免费 FFT算法DSP实现(DIT基2FFT... 18页 免费 基于DSP的 FFT算法实现的研... 7页 免费 FF...
FFT快速算法C程序
FFT快速算法C程序_工学_高等教育_教育专区。电子信息工程综合课程设计报告书 DSP...FFT算法研究与实现(C语言... 3页 1下载券 时域抽取法的定点FFT程序... 3页...
更多相关标签: