2022年C语言、Matlab实现FFT几种编程实例...docx
《2022年C语言、Matlab实现FFT几种编程实例...docx》由会员分享,可在线阅读,更多相关《2022年C语言、Matlab实现FFT几种编程实例...docx(22页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、名师归纳总结 精品学习资料 - - - - - - - - - - - - - - -C 语言、 MATLAB 实现 FFT 几种方法总结前人体会,仅供参考/一、/ /c语言程序 / / #include #include #include #define PI 3.1415926535897932384626433832795028841971 /定义圆周率值#define FFT_N 128 struct compx float real,imag; /定义福利叶变换的点数/定义一个复数结构struct compx sFFT_N; /FFT 输入和输出:从 S1开头存放,依据大小自己定义
2、/* 函数原型: struct compx EEstruct compx b1,struct compx b2 函数功能:对两个复数进行乘法运算输入参数:两个以联合体定义的复数 a,b 输出参数: a 和 b 的乘积,以联合体的形式输出 */ struct compx EEstruct compx a,struct compx b struct compx c; c.real=a.real*b.real-a.imag*b.imag; c.imag=a.real*b.imag+a.imag*b.real; returnc; /* 函数原型: void FFTstruct compx *xin,i
3、nt N 函数功能:对输入的复数组进行快速傅里叶变换(FFT)输入参数: *xin 复数结构体组的首地址指针,struct 型*/ void FFTstruct compx *xin 细心整理归纳 精选学习资料 - - - - - - - - - - - - - - - 第 1 页,共 12 页 - - - - - - - - - 名师归纳总结 精品学习资料 - - - - - - - - - - - - - - -int f,m,nv2,nm1,i,k,l,j=0; struct compx u,w,t; nv2=FFT_N/2; /变址运算,即把自然次序变成倒位序,采纳雷德算法 nm1=F
4、FT_N-1; fori=0;inm1;i+ ifij /假如 ij,即进行变址 t=xinj; xinj=xini; xini=t; k=nv2; /求 j 的下一个倒位序whilek=j /假如 k=j, 表示 j 的最高位为 1 j=j-k; /把最高位变成 0 k=k/2; /k/2,比较次高位,依次类推,逐个比较,直到 某个位为 0 j=j+k; /把 0 改为 1 int le,lei,ip; /FFT 运算核,使用蝶形运算完成FFT 运算f=FFT_N; forl=1;f=f/2.=1;l+ ; /运算 l 的值,即运算蝶形级数form=1;m=l;m+ / 掌握蝶形结级数 /m
5、 表示第 m 级蝶形, l 为蝶形级总数 l=log(2)N le=2m-1; /le 蝶形结距离,即第 m 级蝶形的蝶形结相距 le 点lei=le/2; /同一蝶形结中参与运算的两点的距离u.real=1.0; /u 为蝶形结运算系数,初始值为 1 u.imag=0.0; 细心整理归纳 精选学习资料 - - - - - - - - - - - - - - - 第 2 页,共 12 页 - - - - - - - - - 名师归纳总结 精品学习资料 - - - - - - - - - - - - - - -w.real=cosPI/lei; /w 为系数商,即当前系数与前一个系数的商w.im
6、ag=-sinPI/lei; forj=0;j=lei-1;j+ /掌握运算不同种蝶形结,即运算系数不同的蝶形结fori=j;i=FFT_N-1;i=i+le / 掌握同一蝶形结运算, 即运算系数相同蝶形结 ip=i+lei; /i,ip 分别表示参与蝶形运算的两个节点 t=EExinip,u; /蝶形运算,详见公式 xinip.real=xini.real-t.real; xinip.imag=xini.imag-t.imag; xini.real=xini.real+t.real; xini.imag=xini.imag+t.imag; u=EEu,w; /转变系数,进行下一个蝶形运算 /
7、* 函数原型: void main 函数功能:测试 FFT 变换,演示函数使用方法 输入参数:无输出参数:无*/ void main int i; fori=0;iFFT_N;i+ /给结构体赋值 si.real=sin2*3.141592653589793*i/FFT_N; /实部为正弦波 FFT_N 点采 样,赋值为 1 si.imag=0; /虚部为 0 细心整理归纳 精选学习资料 - - - - - - - - - - - - - - - 第 3 页,共 12 页 - - - - - - - - - 名师归纳总结 精品学习资料 - - - - - - - - - - - - - - -
8、FFTs; /进行快速福利叶变换fori=0;iNbreak; %判定是否超出范畴 else p=Xi1*W; Xi1=Xi-p; Xi=Xi+p; %蝶形运算 end end W=W*dw; %蝶形运算系数的变化 endend 细心整理归纳 精选学习资料 - - - - - - - - - - - - - - - 第 5 页,共 12 页 - - - - - - - - - 名师归纳总结 精品学习资料 - - - - - - - - - - - - - - -subplot2,2,1; t=0:0.0000001:N*T; plott,sin2*pi*f*t; %画原曲线 subplot2,
9、2,2; stemk,x; %画采样后的离散信号 subplot2,2,3; stemk,absX/maxabsX; subplot2,2,4; %画自己的 fft 的运算结果stemk,absfftx/maxabsfftx; % 调用系统的函数绘制结果,与自己的结果进 行比较/ 三、/ / /FFT 的 C 语言算法实现 / 程序如下:/*FFT*/ #include #include #include #define N 1000 typedef struct double real; double img; complex; 细心整理归纳 精选学习资料 void fft; /* 快速傅里
10、叶变换 */ *; /* 复数加法 */ 第 6 页,共 12 页 void ifft; /* 快速傅里叶逆变换 */ void initW; void change; void addcomplex ,complex ,complex void mulcomplex ,complex ,complex *; /* 复数乘法 */ void subcomplex ,complex ,complex *; /* 复数减法 */ - - - - - - - - - - - - - - - - - - - - - - - - 名师归纳总结 精品学习资料 - - - - - - - - - - - -
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2022 语言 Matlab 实现 FFT 编程 实例
限制150内