QT+FFTW库 实现傅里叶变换

QT实现傅里叶变换

  • 傅里叶变换理论知识
  • 环境QT5.14.1+Mingw32+FFTW3.3
    • 1.下载FFTW包 ,下载库文件Win运行用要用的dll文件
    • 2.win下lib文件链接用;dll运行用使用Visual Studio的lib.exe工具生成链接用的lib文件
      • 2.1.找到所需lib.exe文件
      • 2.2以管理员打开CMD,进入lib.exe的目录
      • 2.3至此程序链接和运行用的文件均已拥有
    • 3.QT项目配置
    • 4.使用
      • 4.1wight.h
      • 4.2wight.cpp
    • 5.结果

傅里叶变换理论知识

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信号

原始数据结果:
QT+FFTW库 实现傅里叶变换_第1张图片

放大后::QT+FFTW库 实现傅里叶变换_第2张图片
原始数据滤波后:QT+FFTW库 实现傅里叶变换_第3张图片

你可能感兴趣的:(QT,qt,windows,傅里叶分析)