fopen函数_调用FFT函数的实例介绍

本文奉上一个实例供大家参考。

输入函数为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结果如下图所示,频率和幅值与源数据完全一致

3ce8e420c045deabeb9f660e9f8f0cde.png

下图为傅里叶逆变换的结果(蓝线),显然逆变换后的时域信号相位与源数据不同。

这是因为本文发布的傅里叶变换的函数是基于实数输出的,若要保证相位一致需要输出复数形态的傅里叶结果。

4b1d6c92ddbeab431f19f0443d811fd4.png

以下是演示视频,视频时长39s,需要耗费3M流量。

我有一个梦想,让xuke在工程上或者学习中给需要的人贡献一份力量。因此如果觉得文章不错,请花费10s钟时间,转载此文。

你们的转发和分享是我坚持的动力,更新的频次增多了后,那就意味xuke的源代码能尽早完成发布。

所以还等什么呢,转发他吧!

由于刚创建的微信公众号,暂时不能开通文章留言回复功能,不妨来填个问卷

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值