本文奉上一个实例供大家参考。
输入函数为5*sin(2*pi*150*t)+1*sin(2*pi*1350*t)
函数包含幅值为5的150Hz正弦和幅值为1的1350Hz正弦
6月20日发布的v5.8.5.9就是为了这篇文章特意发布,
//声明头文件
#include
#include
#include
#include
//声明函数
void fft(float *res,float *data,int size,int sign=1);
void main()
{
int fs=8192; //请输入2的幂数
float *x=new float[fs];
float *y=new float[fs];
float *z=new float[fs];
float f1=150,f2=1350;
float pi=3.1415926f;
for(int i=0;i {
x[i]=5*sin(2*pi*f1*i/fs)+1*sin(2*pi*f2*i/fs);
y[i]=0;
z[i]=0;
}
int t1=GetTickCount();
fft(y,x,fs);
int t2=GetTickCount();
fft(z,y,fs,-1);
int t3=GetTickCount();
printf("本次计算的数据长度为%d\r\n",fs);
printf("fft计算时长%d ms\r\n",t2-t1);
printf("ifft计算时长%d ms\r\n",t3-t2);
float df=1; //分辨率
FILE *file=fopen("d:\\fft.txt","wb");
char ch[1000];
for(int i=0;i {
int len=sprintf(ch,"%.5g\t%.5g\r\n",i*df,y[i]);
fwrite(ch,1,len,file);
}
fclose(file);
file=fopen("d:\\ifft.txt","wb");
for(int i=0;i {
int len=sprintf(ch,"%.5g\t%.5g\t%.5g\r\n",(float)i/fs,x[i],z[i]);
fwrite(ch,1,len,file);
}
fclose(file);
printf("完成输出");
getchar();
}
FFT函数代码
快速傅里叶变换的计算机实现-基于实数
注意:下边的图形全是基于xuke5.8.6版本,如果用之间的版本来读取txt文件,其结果无法保证。
xuke 5.8.6 下载链接
fft结果如下图所示,频率和幅值与源数据完全一致
下图为傅里叶逆变换的结果(蓝线),显然逆变换后的时域信号相位与源数据不同。
这是因为本文发布的傅里叶变换的函数是基于实数输出的,若要保证相位一致需要输出复数形态的傅里叶结果。
以下是演示视频,视频时长39s,需要耗费3M流量。
我有一个梦想,让xuke在工程上或者学习中给需要的人贡献一份力量。因此如果觉得文章不错,请花费10s钟时间,转载此文。
你们的转发和分享是我坚持的动力,更新的频次增多了后,那就意味xuke的源代码能尽早完成发布。
所以还等什么呢,转发他吧!
由于刚创建的微信公众号,暂时不能开通文章留言回复功能,不妨来填个问卷