短时傅立叶变换 (STFT) 信号处理工具包
项目介绍
本项目提供了一个完整的短时傅立叶变换(STFT)MATLAB 实现方案,旨在分析和处理非稳态信号。传统的傅立叶变换在处理频率随时间变化的信号时,无法同时提供时域和频域的信息。本工具包通过滑动窗口技术,将时域信号分解为一系列短时片段,并对每一片段进行频谱分析,从而生成能够准确反映频率演变规律的时频联合分布。
该工具包完全采用原生数学公式编写,不依赖 MATLAB 信号处理工具箱(Signal Processing Toolbox),具有极高的可移植性和自包含性。
核心功能特性
- 纯代码实现,零库依赖:手动实现了包括线性调频信号生成(Chirp)、汉明窗(Hamming)、汉宁窗(Hann)及矩形窗(Rectangular)在内的基础数学函数,确保在无工具箱环境下仍能正常运行。
- 灵活的参数配置:支持自定义窗口长度(Window Length)、重叠采样点数(Overlap)、FFT 计算点数(NFFT)以及多种窗函数类型,方便用户在时间分辨率和频率分辨率之间进行权衡。
- 多维度可视化:内置了完整的数据可视化功能,可自动生成原始时域波形图、二维分贝刻度语谱图(Spectrogram)以及三维时频能量映射图。
- 鲁棒的信号处理流程:通过计算步长(Hop Size)进行窗口滑动,应用加窗处理以消除频谱泄露,并仅提取单边谱以优化存储和显示效率。
系统要求- 软件环境:MATLAB R2016a 或更高版本(理论支持更低版本,因代码仅依赖基础数学运算)。
- 硬件要求:无特殊要求,由于算法经过优化,普通 PC 即可快速处理秒量级的信号。
功能实现逻辑本项目的主逻辑分为四个阶段:
- 信号仿真阶段:
程序首先模拟生成一个复杂的非稳态测试信号。该信号包含一个从 100Hz 线性增长到 500Hz 的调频信号(Chirp),以及一个在 0.4s 至 0.7s 之间出现的 800Hz 短时正弦脉冲。最后,向混合信号中添加高斯白噪声,以模拟真实的物理采集环境。
- STFT 配置阶段:
用户可以指定分析参数。默认配置采用 256 点窗口长度、192 点重叠(75% 重叠率)以及 512 点 FFT 长度。这些参数共同决定了时频谱的平滑度和精细度。
- 核心算法执行阶段:
*
矩阵化与预处理:将输入信号转换为列向量,并根据所选类型生成相应的加窗权重。
*
分帧处理:根据窗口长度和重叠量计算滑动步长,确定总帧数。
*
循环迭代:在每一帧中,截取信号片段,乘以窗函数以减少边界效应,随后执行快速傅立叶变换。
*
单边谱提取:由于实信号频谱的对称性,算法仅保留 $0$ 到 $f_s/2$ 的正频率部分。
- 结果转换与绘图阶段:
将计算出的复数矩阵转换为幅值,并基于对数刻度(dB)生成二维热力图。同时利用坐标网格(Meshgrid)技术构建三维曲面,直观展示能量在时间-频率平面上的分布。
关键算法模块解析
利用线性频率调制公式 $f(t) = f_0 + beta t$ 手动实现。通过相位积分计算瞬时相位,生成频率随时间线性变化的余弦波形。
项目内置了汉明窗和汉宁窗的数学定义。通过余弦函数构造权重向量,使窗口两端平滑衰减至零附近。这种处理能显著降低由于信号截断导致的频谱泄露,提升频率识别的准确性。
算法能够精确计算并返回频率轴和时间轴。频率轴根据采样频率和 FFT 点数进行等分;时间轴则精准对应每个滑动窗口的中心位置,确保可视化结果与物理时间完全吻合。
利用插值着色技术(Shading Interp),将 STFT 的幅值矩阵投影到三维空间。Z 轴代表能量强度,这种表现形式对于识别特征信号的突发能量点尤为有效。
使用指南
- 参数调节:若需提高频率分辨率(看清更细微的频率成分),应增大 NFFT 或窗口长度;若需提高时间分辨率(捕捉更快速的瞬时变化),应减小窗口长度并增加重叠点数。
- 信号输入:用户只需将自己的信号向量赋值给程序中的信号变量,并相应修改采样频率参数即可。
- 结果获取:核心函数会返回复数频谱矩阵、频率刻度向量和时间刻度向量,方便用户进行后续的特征提取或机器学习模型训练。