# C语言及Matlab实现fft

/*时间抽选基 2FFT 及 IFFT 算法 C 语言实现 时间抽选基 语言实现*/

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函数,而是自己编写该程序,并且在设计的GUI界面上实现该算法 ...
FFT详解及MATLAB仿真
FFT详解及MATLAB仿真_信息与通信_工程科技_专业资料。FFT详解及MATLAB仿真 FFT 是离散傅立叶变换的快速算法,可以将一个信号变换 到频域。有些信号在时域上是很难看...

FFTmatlab实例
FFTmatlab实例_计算机软件及应用_IT/计算机_专业资料。FFTmatlab中的几个实例 close all; %先关闭所有图片 Adc=2; %直流分量幅度 A1=3; %频率 F1 信号的幅度...
FFT算法(用matlab实现)
FFT算法(用matlab实现) - 数字信号处理实验报告 实验二 FFT 算法的 MATLAB 实现 (一)实验目的:理解离散傅立叶变换时信号分析与处理的一种重要变换,特别 是 FFT...
MATLAB中FFT使用详解
MATLAB 中 FFT 使用详解一.调用方法 X=FFT(x); X=FFT(x,N); x=IFFT(X); x=IFFT(X,N) 用 MATLAB 进行谱分析时注意: (1)函数 FFT 返回值的数据...

matlab实现DFT FFT - 用 matlab 实现 DFT FFT 目录 实验目的...