C语言实现FFT和IFFT,并与MATLAB编写显示的结果相对比,进行验证(蝶形运算)

本次实验中在Microsoft Visual Studio 2010环境下编写,实现FFT和IFFT,并用MATLAB编写显示的结果,两者相对比,进行验证。

#include “stdafx.h”

#include
#include
#include
const double pi=3.14159265357;

#include
using namespace std;

//FFT变换
void FFT (complex *xn,int N)
{

//实现倒序	
int k;  
int M1=(int)(log(N*1.0)/log(2.0));
complex temp;
for(int j=0;j>i)&1)<<(M1-1-i);
	if(k>j)
	{
		temp=xn[j];
		xn[j]=xn[k];
		xn[k]=temp;
	}
}

//三层循环

complex T=0;

int M=(int)(log(N*1.0)/log(2.0));//取幂次

for(int L=1;L<=M;L++)//级循环·
{
	int B=(int)pow(2.0,L-1);
	for(int r=0;r wnr,wnrreal,wnrimage;
			wnr=complex(cos((-2.0*pi*p)/(N)),sin((-2.0*pi*p)/(N)));
			
			//蝶形运算
			T=xn[k]+wnr*xn[k+B];
			xn[k+B]=xn[k]-wnr*xn[k+B];
			xn[k]=T;
		}
	}
}
//取共轭
void conjugate (complex *xn,int N)
{
	for(int i=0;i *yn;
		xn[i]=complex(real(xn[i]),-imag(xn[i]));
	}	
}

int _tmain(int argc, _TCHAR* argv[])
{

int N;

//实现序列的输入
cout<<"请输入序列个数(2的整数次幂,如8)"<>N;
complex *xn= new complex[N];//复数形的动态指针
complex *yn= new complex[N];;//保存输出值
cout<<"请输入序列"<>*(xn+i);
}

//FFT变换
FFT(xn, N);
//输出xn序列FFT变换
for(int i=0;i)N;//complex 

for(int i=0;i

MATLAB 程序 实现FFT,进行对比

N=8;%序列长为8
n=0:7;
x=[1.0 2 3 4.5 5.6 6 7 8.1];%随意输入8个数据
y=fft(x,N);% FFT变换
Y1=abs(y);%取幅值
figure(1);%窗口1,开始画图
subplot(2,1,1);
stem(n,x);title(‘实验5.4 x(n)’);%显示原序列 x(n)
subplot(2,1,2);
stem(n,Y1);title(‘实验5.4 Y1(n)’);%显示经过FFT变换后的序列

第一组数据
C语言实现FFT和IFFT,并与MATLAB编写显示的结果相对比,进行验证(蝶形运算)_第1张图片
C语言实现FFT和IFFT,并与MATLAB编写显示的结果相对比,进行验证(蝶形运算)_第2张图片
第二组数据
C语言实现FFT和IFFT,并与MATLAB编写显示的结果相对比,进行验证(蝶形运算)_第3张图片
C语言实现FFT和IFFT,并与MATLAB编写显示的结果相对比,进行验证(蝶形运算)_第4张图片

你可能感兴趣的:(学习)