傅里叶变换理论知识
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信号
原始数据结果:
文章来源:https://www.toymoban.com/news/detail-414217.html
放大后::
原始数据滤波后:文章来源地址https://www.toymoban.com/news/detail-414217.html
到了这里,关于QT+FFTW库 实现傅里叶变换的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!