当前位置:首页 >> 工学 >>

C语言及Matlab实现fft


/*时间抽选基 2FFT 及 IFFT 算法 C 语言实现 时间抽选基 语言实现*/
学号 3070503041 电信 0702 李春阳

该程序有误输入{1,2,3,4,5,6,7,8}与 MATLAB 实现不一样,但可运行可以修改修 改好请给我留言 758677366@qq.com 估计数据排列子程序有误 #include <stdio.h> #include <math.h> #include <stdlib.h> #define N 1000 /*定义复数类型*/ typedef struct{ double real; double img; }complex; complex x[N], *W; /*输入序列,变换核*/ int size_x=0; /*输入序列的大小,在本程序中仅限 2 的次幂*/ double PI; /*圆周率*/ int main(){ int i,method; void fft(); /*快速傅里叶变换*/ void ifft(); void initW(); /*初始化变换核*/ void change(); /*变址*/ void add(complex a,complex b,complex *c); /*复数加法*/ void mul(complex a,complex b,complex *c); /*复数乘法*/ void sub(complex a,complex b,complex *c); /*复数减法*/ void divi(complex a,complex b,complex *c);/*复数除法*/ void output(); /*输出结果*/ 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]:\n"); for(i=0;i<size_x;i++) scanf("%lf,%lf",&x[i].real,&x[i].img); /*检验输入的数据*/ printf("我输入的数据\n"); for(i=0;i<size_x;i++) printf("%4lf,+(%4lf)j\n",x[i].real,x[i].img); initW(); printf("Use FFT(0) or IFFT(1)?\n");

scanf("%d",&method); if(method==0) fft(); else ifft(); output(); return 0; } /*快速傅里叶变换*/ void fft(){ int i=0,j=0,k=0,l=0; complex up,down; //蝶形输出端的上和下 change(); //调整输入的序列,即蝶形的输入端的相 应数据排列 for(i=0;i< (int)( log(size_x)/log(2) );i++) { l=( 1<<i ); for(j=0;j<size_x;j+= (1<<l) ){ /*一组蝶形运算*/ for(k=0;k<l;k++){ mul(x[j+k+l],W[size_x*k/2/l],&up); add(x[j+k],up,&up); mul(x[j+k+l],W[size_x*k/2/l],&down); sub(x[j+k],down,&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) );i++) { /*一级蝶形运算*/ l/=2; for(j=0;j<size_x;j+= (1<<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; } } } change(); } /*初始化变换核*/ void initW() { int i; W=(complex *)malloc(sizeof(complex) * size_x); 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); } } /*变址计算,将 x(n)码位倒置*/ void change() { complex temp; int i=0,j=0,k=0,t; for(i=0;i<size_x;i++){ k=i;j=0; t=(unsigned) (log(size_x)/log(2)); while(t--){ 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 follows\n"); for(i=0;i<size_x;i++) { printf("%.4f",x[i].real); if(x[i].img>=0.0001)printf("+(%.4fj)\n",x[i].img); else if(fabs(x[i].img)<0.0001)printf("\n"); else printf("(%.4fj)\n",x[i].img); } } void add(complex a,complex b,complex *c) { c->real=a.real+b.real; c->img=a.img+b.img; } void mul(complex a,complex b,complex *c) { 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) { c->real=a.real-b.real; c->img=a.img-b.img; } void divi(complex a,complex b,complex *c) { c->real=( a.real*b.real+a.img*b.img )/( b.real*b.real+b.img*b.img); c->img=( a.img*b.real-a.real*b.img)/(b.real*b.real+b.img*b.img); }

FFT 的 MATLAB 实现
x=[1,2j,3,4j] ; M=nextpow2(x); % 求 x 的长度对应的 2 的最低幂次 m N=2^M; if length(x)<N x=[x,zeros(1,N-length(x))]; % 若 x 的长度不是 2 的幂,补零到 2 的整数幂

end nxd=bin2dec(fliplr(dec2bin([1:N]-1,M)))+1; % 求 1:2^M 数列序号的倒序 y=x(nxd); % 将 x 倒序排列作为 y 的初始值 WN=exp(-i*2*pi/N); for L=1:M B=2^L/2;%第 L 级中,每个蝶形的两个输入数据相距 B 个点,每级有 B 个不同的旋转 因子 for J=0:B-1 % J 代表了不同的旋转因子 p=J*2^(M-L); WNp=WN^p; for k=J+1:2^L:N % 本次蝶形运算的跨越间隔为 2^L kp=k+B; % 蝶形运算的两个因子对应单元下标的关系 t=y(kp)*WNp; % 蝶形运算的乘积项 y(kp)=y(k)-t; % 蝶形运算, 注意必须先进行减法运算,然后进行加法运算, 否则要使用中间变量来传递 y(k) y(k)=y(k)+t; % 蝶形运算 end end end y y1=fft(x)

%自己编的 FFT 跟直接调用的函数运算以后的结果进行对比

% 仿真结果: y= 4.0000 + 6.0000i -4.0000 - 0.0000i y1 = 4.0000 + 6.0000i -4.0000 4.0000 - 6.0000i 0 + 0.0000i

4.0000 - 6.0000i

0


赞助商链接
相关文章:
用Matlab编写fft
Matlab编写fft_计算机软件及应用_IT/计算机_专业资料。使用Matlab编写fftFFT算法编写 1、程序 function [A] = myfft(A,M) N=2^M; LH=N/2; J=LH; N1...
matlab实现fft
matlab实现fft_信息与通信_工程科技_专业资料。FFT: Myfft: function X=myfft(x) %myfft 函数 用递归实现 N=length(x); %离散数组的长度 t=log2(N); %...
按时间抽取的基2FFT算法分析及MATLAB实现
MATLAB编写的fft2程序更... 2页 1下载券 C语言实现FFT(快速傅里叶... 12页 1下载券按​时​间​抽​取​的​基​2​F​F​T​算​...
Matlab编程实现FFT变换及频谱分析的程序代码
Matlab编程实现FFT变换及频谱分析的程序代码_IT/计算机_专业资料。用matlab实现的fft变换和频谱分析,附代码 Matlab 编程实现 FFT 变换及频谱分析的程序代码 (喜欢进行...
实验二 FFT算法的MATLAB实现
实验二 FFT算法的MATLAB实现_专业资料。班级: 学号: 姓名 实验二 FFT 算法的 MATLAB 实现(一)实验目的: 实验目的: (1)掌握用 matlab 进行 FFT 在数字信号处理...
Matlab实现DFT和FFT
一、实验内容 1、利用 matlab 实现 DFT 2、利用 matlab 实现 FFT,分析有限离散数列的 FFT 二、实验目的 1、通过研究 DFT,FFT 性质,用语言实现 DFT, FFT。不...
FFT算法设计与实现
FFT算法设计与实现_信息与通信_工程科技_专业资料。c语言实现FFT算法 ...FFT(array, b, SIZE); } //随机生成 16 个输入数据 4、 与 MATLAB 自带...
FFT的C语言算法实现
如要投诉违规内容,请到百度文库投诉中心;如要提出功能问题或意见建议,请点击此处进行反馈。 FFTC语言算法实现 DIT-FFTC语言算法实现DIT-FFTC语言算法实现隐藏...
快速傅里叶变换的C程序实现思路分析MATLAB仿真
故如何实现用 C 程序实现快速傅里叶变换(FFT)便成为了十分重 要的任务。该次仿真设计以 MATLAB 为软件仿真平台用 C 语言的编程思路来编写 MATLAB 程序完成任意...
Matlab中的FFT运算
Matlab中的FFT运算_IT/计算机_专业资料 暂无评价|0人阅读|0次下载|举报文档 Matlab中的FFT运算_IT/计算机_专业资料。今日推荐 157份文档 ...
更多相关标签: