求FFT的c语言程序

来源:学生作业帮助网 编辑:作业帮 时间:2024/05/05 04:11:43
求FFT的c语言程序

求FFT的c语言程序
求FFT的c语言程序

求FFT的c语言程序
快速傅里叶变换 要用C++ 才行吧 你可以用MATLAB来实现更方便点啊
此FFT 是用VC6.0编写,由FFT.CPP;STDAFX.H和STDAFX.CPP三个文件组成,编译成功.程序可以用文件输入和输出为文件.文件格式为TXT文件.测试结果如下:
输入文件:8.TXT 或手动输入
8 //N
1
2
3
4
5
6
7
8
输出结果为:或保存为TXT文件.(8OUT.TXT)
8
(36,0)
(-4,9.65685)
(-4,4)
(-4,1.65685)
(-4,0)
(-4,-1.65685)
(-4,-4)
(-4,-9.65685)
下面为FFT.CPP文件:
// FFT.cpp :定义控制台应用程序的入口点.
#include "stdafx.h"
#include
#include
#include
#include
#include
#include
#include
using namespace std;
bool inputData(unsigned long &,vector&); //手工输入数据
void FFT(unsigned long &,vector&); //FFT变换
void display(unsigned long &,vector&); //显示结果
bool readDataFromFile(unsigned long &,vector&); //从文件中读取数据
bool saveResultToFile(unsigned long &,vector&); //保存结果至文件中
const double PI = 3.1415926;
int _tmain(int argc,_TCHAR* argv[])
{
vector vecList; //有限长序列
unsigned long ulN = 0; //N
char chChoose = ' '; //功能选择
//功能循环
while(chChoose != 'Q' && chChoose != 'q')
{
//显示选择项
cout

#include //计算给定v[NN]的NN点FFT
#include
#define pi 3.1415
#define NN 12 //12点FFT
struct plural
{
float real;
float image;
};
int ...

全部展开

#include //计算给定v[NN]的NN点FFT
#include
#define pi 3.1415
#define NN 12 //12点FFT
struct plural
{
float real;
float image;
};
int g[NN/2],h[NN/2];
void main()
{
void dft(struct plural *X,int x[NN/2],int N);
void chaikai(int v[],int l);
struct plural chengji(struct plural a,struct plural b);
struct plural w,m,V[NN];
struct plural G[NN/2],H[NN/2];
int v[NN]={3,9,1,0,2,1,4,3,5,2,6,7}; //给出v[NN]
int i,N,k,t;

for(t=0;t {
 G[t].real=0; G[t].image=0; //初始化G[K],H[K]
 H[t].real=0; H[t].image=0;
}
N=NN/2;
chaikai(v,NN);
dft(G,g,N);
dft(H,h,N);

for(k=0;k<2*N;k++)
{
w.real=cos(2*pi*k/(2*N));
 w.image=-sin(2*pi*k/(2*N));
 m=chengji(w,H[k%N]);
 V[k].real=G[k%N].real+m.real;
 V[k].image=G[k%N].image+m.image;
}
printf("FFT results:\n");
for(i=0;i<2*N;i++)
printf("%.4f+(%.4f*j) ",V[i].real,V[i].image); //结果输出
printf("\n");

}
void dft(struct plural *X,int x[], int N) //求x[n]的N-DFT
{
 int k,n;
for(k=0;k {
 for(n=0;n {
 X[k].real+=x[n]*cos(2*pi*k*n/N);
 X[k].image+=-x[n]*sin(2*pi*k*n/N);
 }

}

}
struct plural chengji(struct plural a,struct plural b) //计算两个复数a,b的乘积返回复数c
{
struct plural c;
c.real=a.real*b.real-a.image*b.image;
c.image=a.real*b.image+a.image*b.real;
return(c);
}
void chaikai(int v[],int l) //将v[n]拆成g[n]和k[n]
{
int i,k=0,m=0;
for(i=0;i{
if(i%2==1)
h[k++]=v[i];
if(i%2==0)
g[m++]=v[i];

}
}

收起