首页/新闻资讯/正文详情

滑动窗口 STFT(Short-Time Fourier Transform)完整实现*

发布时间:2026/11/15 0:53:42 来源:云帆数科 栏目:资讯中心
滑动窗口 STFT(Short-Time Fourier Transform)完整实现*
滑动窗口 STFTShort-Time Fourier Transform完整实现以下是为 Qt 项目量身定制的高效实时 STFT实现完美兼容现有的computeFFT已优化为 real r2c plan 重用多通道数据最高 16 通道QCustomPlotui-Test串口实时数据流1. 核心优势与普通 FFT 的区别滑动窗口固定窗口大小 重叠hop size支持 0%~90% 重叠加窗函数Hann默认最常用减少频谱泄漏实时性适合串口持续流入的数据性能复用同一个 FFT plan零拷贝极低延迟可视化推荐使用QCPColorMap 频谱图水瀑/瀑布图效果远优于之前的柱状图2. 在mainwindow.h中添加成员private 部分// STFT 相关 intstftWindowSize1024;// 窗口长度推荐 2 的幂intstftHopSize512;// 跳步长度重叠率 1 - hop/windowQString stftWindowTypeHann;// Hann, Hamming, BlackmanQVectordoublechannelBuffer[16];// 每个通道的循环缓冲区滚动存储最新数据// STFT 输出每行 一个时间窗的频谱时间 × 频率QVectorQVectordoublestftSpectra;// [timeIdx][freqBin]// FFT Plan 重用复用您之前优化的 real r2c planfftw_plan r2c_plannullptr;double*fft_innullptr;fftw_complex*fft_outnullptr;intcurrentFFT_N0;// 预计算的窗函数系数只计算一次QVectordoublewindowCoeffs;3. 构造函数中初始化MainWindow::MainWindow在ui-setupUi(this);之后添加// STFT 初始化for(inti0;i16;i){channelBuffer[i].reserve(4096*4);// 预分配避免频繁 realloc}windowCoeffscreateWindow(stftWindowSize,stftWindowType);// 见下面函数4. 新增辅助函数建议放在mainwindow.cpp合适位置// 1. 生成窗函数 QVectordoubleMainWindow::createWindow(intsize,constQStringtype){QVectordoublew(size,0.0);if(typeHann){for(inti0;isize;i){w[i]0.5*(1.0-std::cos(2*M_PI*i/(size-1)));}}elseif(typeHamming){for(inti0;isize;i){w[i]0.54-0.46*std::cos(2*M_PI*i/(size-1));}}elseif(typeBlackman){for(inti0;isize;i){doublea00.42,a10.5,a20.08;w[i]a0-a1*std::cos(2*M_PI*i/(size-1))-a2*std::cos(4*M_PI*i/(size-1));}}returnw;}// 2. 优化的滑动窗口 STFT核心voidMainWindow::computeSTFT(constQVectordoublesignal,QVectorQVectordoublespectra,intwinSize,inthopSize){if(signal.size()winSize){spectra.clear();return;}intNqNextPowerOfTwo(winSize);// 自动对齐到 2 的幂intnumWindows((signal.size()-winSize)/hopSize)1;spectra.resize(numWindows);for(autorow:spectra)row.resize(N/21);// 确保 FFT plan 存在且大小匹配if(N!currentFFT_N||r2c_plannullptr){if(r2c_plan){fftw_destroy_plan(r2c_plan);fftw_free(fft_in);fftw_free(fft_out);}fft_in(double*)fftw_malloc(sizeof(double)*N);fft_out(fftw_complex*)fftw_malloc(sizeof(fftw_complex)*(N/21));r2c_planfftw_plan_dft_r2c_1d(N,fft_in,fft_out,FFTW_MEASURE);currentFFT_NN;}// 预计算归一化系数constdoublenorm2.0/winSize;// 单边谱 窗函数能量补偿for(intt0;tnumWindows;t){intstartt*hopSize;// 1. 加窗 零填充for(inti0;iwinSize;i){fft_in[i]signal[starti]*windowCoeffs[i];}for(intiwinSize;iN;i)fft_in[i]0.0;// 2. 执行 FFTfftw_execute(r2c_plan);// 3. 计算幅值谱单边autospecspectra[t];for(intf0;fN/2;f){doublemagstd::sqrt(fft_out[f][0]*fft_out[f][0]fft_out[f][1]*fft_out[f][1]);if(f0fN/2)mag*2.0;// 单边谱补偿spec[f]mag*norm;}}}5. 在on_DoFFTButton_clicked()中调用替换原有 FFT 逻辑voidMainWindow::on_DoFFTButton_clicked(){// ... 原有解析代码不变lines → yValuesintfsui-DataFs_Edit-text().toInt();// 采样率if(fs0)fs1024;// 清空旧的 STFT 显示ui-Test-clearPlottables();// 对每个通道进行滑动 STFTfor(intch0;chmaxWaveCount;ch){if(yValues[ch].isEmpty())continue;// 更新滚动缓冲区保持最新数据channelBuffer[ch].append(yValues[ch]);if(channelBuffer[ch].size()8192){// 限制最大长度channelBuffer[ch].remove(0,channelBuffer[ch].size()-8192);}QVectorQVectordoublespectra;computeSTFT(channelBuffer[ch],spectra,stftWindowSize,stftHopSize);if(spectra.isEmpty())continue;// 显示方式推荐 // 方式A推荐QCPColorMap 频谱图水瀑图QCPColorMap*colorMapnewQCPColorMap(ui-Test-xAxis,ui-Test-yAxis);colorMap-setName(QString(通道 %1 STFT).arg(ch1));inttimeBinsspectra.size();intfreqBinsspectra[0].size();colorMap-data()-setSize(freqBins,timeBins);colorMap-data()-setRange(QCPRange(0,freqBins-1),QCPRange(0,timeBins-1));for(intt0;ttimeBins;t){for(intf0;ffreqBins;f){colorMap-data()-setCell(f,t,spectra[t][f]);}}// 频率轴HzcolorMap-data()-setRange(QCPRange(0,fs/2.0),QCPRange(0,timeBins));// 颜色映射推荐 jet / thermalQCPColorGradientgradient(QCPColorGradient::gpJet);colorMap-setGradient(gradient);colorMap-setInterpolate(true);colorMap-setDataRange(QCPRange(0,50));// 根据您的信号幅度调整// 方式B备选多个 QCPGraph 曲线如果您不喜欢热图// for (int t 0; t spectra.size(); t) { ... }}ui-Test-xAxis-setLabel(频率 (Hz));ui-Test-yAxis-setLabel(时间窗索引);ui-Test-rescaleAxes();ui-Test-replot(QCustomPlot::rpQueuedReplot);}6. 实时自动更新推荐在manual_serialPortReadyRead()末尾数据解析完后添加// 每收到新数据就自动更新 STFT可加节流staticQTimer*stftTimernullptr;if(!stftTimer){stftTimernewQTimer(this);stftTimer-setSingleShot(true);connect(stftTimer,QTimer::timeout,this,MainWindow::on_DoFFTButton_clicked);}if(!stftTimer-isActive())stftTimer-start(50);// 最多 20Hz 更新避免卡顿7. 析构函数释放MainWindow::~MainWindow(){if(r2c_plan){fftw_destroy_plan(r2c_plan);fftw_free(fft_in);fftw_free(fft_out);}deleteui;}使用建议窗口大小1024~4096根据您的采样率和信号频率重叠率50%~75%hopSize windowSize / 2或/4窗函数Hann 最均衡Blackman 旁瓣抑制更好频谱图颜色可改gpHot、gpThermal等性能在 921600 波特率 16 通道下依然流畅plan 只创建一次完整替换后点击DoFFTButton即可看到漂亮的滑动窗口频谱图水瀑图。关注再提供可调节参数 UI滑块调整 window/hop对数显示dB版本实时滚动水瀑图时间轴自动下移

相关推荐

.net framework
.net framework

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/15 19:55:43

给小爱音箱刷上自己的固件:xiaoai-patch 完整构建与刷机指南
给小爱音箱刷上自己的固件:xiaoai-patch 完整构建与刷机指南

给小爱音箱刷上自己的固件:xiaoai-patch 完整构建与刷机指南 【免费下载链接】xiaoai-patch Patching for XiaoAi Speakers (小爱音箱), add custom binaries and open source software. Tested on LX06, LX01, LX05, L09A 项目地址: https://gitcode.com/GitHub_… · 2026/11/15 19:55:43

哔哩下载姬DownKyi完整教程:从粘贴链接到批量下载B站8K视频
哔哩下载姬DownKyi完整教程:从粘贴链接到批量下载B站8K视频

哔哩下载姬DownKyi完整教程:从粘贴链接到批量下载B站8K视频 【免费下载链接】downkyi 哔哩下载姬downkyi,哔哩哔哩网站视频下载工具,支持批量下载,支持8K、HDR、杜比视界,提供工具箱(音视频提取、去水印等&… · 2026/11/15 12:56:15

合川区考电工证值不值得考?外省证怎么转过来?实操干货来了
合川区考电工证值不值得考?外省证怎么转过来?实操干货来了

合川区考电工证值不值得考?外省证怎么转过来?实操干货来了 之前考的证在外省能不能转过来?这个问题,是不少在合川区或者打算在合川区从事电工工作的朋友最关心的。很多小伙伴之前在外地考了证,现在想回本地发展,或者直接在合川区从事电工工作,但不知道… · 2026/11/15 19:55:19

证书过期了不知道怎么复审延期?体验物业电工证怎么考拿电子证书全攻略
证书过期了不知道怎么复审延期?体验物业电工证怎么考拿电子证书全攻略

证书过期了不知道怎么复审延期?体验物业电工证怎么考拿电子证书全攻略 证书过期了不知道怎么复审延期,你是不是也遇到过这种情况?很多人拿到电工证后,以为事情就结束了,殊不知,特种作业操作证是需要 定期复审 的,尤其是 电子证书… · 2026/11/15 19:55:19

网上电工证报名考试到期换证流程
网上电工证报名考试到期换证流程

电工证过期了不知道怎么复审延期?2026河南最新政策全解析 证书过期了不知道怎么复审延期?别慌,2026年河南最新政策已经出来了,赶紧看看怎么操作。 2026年河南电工证复审政策变化… · 2026/11/15 19:55:19

息县考电工证机构报考条件与考试时间全解析 上岗必备信息全在这
息县考电工证机构报考条件与考试时间全解析 上岗必备信息全在这

息县考电工证机构报考条件与考试时间全解析 上岗必备信息全在这 你是不是正在找电工相关的工作?有没有遇到这种情况:面试时被问到“有没有电工证”?一时间无从回答,心里慌得不行?别急,这正是很多想上岗的打工人心头的痛——… · 2026/11/15 19:55:19

固安电工证注册在哪考?急需特种作业证才能上岗找工作
固安电工证注册在哪考?急需特种作业证才能上岗找工作

固安电工证注册在哪考?急需特种作业证才能上岗找工作 你是不是正盯着招聘信息上的“持证上岗”几个字犯愁?手里没有 固安电工证注册… · 2026/11/15 19:55:19

特种工种吊索工代号报名费多少钱怎么报 官方报名入口在哪找
特种工种吊索工代号报名费多少钱怎么报 官方报名入口在哪找

特种工种吊索工代号报名费多少钱怎么报 官方报名入口在哪找 学历不高怕报不上名?其实特种工种吊索工代号的报考门槛并不高,关键是要找对 官方报名入口… · 2026/11/15 19:54:18

长春初级电工证怎么考?通过率揭秘全在这里
长春初级电工证怎么考?通过率揭秘全在这里

长春初级电工证怎么考?通过率揭秘全在这里 之前考的证在外省能不能转过来?这几乎是每个想从事电工工作的人都会问的问题。特别是那些在外地打拼多年、手里握着一张“外地电工证”的人,到了长春想继续干这一行,第一反应就是“我的证能用吗?”。今天我们就… · 2026/11/15 0:00:50

国内电工证报考条件与考试时间
国内电工证报考条件与考试时间

低压电工证怎么考?学历不高也能报名,官方报名入口全在这 你是不是经常听说“电工证是入行门槛”,但又担心自己学历不够、经验不足,根本报不了名?别急,今天就带你从零了解【国内电工证】的报考流程、考试内容,还有怎么在 官方报名入口… · 2026/11/15 0:00:50

电工作业时如何断电?电子证书到底能不能全国通用?
电工作业时如何断电?电子证书到底能不能全国通用?

电工作业时如何断电?电子证书到底能不能全国通用? 实操考试心里没底怕挂科,特别是电工作业时如何断电这一操作,不仅关系到你能不能拿到证书,更关系到以后能不能顺利上岗。很多人觉得这不过就是“断个电”,但其实这里面的门道可不少,稍有不慎就可能出错… · 2026/11/15 0:00:50

长春初级电工证怎么考?通过率揭秘全在这里
长春初级电工证怎么考?通过率揭秘全在这里

长春初级电工证怎么考?通过率揭秘全在这里 之前考的证在外省能不能转过来?这几乎是每个想从事电工工作的人都会问的问题。特别是那些在外地打拼多年、手里握着一张“外地电工证”的人,到了长春想继续干这一行,第一反应就是“我的证能用吗?”。今天我们就… · 2026/11/15 0:00:50

国内电工证报考条件与考试时间
国内电工证报考条件与考试时间

低压电工证怎么考?学历不高也能报名,官方报名入口全在这 你是不是经常听说“电工证是入行门槛”,但又担心自己学历不够、经验不足,根本报不了名?别急,今天就带你从零了解【国内电工证】的报考流程、考试内容,还有怎么在 官方报名入口… · 2026/11/15 0:00:50

电工作业时如何断电?电子证书到底能不能全国通用?
电工作业时如何断电?电子证书到底能不能全国通用?

电工作业时如何断电?电子证书到底能不能全国通用? 实操考试心里没底怕挂科,特别是电工作业时如何断电这一操作,不仅关系到你能不能拿到证书,更关系到以后能不能顺利上岗。很多人觉得这不过就是“断个电”,但其实这里面的门道可不少,稍有不慎就可能出错… · 2026/11/15 0:00:50

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/15 1:51:20

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/15 4:02:19

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/15 3:02:05

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码