QT+FFTW库 实现傅里叶变换

傅里叶变换理论知识

DFT(FFT)结果,采样率,信号频谱的理解 - 知乎 (zhihu.com)]
(28条消息) FFT与采样点数的关系原理_CodingAsura的博客-CSDN博客_fft点数和采样点数

概括为:假设采样频率为Fs,采样点数为N,做FFT之后,某一点n(n从1开始)表示的频率为:Fn=(n-1)*Fs/N;该点的模值除以N/2就是对应该频率下的信号的幅度(对于直流信号是除以N),根据麦奎斯特采样定理,只有在采样率高于模拟信号包含频率的最高频率的两倍,我们看到的才是真实的频谱,采样频率如果达不到真实信号最高频率的两倍的话,真实最高频率信号所对应的幅值就会叠加到频率较低的信号上

环境QT5.14.1+Mingw32+FFTW3.3

1.下载FFTW包 ,下载库文件Win运行用要用的dll文件

fftw资源下载:fftw

2.win下lib文件链接用;dll运行用使用Visual Studio的lib.exe工具生成链接用的lib文件

2.1.找到所需lib.exe文件

D:\Program Files\Microsoft Visual Studio\2022\Professional\VC\Tools\MSVC\14.34.31933\bin\Hostx64\x86
	..Bin\Hostx64:pc机是64位
	..Bin\Hostx86:pc机是64位
	\Hostx64\x86: 64位机器,要运行的编译环境是64位
	\Hostx64\x86: 64位机器,要运行的编译环境是32位

2.2以管理员打开CMD,进入lib.exe的目录

输入lib有输出正常	([出错参考](https://blog.csdn.net/weixin_39914245/article/details/83689817))
	lib /out:E:\fft\fftw-3.3.5-dll32\libfftw3-3.lib /MACHINE:X64 /DEF:E:\fft\fftw-3.3.5-dll32\libfftw3-3.def
	lib /out:E:\fft\fftw-3.3.5-dll32\libfftw3f-3.lib /MACHINE:X64 /DEF:E:\fft\fftw-3.3.5-dll32\libfftw3f-3.def
	lib /out:E:\fft\fftw-3.3.5-dll32\libfftw3l-3.lib /MACHINE:X64 /DEF:E:\fft\fftw-3.3.5-dll32\libfftw3l-3.def

	lib /out:(LIB文件生成目录) /MACHINE:X64 /DEF:(def文件目录)
	/MACHINE:IX86:32位机器,/MACHINE:X64:64位机器

2.3至此程序链接和运行用的文件均已拥有

3.QT项目配置

3.1将fftw3.h和libfftw3-3.lib,libfftw3l-3.lib,libfftw3f-3.lib(三种精度,也可任选其中之一)
 复制项目目录(.pro文件所在目录)。
3.2.将libfftw3-3.dll,libfftw3l-3.dll,libfftw3f-3.dll文件放到文件构建的目录下
  项目构建目录可在QT左边“项目”中查看为****_MinGW_32bit-Debug
  我的是:E:\QT_Project\My_Model\BuildLocal\Fir
3.3项目的头文件右击添加现有文件:fftw3.h
3.4在pro文件配置编译指令,LIBS += -L$$PWD/lib/ -llibfftw3-3.lib

4.使用

4.1wight.h

		 #include "fftw3.h"

4.2wight.cpp

	    int FFTWN = EEGDATALENGTH*AllNum ; //采集点数目
	    int FFTWNFs = 1000;    //采集频率,1000hZ
	
	     double *in;
	    fftw_complex *out;
	    fftw_plan my_plan;
	   // in = (fftw_complex *)fftw_malloc(sizeof(fftw_complex) * FFTWN);
	    in = (double *)fftw_malloc(sizeof( double) * FFTWN);
	    out = (fftw_complex *)fftw_malloc(sizeof(fftw_complex) * FFTWN);
	
	
	    for (int i = 0; i <FFTWN; i++)
	    {
	        in[i] = EndEEGData[i];
	    }
           my_plan = FFTW3_H::fftw_plan_dft_r2c_1d(FFTWN, in, out, FFTW_ESTIMATE);
	    fftw_execute(my_plan);
	
	
	     QVector<double> data_power;
	     QVector<double> data_power_x;
	     QVector<double> data_freq;
	
	
	    for( int i = 0; i < FFTWN/2+1; i++) 
	    {
	     data_power.append((out[i][0] * out[i][0] + out[i][1] * out[i][1])/(FFTWNFs*FFTWN));
	     data_freq.append((double)FFTWNFs / FFTWN*i);
	    }
	    fftw_destroy_plan(my_plan);
	    fftw_free(in);
	    fftw_free(out);
	
	    WaveInSignal->SetxAxisRange(0, FFTWNFs/2);
	    WaveInSignal->SetyAxisRange(0,10);
	    WaveInSignal->SetData(data_freq, data_power);
        qDebug()<<"输入信号频域图绘制完成";

5.结果

	可以看到13-20Hz信号

原始数据结果:
  原始数据结果:

放大后::请添加图片描述
原始数据滤波后:原始数据滤波后:请添加图片描述

  • 6
    点赞
  • 90
    收藏
    觉得还不错? 一键收藏
  • 12
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值