基于MATLAB的短时傅立叶变换(STFT)处理系统 README
项目介绍
本项目是一个基于MATLAB开发的短时傅立叶变换(STFT)综合分析系统。该系统专门设计用于处理非平稳信号,能够揭示信号的频率成分随时间变化的动态特征。通过采用先进的滑动窗机制,系统将连续的时间序列分解为多个微小的段落进行局部分析,从而克服了传统傅立叶变换(FFT)在处理时变信号时缺乏时间定位能力的缺陷。本系统广泛适用于语音处理、音频分析、故障预测及任何需要时频联合分析的科研与工程领域。
功能特性
- 非平稳信号合成:系统内置了测试信号发生器,包含线性频率扫描(Chirp)信号、突发性正弦信号以及高斯白噪声,用于模拟复杂的实际信号环境。
- 灵活的窗机制:支持多种经典窗函数(Hamming、Hann、矩形窗),可有效抑制频谱泄露,并支持通过手动调整窗长度来优化时频分辨率。
- 重叠处理技术:通过设置相邻帧之间的重叠点数(Overlap),提高时间轴上的采样密度,使语谱图更加平滑,捕捉瞬态变化更为精准。
- 标准化频谱输出:自动计算单边频谱,并将采样点索引映射到真实的频率(Hz)和时间(s)轴。
- 可视化热力图:生成的语谱图采用分贝(dB)度量进行对数增强显示,能够清晰展示微弱信号的特征。
实现逻辑与算法说明
该系统的核心执行流程严格遵循信号处理的标准规范:
1. 初始化与信号预处理
程序首先定义采样频率、时间范围,并通过数学公式构造待分析的合成信号。该信号包含两个主要阶段:前一秒主要由频率线性增长的扫频信号构成,后一秒叠加了固定频率的单频正弦波,最后加入噪声以测试算法的鲁棒性。
2. 参数配置
用户可自定义四个关键参数:
- 窗长度:控制每次变换的数据量。
- 重叠点数:决定滑动步幅。
- FFT点数:控制频率轴的细分程度。
- 窗类型:选择特定的权重函数。
3. 核心STFT算法实现
算法的核心在一个独立的计算函数中实现,其逻辑步骤如下:
- 预分配空间:根据信号总长度和步长计算总帧数,并预先创建输出矩阵以提高运行效率。
- 滑动窗口循环:利用步长(窗长减去重叠点)在信号上滑动。在每一次迭代中,提取当前长度的信号帧。
- 加窗处理:将提取的帧与选定的窗函数进行点乘,以减少信号截断导致的旁瓣干扰。
- 离散傅立叶变换:对每一帧加窗信号执行FFT计算。
- 频谱截取:由于实信号频谱具有对称性,程序仅提取前一半频率分量(即单边谱)存储到矩阵的对应列中。
4. 结果映射与显示
程序将计算出的复数矩阵转换为模值(幅值),并进一步转换为功率分贝值。通过坐标转换公式,将矩阵的行和列分别对应到物理频率和物理时间,最终利用热力图进行展示。
关键函数与细节分析
- 计算核心函数:该函数直接实现了STFT的数学定义。它不仅处理FFT的计算,还负责管理时间窗口的滑动索引,确保信号在处理过程中不丢失相位连续性。
- 窗函数手动实现:为减少对特定功能工具箱的依赖,项目中手动实现了Hamming窗和Hann窗。通过余弦函数的组合生成权重向量,确保了代码在不同MATLAB版本下的兼容性。
- 线性扫频信号生成器:根据瞬时相位公式实现。通过对频率随时间线性变化的规律进行积分得到相位,从而生成频率动态演变的余弦波。
- 时频轴坐标计算:
* 频率轴:基于采样率分之FFT点数的原则进行等分。
* 时间轴:取每一帧窗口的中点位置作为该帧的时间戳,确保语谱图与时域波形在时间轴上精确对齐。
使用方法
- 确保您的计算机已安装MATLAB软件。
- 将系统提供的源代码脚本保存为.m文件。
- 在MATLAB命令行窗口中直接运行主函数。
- 程序运行后将自动弹出图形窗口,上方展示原始时域波形,下方展示计算得到的STFT语谱图。
- 如需分析不同信号,可直接修改参数设置区的窗口长度或FFT点数,观察时频分辨率的变化。
系统要求
- 软件环境:MATLAB及其基础运行环境。
- 工具箱要求:本系统采用了高度自包含的设计,所有核心算法(包括窗函数和信号生成)均由原生MATLAB代码实现。即使在没有信号处理工具箱(Signal Processing Toolbox)的环境下,核心功能依然可以正常运行。