2022年FFT的C语言编程 .pdf
FFT 的 C语言编程1.程序:#include #include #define re 0 /* re=0,用 re 表示实部 */ #define im 1 /* im=1,用 im 表示虚部 */ main() float x1282,w2,temp2; /* x1282: 复数变量;xire: 第 i 个复数变量的实部;xiim: 第 i 个复数变量的虚部;w2 : 存储旋转因子 WN P,wre、wim分别代表旋转因子的实部和虚部;temp2: 蝶形计算中的临时变量,tempre、tempim分别代表其实部和虚部;*/ float arg,wreal,wimag; /* arg 存储旋转因子指数p( 数值上相差 - 2 /N) 。wreal 存储 cos(arg),wimag 存储-sin(arg) */ float tem,tr,ti; int L,M,B,j,i,k, N,N2; char c=i; scanf(%d %d,&N,&M); /* 输入复数信号长度N,蝶形运算级数M */ N2=N1; for(j=0;jN;j+) /* 输入复数信号实部和虚部 */ scanf(%f %f,&xjre,&xjim); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 8 页 - - - - - - - - - printf(n); /* 输入倒序 */ for(j=0,i=1;iN-1;i+) k=N2; while(k1; j=j+k; if(ij) tr=xjre; ti=xjim; xjre=xire; xjim=xiim; xire=tr; xiim=ti; /*FFT 三重循环模块 */ for(L=1; L=M; L+) /* 逐级进行计算共M 级*/ B=1L-1; /* 第 L 级共有 B=2L-1 个不同的旋转因子 */arg=-acos(-1)/B; /* 旋转因子初始化注释见结尾处*/wre=cos(arg); wim=-sin(arg); for(j=0; jB; j+) /* j 代表第 L 级不同旋转因子的个数 */ /* 旋转因子 */ arg=acos(-1)/B;/* arg= / */wreal=cos(arg); wimag= -sin(arg); tem=wre*wreal-wim*wimag; wim=wre*wimag+wim*wreal; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 8 页 - - - - - - - - - wre=tem; for(k=j; kN; k+=2*B) /* 第 L 级具有相同旋转因子蝶形计算,每个蝶形相距2L=2B 个点*/ tempre=xk+Bre*wre-xk+Bim*wim; tempim=xk+Bim*wre+xk+Bre*wim; xk+Bre=xkre-tempre; xk+Bim=xkim-tempim; xkre=xkre+tempre; xkim=xkim+tempim; /* 编写蝶形运算程序 */ /* 第 L 级每个蝶形计算的输入节点距离为B */ /* 蝶形运算? ? ? + ? = + + + = xi B i x W i x B i x B i x W i x P N P N */ /* 利用临时存储变量temp2计算 WN Pxi+B */ /* 复数运算: (a+bj)(c+dj)=(ac-bd)+(bc+ad)j */ /* tempre= ac-bd,tempim= bc+ad */ for(j=0;jN;j+) /* 输出*/ printf(%f %c%fn,xjre,c,xjim); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 8 页 - - - - - - - - - /* 计算旋转因子说明) ( 2 * L M j P ? = 、1 2 ? = L B 、M N 2 = 有 sin cos ) / ( 2 i e e e W i B j i P N i P N ? = = = = ? ? ? 其中 B j / =下一个旋转因子旋转角度为arg (arg) * i i e e ? ? cos(arg) * sin sin(arg) * (cos sin(arg) * sin cos(arg) * (cos + ? ? = i*/ 2. 8 点复数信号的离散傅里叶变换:3. 16、32 点复数信号的FFT频谱图1)16 点:function kuangxin1 x= 0.000000 0.000000 0.000000 0.000000 0.000000 -4.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 8 页 - - - - - - - - - 0.000000 4.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 2.828400 -2.828400 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 2.828400 2.828400 0.000000 0.000000; N=16; for i=1:16 y(i)=sqrt(x(i,1)2+x(i,2)2); end i=0:15; stem(i,y) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 8 页 - - - - - - - - - 2)32 点:function kuangxin2 x=0.000000 0.000000 0.000000 0.000000 0.000000 -4.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 4.000000 0.000000 0.000000 0.000000 0.000000 05101500.511.522.533.54名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 8 页 - - - - - - - - - 0.000000 0.000000 2.828400 -2.828400 0.000000 0.000000 8.000000 0.000000 0.000000 0.000000 2.828400 2.828400 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 1.530800 -3.695600 0.000000 0.000000 5.656800 0.000000 0.000000 0.000000 1.530800 3.695600 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 3.695600 -1.530800 0.000000 0.000000 5.656800 0.000000 0.000000 0.000000 3.695600 1.530800 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 8 页 - - - - - - - - - 0.000000 0.000000; for i=1:32 y(i)=sqrt(x(i,1)2+x(i,2)2); end i=0:31; stem(i,y) 05101520253035012345678名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 8 页 - - - - - - - - -