EMD 的信号分解能力是真的挺强,适合那种非线性又不稳定的信号。你要是做图像、金融时间序列,或者生物信号啥的,挺值得一试。

EMD(经验模态分解)这个方法是 Huang 在 1998 年提出来的,它可以把复杂信号一步步拆成多个不同频率的部分,也就是所谓的 IMF(内在模态函数),加一个残差部分。

代码整体结构清晰,每一步都注释得蛮详细,适合用来学习。核心流程就是通过三次样条插值找到上下包络线,计算平均值,差分之后就能拿到第一个 IMF。

你每次提取一个 IMF 后,都会更新残差,重复上面的过程,直到达到你设置的 IMF 数量或者残差够小就可以停了。

代码还顺带把希尔伯特变换也做了,能直接算出每个 IMF 的瞬时频率和振幅,拿来画时频图也方便,展示效果也蛮直观。

你要是用 Matlab 开发,可以看看下面这几个相关资源,代码能直接跑,省不少时间:

如果你经常那种复杂、结构不规律的信号,可以试试这个 EMD 代码。自己动手跑一遍,理解比看论文快得多