加窗傅立叶变换 (STFT) 源程序说明文档
项目介绍
本项目提供了一个纯MATLAB代码实现的短时傅立叶变换(STFT)工具,用于分析非平稳信号的时频特性。非平稳信号的频率成分随时间变化,而传统的傅立叶变换无法提供频率随时间演变的信息。本程序通过滑动窗口技术,将连续信号划分为多个小段,在每个时段内进行频谱分析,从而生成能够同时反映时间分布和频率信息的时频分布图(Spectrogram)。
功能特性
- 信号合成仿真:程序内置了一个复杂的非平稳信号生成模块,包含线性扫频信号(Chirp)、多段叠加的单频正弦波以及高斯白噪声,用于模拟实际工程中的复杂振动或通信信号。
- 自定义窗函数库:手动实现了汉明窗(Hamming)、汉宁窗(Hann)和矩形窗(Rectangular)算法,不依赖外部信号处理工具箱,增强了代码的可移植性。
- 灵活的参数配置:用户可自由调整采样频率、窗函数长度、窗口重叠比例和FFT点数,以平衡时间分辨率和频率分辨率。
- 动态时频可视化:自动计算并在不同子图中绘制原始时域波形图以及双向坐标轴对齐的时频能量分布热力图。
- 分辨率定量分析:程序自动计算并输出当前的等效时间分辨率(ms)和频率分辨率(Hz),为分析精度提供参考依据。
实现逻辑
程序遵循标准短时傅立叶变换的处理流程,具体逻辑如下:
- 参数初始化:设定采样频率及时间向量,合成包含频率突变和扫频特征的测试信号。
- 窗函数构建:根据用户选择的类型(如汉明窗),依据数学公式
0.54 - 0.46 * cos(2*pi*n/(M-1)) 生成相应权值向量。 - 分段计算准备:计算窗口滑动的步长(L - Overlap),并确定信号经过分段后能产生的总列数。
- 滑动窗口循环:
* 截取当前时间窗口内的信号段。
* 执行去直流预处理(减去信号段均值)。
* 将信号段与窗函数执行点乘。
* 对加窗后的段进行快速傅立叶变换(FFT)。
* 计算当前窗口中心点对应的时间戳。
- 频谱处理:
* 针对实信号,截取FFT结果的前半部分(正频率区域)。
* 计算单边功率谱密度(PSD)。
* 执行对数变换,将能量转换为分贝(dB)量级。
- 结果绘图:利用绘图函数展示时域信号和时频矩阵,并调整坐标系和颜色映射以便于观察信号演进。
关键算法与实现细节
- 非平稳信号构造:信号由一个频率随时间从50Hz增长到400Hz的扫频分量,以及在不同时间段切入的150Hz和300Hz纯音组成,最后叠加0.1倍标准差的随机噪声。
- 归一化与直流抑制:在进入FFT之前,程序对每个分段执行了减均值操作。这可以有效抑制零频率处的能量集中,使得时频图中的变化分量更加突出。
- 能量计算公式:功率谱密度采用了
(abs(X)^2) / (nwin * Fs) 的计算方式,并在取对数前加入了微小量(eps)以规避数学上的对数零点异常。 - 时频对齐:时间向量的计算基于当前窗口的几何中心点
(idx_start + nwin/2) / Fs,确保了时频图在时间轴上的对应关系准确。 - 可视化优化:使用了
imagesc 函数并配合 axis xy 指令,使纵坐标频率从小到大排列,且应用了 jet 色板来直观区分能量强弱。
使用方法
- 参数调节:在程序开头修改
nwin(窗长)和 noverlap(重叠点数)。较大的 nwin 会提高频率分辨率但降低时间分辨率,反之亦然。 - 窗函数选择:修改
window_type 变量为 'hamming'、'hann' 或 'rect' 以对比不同窗函数对频谱泄露的抑制效果。 - 运行程序:在MATLAB环境中直接运行脚本,程序将自动弹出图形窗口展示分析结果。
- 查看结果:通过命令行输出窗口可以查看当前配置下的理论分辨率数据和生成的矩阵维度信息。
系统要求
- 软件环境:MATLAB R2016a 或更高版本。
- 依赖项:仅需MATLAB基础功能。程序已手动实现窗函数计算,无需安装 Signal Processing Toolbox(信号处理工具箱)。