我是靠谱客的博主 清新冰淇淋,这篇文章主要介绍QT+FFTW库 实现傅里叶变换傅里叶变换理论知识环境QT5.14.1+Mingw32+FFTW3.3,现在分享给大家,希望可以做个参考。

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文件

复制代码
1
2
3
4
5
6
D:Program FilesMicrosoft Visual Studio2022ProfessionalVCToolsMSVC14.34.31933binHostx64x86 ..BinHostx64:pc机是64位 ..BinHostx86:pc机是64位 Hostx64x86: 64位机器,要运行的编译环境是64位 Hostx64x86: 64位机器,要运行的编译环境是32位

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

复制代码
1
2
3
4
5
6
7
8
输入lib有输出正常 ([出错参考](https://blog.csdn.net/weixin_39914245/article/details/83689817)) lib /out:E:fftfftw-3.3.5-dll32libfftw3-3.lib /MACHINE:X64 /DEF:E:fftfftw-3.3.5-dll32libfftw3-3.def lib /out:E:fftfftw-3.3.5-dll32libfftw3f-3.lib /MACHINE:X64 /DEF:E:fftfftw-3.3.5-dll32libfftw3f-3.def lib /out:E:fftfftw-3.3.5-dll32libfftw3l-3.lib /MACHINE:X64 /DEF:E:fftfftw-3.3.5-dll32libfftw3l-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_ProjectMy_ModelBuildLocalFir
3.3项目的头文件右击添加现有文件:fftw3.h
3.4在pro文件配置编译指令,LIBS += -L$$PWD/lib/ -llibfftw3-3.lib

4.使用

4.1wight.h

复制代码
1
2
#include "fftw3.h"

4.2wight.cpp

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
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.结果

复制代码
1
2
可以看到13-20Hz信号

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

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

最后

以上就是清新冰淇淋最近收集整理的关于QT+FFTW库 实现傅里叶变换傅里叶变换理论知识环境QT5.14.1+Mingw32+FFTW3.3的全部内容,更多相关QT+FFTW库内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(81)

评论列表共有 0 条评论

立即
投稿
返回
顶部