QT实现FFT整体流程及结果展示

一.实现流程

信号采集-----加窗处理-----FFT-----滤波处理-----图形展示

二.傅里叶变换介绍

1.傅里叶变换被广泛用于信号处理领域,如音频、图像和视频处理。通过将信号分解成不同的频率分量,可以从频域的角度分析信号,进行滤波、去噪、压缩等操作。

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

3.窗函数在傅里叶变换中主要有两个作用:

减少频谱泄露和提高频谱分辨率:在实际应用中,我们通常无法获取无限长的信号,因此需要对信号进行截断。但这种截断会在频谱上引入副瓣,即频谱泄露。通过使用窗函数,可以控制这种频谱泄露,从而提高频谱的分辨率。

纠正信号的相位偏差:窗函数可以使接头的边缘平滑,从而消除频谱中的细碎锯齿。

三.程序实现

1.环境QT5.12+Mingw64+FFTW3.3

(1)下载FFTW 3.3.5 Windows DLLs

https://www.fftw.org/install/windows.html

(2)QT项目配置

A.将fftw3.h和libfftw3-3.lib,libfftw3l-3.lib,libfftw3f-3.lib(三种精度,也可任选其中之一)

B.将libfftw3-3.dll,libfftw3l-3.dll,libfftw3f-3.dll文件放到文件构建的目录下,项目构建目录可在QT左边“项目”中查看构建目录位置

C.项目的头文件右击添加现有文件:fftw3.h

D.在pro文件配置编译指令,LIBS += -L$$PWD/lib/ -llibfftw3-3.lib

2.程序实现

(1)mainwindow.h 内添加:#include "fftw3.h"

(2)mainwindow.c实现:

// 定义生成汉宁窗的函数

Void generateHanningWindow(int windowSize , double value)

{

     for (int n = 0; n < windowSize; ++n) {

        value = value*(0.5 - 0.5 * cos(2.0 * M_PI * n / (windowSize - 1)));

    }

        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

    {

        in[i] = EndEEGData[i];

generateHanningWindow(FFTWN, in[i] );

    }

         my_plan = FFTW3_H::fftw_plan_dft_r2c_1d(FFTWN, in, out, FFTW_ESTIMATE);

     fftw_execute(my_plan);

     QVector data_power;

     QVector data_power_x;

     QVector 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()<<"信号频域图绘制完成";

(3)可以对频率结果进行高通、低通或者带通滤波处理,也可以进行其他的滤波处理

(4)QT输出二维频域图有多种实现方式,本次实验使用开源库QCustomPlot实现:

     官网:Qt Plotting Widget QCustomPlot - Introduction

     官网内有具体实现示例,再次不再赘述。

3.绘图结果

QT实现FFT整体流程及结果展示_第1张图片

你可能感兴趣的:(QT系列,qt,开发语言,前端,物联网)