简介:希尔伯特黄变换(HHT)是面向非线性、非平稳信号分析的学习与研究资源,由EMD与希尔伯特变换两部分构成,适用于生物医学信号、地震数据、机械故障诊断等场景,适合具备一定MATLAB基础、希望深入理解时频分析的中高级学习者。资源包共72个文件,以40个m文件为核心实现,辅以17个c与11个h文件支撑底层计算,另有2个sh脚本、1个mat数据及目录清单,整体约94KB,结构紧凑。内容围绕经验模态分解展开,涵盖本征模态函数的迭代筛选、包络构造与残差处理,并进一步对每个IMF分量施加希尔伯特变换,提取瞬时频率与瞬时振幅,绘制希尔伯特谱以揭示信号的时间-频率动态特性。包内提供可直接调用的emd函数及配套工具,读者可据此对任意信号完成分解、变换与可视化,快速搭建HHT分析流程。目前已有5077人学习下载,适合作为算法复现与工程应用的参考起点。
1. 希尔伯特黄变换HHT:一个把复杂信号拆开看的工具
你可能遇到过这种情况:一段机器振动的声音、一段脑电波、一段地震波,看上去乱七八糟,完全找不到规律。传统的傅里叶变换能告诉你“这段信号里有哪些频率”,但它有个前提——假设这些频率从头到尾一直存在。可现实里的信号往往不是这样,频率会随时间变化,一会儿高一会儿低。这时候就需要一个能同时告诉你“什么时间出现了什么频率”的工具,希尔伯特黄变换(HHT)就是干这个的。
打个比方,傅里叶变换像把一首交响乐的所有乐器声音混在一起,告诉你总共用了哪些音符;而HHT像把每个乐器的演奏单独拎出来,还能告诉你小提琴什么时候进场、鼓什么时候停。它由两部分组成:先做经验模态分解(EMD),把信号拆成若干个“本征模态函数”(IMF),再对每个IMF做希尔伯特变换,得到瞬时频率和瞬时幅值。这套方法不需要预先假设信号是线性的或平稳的,所以对非线性、非平稳信号特别管用。搞懂它,你就多了一把分析真实世界信号的钥匙。
2. 为什么需要HHT:傅里叶变换搞不定的那些事
2.1 傅里叶变换的“先天局限”
傅里叶变换的核心思想是:任何信号都可以分解成不同频率的正弦波叠加。这个思路在平稳信号上非常成功,比如一段稳定的交流电信号,频率固定不变,傅里叶变换能精确告诉你频率是多少。但问题在于,它把整个信号当作一个整体来处理,频率信息是全局的,没有时间定位。
通俗地说,傅里叶变换能告诉你“这首歌里出现了钢琴和小提琴”,但没法告诉你“钢琴在第30秒到第45秒之间演奏”。对于频率随时间变化的信号——比如鸟鸣声、雷达回波、机械故障时的冲击振动——傅里叶变换给出的频谱图会变得模糊,频率成分被“平均”掉了。短时傅里叶变换(STFT)通过加窗部分解决了这个问题,但窗口大小固定,时间分辨率和频率分辨率互相矛盾,顾此失彼。
2.2 EMD凭什么能自适应拆信号
经验模态分解(EMD)的思路完全不同。它不预设任何基函数,而是直接从信号本身出发,一层一层地把信号拆开。具体做法是:找到信号所有的局部极大值和极小值,用插值画出上包络线和下包络线,取两者的平均得到一条均值线,然后用原信号减去这条均值线,得到一个“候选分量”。重复这个过程,直到剩下的部分满足“极值点数量和过零点数量相差不超过一个”且“上下包络线均值接近零”的条件,就得到了第一个IMF。
这个过程听起来有点绕,但核心思想很朴素:IMF就是信号里“振荡最剧烈、频率最高”的那一层。把它剥离出去之后,剩下的信号再重复同样的操作,得到第二个IMF,频率比第一个低。如此反复,直到剩余部分变成单调趋势或小到可以忽略。最终,原信号被表示成若干个IMF加上一个趋势项。
注意:EMD的“自适应”体现在它不需要你事先选定基函数。傅里叶变换用正弦波,小波变换用小波基,选错了效果就打折扣。EMD直接从数据里“长”出分解结果,这是它最大的优势,也是它被广泛使用的原因。
2.3 希尔伯特变换补上最后一块拼图
EMD把信号拆成了IMF,但每个IMF仍然是一条时间序列,你只能看到幅值随时间的变化,看不到频率。希尔伯特变换的作用是对每个IMF做处理,构造出解析信号,从而计算出瞬时频率和瞬时幅值。瞬时频率的含义是:在每一个时间点上,这个IMF的振荡频率是多少。
把每个IMF的瞬时频率和瞬时幅值画在一张图上,横轴是时间,纵轴是频率,颜色深浅表示幅值大小,就得到了希尔伯特谱。这张图能直观地展示信号频率随时间的变化规律,是HHT最核心的输出结果。相比傅里叶频谱,希尔伯特谱在时间和频率两个维度上都有分辨率,而且不受不确定性原理的约束——因为它不是基于窗口的。
3. HHT和相近方法怎么区分:别把EMD、EEMD、HHT混为一谈
3.1 EMD和HHT:一个是零件,一个是整机
很多人第一次接触这些名词时,会把EMD和HHT当成两个并列的方法。实际上,EMD只是HHT的第一步。完整的HHT流程是:EMD分解得到IMF,再对每个IMF做希尔伯特变换得到瞬时频率和幅值,最后汇总成希尔伯特谱。只做EMD不做希尔伯特变换,你得到的是若干个分量信号,可以做后续分析,但拿不到时频分布。
打个比方:EMD像把一台机器拆成零件,希尔伯特变换像给每个零件贴上“工作频率”的标签,HHT则是拆完贴完标签后画出整台机器的运行状态图。三者是包含关系,不是并列关系。
3.2 EEMD和EMD:解决模态混叠的改进版
EMD有一个被反复吐槽的问题:模态混叠。通俗地说,就是同一个IMF里混进了频率差异很大的成分,或者相近的频率被拆到了不同的IMF里。这会导致分解结果不稳定——信号加一点微小噪声,分解出来的IMF就可能完全不同。
EEMD(集合经验模态分解)的思路很直接:既然噪声会导致分解不稳定,那就主动加噪声,然后做多次分解取平均。具体操作是:往原信号里加入不同 realization 的白噪声,分别做EMD,然后把多次结果对应的IMF取平均。噪声在平均过程中互相抵消,信号的真实成分被保留下来。代价是计算量成倍增加,而且需要手动设定加入噪声的幅值和集合次数。
| 对比项 | EMD | EEMD |
|---|---|---|
| 模态混叠 | 容易出现 | 明显改善 |
| 计算量 | 较小 | 成倍增加 |
| 参数设置 | 几乎无需设置 | 需设噪声幅值和集合次数 |
| 分解稳定性 | 对噪声敏感 | 多次平均后稳定 |
| 残余噪声 | 无 | 平均后残留极小 |
3.3 希尔伯特谱和傅里叶频谱:两种看世界的角度
傅里叶频谱的横轴是频率,纵轴是幅值,告诉你“整个信号里各个频率成分有多强”。希尔伯特谱的横轴是时间,纵轴是频率,颜色表示幅值,告诉你“在某个时刻,哪些频率在振荡,强度多大”。
对于平稳信号,两者给出的频率信息基本一致。但对于非平稳信号,傅里叶频谱会把不同时刻的频率成分混在一起,而希尔伯特谱能清晰地把它们分开。举个例子:一个信号前5秒是10Hz,后5秒是20Hz。傅里叶频谱会显示10Hz和20Hz两个峰,但你看不出哪个在前哪个在后。希尔伯特谱会显示前5秒能量集中在10Hz,后5秒跳到20Hz,时间信息一目了然。
4. HHT的实际用途和典型场景
4.1 机械故障诊断:从振动里听出毛病
旋转机械——比如电机、齿轮箱、轴承——在出现故障时,振动信号往往表现出非平稳特征。轴承内圈剥落会产生周期性冲击,齿轮断齿会产生调制现象。这些特征在傅里叶频谱里可能被淹没在噪声和其他频率成分中,但在希尔伯特谱里会以特定的时频模式显现出来。
实际操作中,通常先对振动信号做EMD或EEMD分解,得到若干IMF,然后对包含故障特征频率的IMF做希尔伯特变换,观察瞬时频率和幅值的变化规律。比如轴承外圈故障的特征频率是转频的某个倍数,如果在某个IMF的希尔伯特谱上看到该频率处出现周期性冲击,基本可以判断故障类型。
# 伪代码示意:对振动信号做EMD分解并绘制希尔伯特谱 # 假设 signal 是采集到的振动时间序列,fs 是采样频率 import numpy as np from PyEMD import EMD from scipy.signal import hilbert emd = EMD() imfs = emd(signal) # 得到多个本征模态函数 # 对第一个IMF做希尔伯特变换 analytic = hilbert(imfs[0]) amplitude = np.abs(analytic) # 瞬时幅值 phase = np.unwrap(np.angle(analytic)) instant_freq = np.diff(phase) / (2 * np.pi) * fs # 瞬时频率 # 绘制时频图:横轴时间,纵轴瞬时频率,颜色表示幅值 # 后续可用 matplotlib 的 pcolormesh 或 scatter 可视化这段代码展示了基本流程:EMD分解得到IMF,希尔伯特变换计算瞬时幅值和瞬时频率。实际使用时,需要根据信号特点选择对哪些IMF做分析,通常前几个IMF包含高频故障特征,后面的IMF对应低频趋势。
4.2 生物医学信号处理:脑电和心电里的节律追踪
脑电信号(EEG)是典型的非平稳信号,不同脑区在不同任务下表现出不同的节律活动——比如α波在放松时出现,β波在专注时增强。这些节律的频率不是固定不变的,会随时间漂移。HHT能追踪这些节律的瞬时频率变化,帮助研究者理解大脑的动态过程。
心电信号(ECG)中的心率变异性分析也常用到HHT。传统方法假设心跳间隔是平稳的,但实际上心率受呼吸、情绪等因素影响,呈现非平稳特征。通过EMD分解提取出与呼吸相关的IMF,再做希尔伯特变换,可以得到呼吸对心率调制的时间过程。
4.3 地震信号分析:从地动里提取结构信息
地震波在传播过程中,不同频率成分的到达时间和衰减特性不同。HHT可以把地震信号分解成不同时间尺度的IMF,分别分析它们的瞬时频率和能量衰减,从而推断地下介质的结构。相比短时傅里叶变换,HHT在低频段有更好的频率分辨率,在高频段有更好的时间分辨率,适合处理地震波这种宽频带信号。
提示:HHT在生物医学和地球物理领域的应用,核心价值在于它能处理“频率随时间变化”的信号。如果你的信号是平稳的,用傅里叶变换就够了,没必要上HHT。
5. 什么时候该用HHT,什么时候别碰
5.1 适合HHT的场景
判断标准很简单:信号是不是非平稳、非线性,而且你关心频率随时间的变化。如果满足这两条,HHT值得一试。具体来说:
- 信号频率随时间明显变化,比如调频信号、冲击信号、瞬态信号
- 传统傅里叶分析结果不理想,频谱模糊或时间信息丢失
- 信号长度足够,至少包含几个完整的振荡周期,否则EMD分解不稳定
- 你对分解结果的物理意义有预期,能判断哪些IMF是有用的
一个具体的例子:某实验室做齿轮箱故障模拟实验,采集了一段振动信号。用傅里叶变换看,频谱上有一堆峰,分不清哪些是故障特征。用HHT分解后,前三个IMF分别对应高频冲击、啮合频率和转频调制,希尔伯特谱上能清楚看到冲击出现的时刻和间隔,故障定位就变得容易了。
5.2 不适合HHT的场景
HHT不是万能的,以下几种情况建议换方法:
- 信号是平稳的,频率不随时间变化。这时候傅里叶变换更简单、更可靠。
- 信号太短,只有几十个采样点。EMD需要足够的极值点来构造包络线,太短的信号分解结果没有意义。
- 信号信噪比极低,噪声能量远大于信号能量。EMD会把噪声也分解成IMF,导致模态混叠严重,即使EEMD也只能部分缓解。
- 你需要严格的数学保证。EMD缺乏完整的理论证明,分解结果依赖参数和实现细节,不同软件跑出来的结果可能有差异。如果应用场景要求可重复性和理论严谨性,小波变换或自适应滤波可能更合适。
5.3 一个踩坑教训
我刚开始用HHT的时候,拿到一段信号就直接跑EMD,然后对第一个IMF做希尔伯特变换,画出来的时频图乱七八糟,瞬时频率出现负值,完全没法解释。后来才搞明白,问题出在两点:一是没有做端点处理,EMD在信号两端会产生发散;二是希尔伯特变换对IMF的要求很严格,不是随便一个分量都能算出有物理意义的瞬时频率。
从那以后,我每次用HHT都强制走一遍流程:先检查信号长度和极值点数量,再做端点延拓,分解后逐个检查IMF是否满足本征模态函数的定义,最后才对合格的IMF做希尔伯特变换。如果某个IMF的瞬时频率出现大面积负值或剧烈跳变,说明它不适合做希尔伯特分析,要么换IMF,要么调整分解参数。
希望这些经验能帮你少走点弯路。HHT是个好工具,但用好它需要理解它的脾气——它擅长处理非平稳信号,但前提是你得把数据准备好、把参数调对、把结果验证好。如果你手头正好有非平稳信号要分析,这份资料里的完整流程和参数说明可以帮你快速上手,省去自己摸索的时间。
本文还有配套的精品资源,点击获取