C程序编写的FFT与matlab中的fft函数比较
1、FFT的C程序编写
在个人上一篇博客已经讲过如何用C语言编写一个FFT变换,不清楚的能够打开下面这个连接阅读web
通过对原来程序的修改,如今能够实现一下功能:svg
一、能够对一个连续的时域信号进行采样,将其转换为离散的时域信号。函数
二、能够输入输入采样点数目和采样频率来进行FFT变换。学习
三、能够将FFT变换结果经过gnuplot画出来。spa
程序以下:.net
#include
#include
#include
#define N 1024
typedef struct{
double real;
double imag;
}complex;
complex x[N], *W;
int size=0;
double l[5000],h[5000];
double PI=4.0*atan(1);
void output()
{
int i;
for(i=0;i
{
printf("%lf %lf %.4f",h[i],l[i],x[i].real);//输出频域序列 模长 和信号的实部
if(x[i].imag>=0.0001)
{
printf("+%.4fj\n",x[i].imag);
}
else if(fabs(x[i].imag)<0.0001)
{
printf("\n");
}
else
{
printf("%.4fj\n",x[i].imag);
}
}
}
void change()
{
complex temp;
unsigned short i=0,j=0,k=0;
double t;
for(i=0;i
{
k=i;
j=0;
t=(log(size)/log(2));
while( (t--)>0 )
{
j=j<<1;
j|=(k & 1);
k=k>>1;
}
if(j>i)
{
temp=x[i];
x[i]=x[j];
x[j]=temp;
}
}
}
void transform()
{
int i;
W=(complex *)malloc(sizeof(complex) * size);
for(i=0;i
{
W[i].real=cos(2*PI/size*i);
W[i].imag=-1*sin(2*PI/size*i);
}
}
void add(complex a,complex b,complex *c)
{
c->real=a.real+b.real;
c->imag=a.imag+b.imag;
}
void sub(complex a,complex b,complex *c)