简介:MATLAB时频分析工具箱是一套面向信号处理研究人员、工程师及学生的专业工具包,专注于非平稳信号的时频联合分析。其中集成短时傅立叶变换、小波变换、希尔伯特-黄变换、多分辨率分析等主流算法,并配有可视化绘图与多种预设窗口函数,可帮助用户深入观察信号频率随时间的变化规律,从而更准确地刻画非平稳信号特征。资源共157个文件,以m函数源码为主体,辅以mat数据示例、tex文档、txt说明及少量日志与PostScript文件,压缩包约2.21MB,结构紧凑便于本地部署与二次开发。已有2027人学习下载,特别适合用于课程实验、科研仿真或工程项目中的时频特征提取。通过研读源码与运行自带演示程序,读者可以快速理解各算法实现原理,掌握时频图、瞬时频率谱等核心输出,并进一步扩展自定义分析方法,以满足特定研究需求。
1. Matlab 时频分析工具箱:先解决“有没有”,再解决“准不准”
频谱分析只能告诉你信号里“有哪些频率”,但说不清这些频率“什么时候出现”。齿轮故障早期的冲击响应、变频器拖动下的电机电流、脑电里的棘波,都是频率成分随时间变化的非平稳信号,用 FFT 整段变换会把时间信息完全抹掉。Matlab 时频分析工具箱要解决的正是这个问题:它把短时傅里叶变换、连续小波变换、Hilbert-Huang 变换、同步压缩变换这些方法封装成可复用的函数,安装它的意义不只是给 Matlab 增加一个工具包,而是获得一整套处理非平稳信号的数值实现。安装这件事本身不难,难点在于版本匹配、路径配置,以及装完之后如何验证每个函数的结果可信。下面按选型、安装、参数、验证四个环节把这条路走通。
2. 选型与原理:时频分析为什么要依赖工具箱而不是手写公式
2.1 非平稳信号的频域信息是“流动的”,静态频谱会掩盖故障特征
平稳信号用傅里叶变换没有问题,但工程里遇到的多半不是平稳信号。以电机轴承故障为例,故障点每次经过承载区都会产生一个冲击,冲击的间隔由转频决定,冲击本身又激励起轴承结构的高频共振。整段信号做 FFT,频谱上能看到共振频率附近有一簇高幅值成分,但看不出这些成分和转频的对应关系,也就难以定位故障源。时频分析的做法是先把信号按时间切段,对每一段做局部频谱,再把结果拼成一张时间-频率-幅值的三维图谱。这个过程理论上手写也不复杂,核心就是加窗和 FFT 循环,但实际落地时会遇到三个绕不开的问题。
第一个问题是窗函数的选择与归一化。手写短时傅里叶变换时,窗口类型直接影响频谱泄漏,矩形窗的主瓣窄但旁瓣高,Hamming、Hann 窗旁瓣低但主瓣宽,工具箱内部对窗函数做了能量归一化,保证不同窗长下幅值可比。第二个问题是时间轴与频率轴的网格对齐。spectrogram 输出的是经过 76% 重叠率拼接后的时间点,手写循环时每次窗移动的比例稍有差池,时间轴就偏了,后续提取瞬时频率时误差会被放大。第三个问题是边界效应。信号首尾处窗口内的数据不足,工具箱默认会用零填充或截断策略,并在文档里明示边界点的处理方式,这一点手写时极容易忽略。
2.2 STFT、CWT、HHT、FSST:四种方法的适用边界对照
时频分析工具箱通常同时提供多条技术路线,不同路线对信号的假设完全不同。短时傅里叶变换(STFT)假设信号在窗口内是平稳的,窗口长度决定了时间和频率分辨率的折中,对大多数工程信号够用。连续小波变换(CWT)不受固定窗长限制,低频段用长窗、高频段用短窗,频率分辨率在高频端比 STFT 差一些,但低频端更细腻。Hilbert-Huang 变换(HHT)走的是经验模态分解路线,不假设信号由固定基函数叠加而成,对于频率调制很强的信号往往比 STFT 更敏锐,但分解结果受停止条件影响,可重复性需要额外验证。同步压缩变换(FSST)是在 STFT 基础上对频率估计做挤压重排,时频脊线更清晰,是可逆变换,适合信号重构场景。
| 方法 | 基函数/分解方式 | 时频聚集性 | 可逆性 | 典型瓶颈 |
|---|---|---|---|---|
| STFT | 固定窗长的傅里叶基 | 一般 | 可逆(ISTFT) | 窗长不可调,分辨率折中 |
| CWT | 缩放平移的小波基 | 低频好 | 可逆(需特定小波) | 高频端频率分辨率有限 |
| HHT | 经验模态分解 | 高 | 不可逆 | 模态混叠、端点效应 |
| FSST | STFT 后再挤压 | 高 | 可逆 | 对噪声敏感,参数依赖窗函数 |
实际选型时,我的判断依据是信号的可重复性和计算量。批量处理振动数据时优先用 STFT,因为它计算最快、参数可解释性强,结果便于和其他算法对接;处理含强调频成分的故障信号时优先试 FSST,脊线提取比 STFT 干净;HHT 一般放在分析阶段的最后,用前几种方法看不出清晰特征时才走 EMD。CWT 用于需要对低频细节做深挖的场景,比如分析转速缓慢上升过程中的低频振动分量。工具箱的价值在于把函数接口统一起来,切换算法时不需要重写整条数据管线,只需要替换时频变换函数。
2.3 官方工具箱与第三方时频分析工具箱的取舍
Matlab 官方的 Signal Processing Toolbox 提供 spectrogram、cwt、fsst 等核心函数,Wavelet Toolbox 补齐了小波时频分析的匹配追踪和阈值去噪。对大多数用户而言,这两个官方工具箱已经覆盖了时频分析的主干需求。第三方时频分析工具箱,比如以 TFTB 为代表的开源实现,胜在分布函数族完整,Wigner-Ville 分布及其各种变体、Cohen 类分布都有现成函数,适合做算法对比研究。从部署角度来看,官方工具箱的 license 管理和版本兼容性更省心,函数接口跨版本稳定性好;第三方工具箱安装灵活,只要把目录加入路径即可,但维护节奏不可控,换一个 Matlab 大版本后可能因为内置函数冲突而报错。如果刚接触这一块,先用官方函数把数据管线跑通,再根据具体需求引入第三方补充函数,比一开始就堆工具包更稳健。
3. Matlab 时频分析工具箱安装:版本匹配、路径配置与最小验证环境
3.1 安装前先做两件事:确认版本依赖与是否已有前置工具箱
安装时频分析工具箱之前最容易踩的坑是版本依赖。spectrogram 在老版本和新版本的输出格式有差异,R2016b 之前 cwt 的语法是 cwt(x, scales, 'wname'),R2016b 之后变成了 cwt(x, fs),scale 的构造细节被封装到内部。官方第三方的许多工具箱也是在某几个版本上验证过的,跨版本使用的风险不可忽略。建议安装过程里先执行 ver('signal') 和 ver('wavelet') 确认基础工具箱已装,版本号在 R2016b 以上再继续。命令行输入 ver 会列出已安装工具箱列表,其中 Signal Processing Toolbox 和 Wavelet Toolbox 的状态必须为 true。
如果发现缺少前置工具箱,先通过 Matlab 的 Add-On Explorer 搜索补装,再安装时频分析工具箱本体。补装过程不复杂,但要注意 Add-On 安装在默认用户目录,和后续手动添加第三方工具箱的路径目录不要混用,否则重启后容易出现“找不到 functions”的提示。
3.2 两种安装路径:Add-On 自动安装与手动 addpath 配置
官方渠道的安装最简单。打开 Matlab 的“主页-附加功能-获取附加功能”,搜索目标工具箱名称,点击安装后由 Matlab 自动完成路径配置和许可证关联。这种安装方式适合官方发布或经过 MathWorks 审核的标准工具箱,函数可以通过 which 命令直接定位。
第三方工具箱或者从内部代码库分发的自制时频分析工具箱,我通常手动安装。先把整个工具箱文件夹复制到固定目录,例如 D:\toolboxes\tftb,然后执行如下命令:
addpath(genpath('D:\toolboxes\tftb')); savepath; which spectrogram; ver('signal');这段命令里 addpath 把这目录及其全部子目录加入当前会话的搜索路径,genpath 用于递归生成子目录路径列表,避免漏掉嵌套在各子目录中的核心函数。savepath 把当前路径配置持久化保存到 pathdef.m,否则重启 Matlab 后路径设置全部丢失。which spectrogram 的返回结果是完整的绝对路径,看到路径指向 D:\toolboxes 而不指向其他目录,说明工具箱生效。ver 输出包含版本号,便于核对与当前 Matlab 主版本的兼容性。这里有一个容易忽视的细节:savepath 在权限不足时可能静默失败,保存后要检查命令行是否输出红色错误提示;如果公司电脑默认用户目录没有写入权限,用 savepath('E:\MatlabConfig\pathdef.m') 将路径配置导出到自定义位置,再在启动脚本中引用这个配置文件。
3.3 最小验证环境:合成 chirp 信号确认谱图绘制正确
装完工具之后,我建议用一段已知属性的合成信号建最小验证环境。下面这段代码生成 0 到 2 秒内、频率从 80 Hz 线性增长到 200 Hz 的扫频信号,叠加 200 Hz 固定正弦波,做时频变换后观察两条频率轨迹:
fs = 1000; t = 0:1/fs:2 - 1/fs; x = chirp(t, 80, 2, 200, 'linear') + 0.5 * sin(2*pi*200*t); [s, f, tout, p] = spectrogram(x, hann(128), 100, 256, fs); imagesc(tout, f, 10*log10(p)); axis xy; xlabel('时间 (s)'); ylabel('频率 (Hz)');代码里 hann(128) 是 128 点 Hann 窗,窗口长度对应时域分辨率约 0.128 秒;noverlap 设为 100,即每帧之间有 78% 的重叠,时间轴插值更密;NFFT 为 256 点,频率分辨率为 fs/256 ≈ 3.9 Hz。imagesc 绘制时间-频率平面,纵轴通过 axis xy 翻转保证正频率在上方。运行后能看到一条从 80 Hz 连到 200 Hz 的斜线贯穿整个时间轴,同时在 200 Hz 处有一条水平亮带与斜线交汇。斜线是 chirp 分量的瞬时频率,水平线是叠加的正弦分量。两者同时可见,说明函数调用、依赖库和图形渲染链路都正常。
3.4 安装后验证工具箱的 4 个关键命令
| 命令 | 作用 | 预期输出 |
|---|---|---|
| ver('signal') | 检查信号处理工具箱 | 显示版本号,不应为空 |
| ver('wavelet') | 检查小波工具箱 | 显示版本号,不应为空 |
| which spectrogram | 确认函数实际调用路径 | 返回 toolbox/signal/signal/spectrogram.m |
| matlab.addons.installedAddons | 列出已安装附加功能 | 工具箱名称列表 |
如果 which 返回路径指向当前工作目录的某个同名脚本,说明自定义文件夹里有同名函数遮蔽了官方函数,这是安装后最常见的坑。处理方式是把自定义目录从当前路径中移除,或者用绝对路径调用官方函数。版本不兼容的表现通常是函数调用参数数量不匹配,比如老版本 cwt(x, 1:64, 'db4') 的语法报错,这时查看该版本对应文档,换成新版语法即可。
4. 核心函数与参数实战:Spectrogram、CWT 与 HHT 的典型调用与调参策略
4.1 spectrogram 的 4 个关键参数:窗长、重叠率、NFFT 与频率范围
spectrogram 是时频分析工具箱内置的短时傅里叶变换函数,它的签名是 [s, f, t, p] = spectrogram(x, window, noverlap, nfft, fs)。四个参数里窗长决定了时频分析的基础分辨率:窗口越长频率分辨率越高,能区分靠得很近的频率成分,但时间分辨率越差,无法精确刻画信号频率突变的时刻。窗口越短则相反。重叠率 noverlap 只影响时间方向的光滑度,与分辨率无关,通常设为窗口长度的 50% 到 75%,太低会出现明显的网格感,太高则增加计算量,对结果改善有限。nfft 是 FFT 点数,大于窗长时相当于对窗内数据补零插值,频率网格更细,但真实分辨率仍由窗长决定。
下面是使用 spectrogram 做时频分析的完整示例,模拟一个变频调速过程中随时间变化的电流信号:
fs = 4096; t = 0:1/fs:5; f1 = 50 + 60 * sin(2*pi*0.5*t); x = sin(2*pi*cumsum(f1)/fs) + 0.1*randn(size(t)); window_len = 512; noverlap = round(window_len * 0.75); [s, f, t_axis, p] = spectrogram(x, hann(window_len), noverlap, 1024, fs); subplot(2,1,1); plot(t, x); title('时域波形'); subplot(2,1,2); imagesc(t_axis, f, 10*log10(p)); axis xy; colormap('jet'); xlabel('时间 (s)'); ylabel('频率 (Hz)');代码里 cumsum(f1)/fs 对瞬时频率做累积积分构造出非平稳正弦信号,模拟了转速波动下的振动或电流分量。window_len = 512,在 fs = 4096 时窗长约 0.125 秒,频率分辨率约 8 Hz,可见 50 Hz 附近的瞬时频率轨迹沿 2 秒左右的周期上下摆动。0.1 倍高斯白噪声用于模拟测量噪声,验证工具箱在信噪比不高时仍能刻画时频演化趋势。如果观察到的频谱轨迹太粗,优先减小 window_len;如果两条相邻频带分不开,优先增大 window_len 或减小窗函数的旁瓣级别,比如换用 Kaiser 窗并调整 beta 参数。注意 noverlap 也不能设置得过于接近窗长,spectrogram 内部要求 noverlap < window_len,超过会直接报错。
4.2 cwt 与小波基选择:处理瞬态冲击型信号的时频表示
连续小波变换与 STFT 的核心区别在于多分辨率特性。低频分析用长窗,高频分析用短窗,因此冲击型信号高频端的起始时刻定位比 STFT 更精确。R2016b 之后的 cwt 函数参数简化成了 cwt(x, fs),默认使用渐进解析小波 automatic 小波,函数内部根据信号长度和采样率自动完成小波系数的尺度归一化。以下代码对一段带周期性冲击的轴承仿真信号做 CWT 时频分析:
fs = 2048; t = 0:1/fs:1; x = sin(2*pi*180*t) + 0.8 * sin(2*pi*90*t); t_impulse = 0.1:0.2:0.9; for k = 1:length(t_impulse) idx = round(t_impulse(k)*fs); x(idx:idx+15) = x(idx:idx+15) + 2 * exp(-1000*(t(1:16))); end [wt, f_cwt] = cwt(x, fs); imagesc(t, f_cwt, abs(wt)); set(gca, 'YScale', 'log'); axis xy; xlabel('时间 (s)'); ylabel('频率 (Hz)');冲激位置在添加时刻的响应导致了频谱上竖条纹。代码里 cwt 返回的小波系数是复数矩阵,abs 取模表示能量强度,纵轴采用对数刻度便于同时观察 90 Hz 和 180 Hz 的低频分量与冲击引起的高频分量。和 STFT 相比,CWT 的频率轴不是均匀的,低频端密集、高频端稀疏,图像含义与 STFT 不同,对齐时频坐标时要留意这一点。分析结果归一化后,可利用 cwtfilterbank 对象按需设定小波基,再调用 wt() 方法生成自定义系数。
4.3 HHT 分析:从经验模态分解到时频谱绘制
Hilbert-Huang 变换的完整流程是先用经验模态分解把信号拆成本征模态函数,再对每个分量做 Hilbert 变换求瞬时频率和幅值,最后把所有分量的时频信息汇总。Matlab 中 emd 函数默认输出分解结果数组,hht 函数直接对分解结果或原始信号画出时频谱。关键技术参数包括 FFT 点数、频率范围和筛选停止条件。
x_mixed = 0.8*sin(2*pi*40*t) + 0.5*sin(2*pi*120*t + sin(2*pi*3*t)); [imf, residual] = emd(x_mixed, 'MaxNumIMF', 6); hht(imf, fs, 'FrequencyLimits', [0 300]);这代码构造了 40 Hz 正弦和 120 Hz 调频正弦的混合信号,emd 分解迭代提取本征模态函数。MaxNumIMF 限制最大分解层数,避免噪声被拆出过多分量。hht 的 FrequencyLimits 控制输出频率显示范围,默认是 [0 fs/2] 奈奎斯特区间,窄带信号下会浪费大量显示区域。HHT 对频率突变的反应用三者中最快,但 EMD 的端点效应在信号两端会出现畸变,需要结合体数据重复性测试判断结果。傅里叶同步压缩变换 fsst 是一个备用选择,代码形态与 spectrogram 类似,但它的时频脊线更集中,适合提取瞬时频率曲线。
4.4 参数选择速查表与常见误用修正
| 目标 | 调节方向 | 参数推荐区间 |
|---|---|---|
| 提高频率分辨率 | 增大窗长、增大 NFFT | 窗长 ≥ 信号周期 × 10 |
| 提高时间分辨率 | 减小窗长 | 窗长 ≤ 目标特征持续时间 × 3 |
| 平滑时频图 | 增大重叠率 | noverlap = window_len × 0.7~0.8 |
| 减少频谱泄漏 | 换旁瓣更低的窗函数 | Kaiser(beta=6~10),在 MATLAB 中使用 kaiser() |
| 改善低频瞬时频率可读性 | 改用 fsst 或 cwt | 频率轴对数化 |
这段表的使用方式是先确定目标频率的间距和突变时间尺度,再反过来选定窗长和重叠率。常见误用是“NFFT 越高分辨率越高”,实际只是网格变细,频率分辨率仍受窗长约束。另一个常见误用是窗口长度选到信号长度的 50% 以上,导致整张图只呈现低频趋势,高频细节全部丢失。
5. 进阶:合成信号闭环、tfridge 瞬时频率提取与偏差定位
5.1 合成信号闭环:先用已知答案验证时频分析结果
把已知频率规律的合成信号跑一遍时频变换,将时频谱的峰值脊线与理论瞬时频率曲线叠加对比,是检查工具箱参数设置是否合理最直接的方式。以扫频信号为例,理论瞬时频率是固定的线性函数,谱图的峰值脊线应该精确落在该线上,如果偏移超过几个频率分辨率单元,说明窗函数或重叠率设置不合适。
f_inst = 80 + 60 * (t ./ 2); x_chirp = sin(2*pi*cumsum(f_inst)/fs); [s_coef, f_axis, t_axis, pxx] = spectrogram(x_chirp, hann(256), 200, 512, fs); fridge = tfridge(pxx, f_axis); plot(t_axis, fridge, 'r', t_axis, f_inst(1:length(t_axis)), 'b--');这段代码首先生成以已知瞬时频率调制的扫频信号,再调用 tfridge 从谱图矩阵中提取幅值峰值对应的频率轨迹,最后画图对比。tfridge 的输入是谱图幅度值 pxx 和频率轴 f_axis,输出每个时间点上能量最大的频率。如果两条曲线吻合,说明窗长、重叠率和 FFT 点数设置与信号特征匹配。峰值脊线只能代表当前窗长下的最佳估计,不一定是真实瞬时频率,但因为输入是已知信号,偏差部分可以直接定位到由参数引起的系统误差。注意这里谱图时间轴 t_axis 与构造信号的时间轴 t 长度不同,比较前需要对齐长度,避免绘图时矩阵维度报错。
5.2 通过残差定位时间窗选择问题
偏差曲线如果呈现周期性波动,常见原因是窗口长度与调频周期存在整数倍关系,导致谱图在几个固定位置丢失峰值。解决办法是把窗长调整为周期的非整数倍,或改用 fsst 函数再提取一次脊线对比。偏差出现在首尾两端时是边界效应,可以先用 buffer 前沿数据扩展信号,处理完再裁掉扩展段。
把 tfridge 的结果与理论曲线叠加分析后,判断偏差出现在哪些区段,再决定是否需要调整窗长。若高频段残差持续偏大,按上一节参数表收缩窗长并适当提高重叠率;若低频段脊线抖动明显,考虑采用对数频率轴呈现并重新提取脊线。这个流程可以复用到任何实测信号的时频分析任务上。把残差大的区段和原始信号的时域波形放在一起观察,通常能对应到调频斜率突变、幅值跳变或外部干扰等物理事件,这一步得到的定位信息远比单纯调整参数更有诊断价值。
本文还有配套的精品资源,点击获取