经验模态分解 (EMD) 标准算法 MATLAB 实现
项目介绍
本项目提供了一套完全基于 MATLAB 原生语言编写的经验模态分解(Empirical Mode Decomposition, EMD)标准算法实现。该程序旨在对非线性、非平稳信号进行自适应分解,将其解析为若干个本征模态函数(Intrinsic Mode Functions, IMF)和一个残差趋势项。
本实现不依赖 MATLAB 的官方信号处理工具箱中的 emd 函数,而是从底层原理出发构建了完整的筛选(Sifting)过程、包络拟合及边界处理逻辑,适合用于算法研究、教学演示以及对信号处理细节有深度定制需求的场景。
功能特性
- 多成分仿真信号生成:内置复杂的仿真信号生成逻辑,包含低频正弦、间歇性高频干扰、调频调幅(Chirp)信号、二次趋势项以及高斯白噪声,用于验证算法的分解能力。
- 自适应分解核心:实现了完整的 EMD 筛选循环,能够自动根据信号特征将复杂信号分解为从高频到低频排列的 IMF 分量。
- 三次样条包络拟合:采用三次样条插值(Cubic Spline Interpolation)构建上、下包络线,确保包络的光滑性。
- 边界效应抑制:内置镜像延拓算法,在包络拟合前对信号两端进行对称延伸,有效减轻两端的“飞逸”现象(End Effects)。
- 双重停止准则:
*
内层筛选停止:结合最大迭代次数限制与柯西收敛准则(基于标准差 SD),确保 IMF 的提取既准确又高效。
*
外层分解停止:自动检测残余信号的单调性或极值点数量,当残差无法继续分解时自动终止。
- 结果可视化:提供动态绘图模块,能够将原始信号、所有提取的 IMF 分量及最终残差以堆叠子图的方式展示,并计算显示各分量的均方根(RMS)能量。
使用方法
- 确保计算机上安装有 MATLAB 软件(推荐 R2018b 及以上版本以获得最佳绘图体验,但代码兼容旧版本)。
- 将源文件加载至 MATLAB 工作路径。
- 直接运行主程序入口函数。
- 程序运行结束后,控制台将显示提取到的 IMF 数量,并弹出结果分析图表。
详细功能与算法实现分析
本项目代码逻辑清晰,主要分为主流程控制、核心算法、辅助计算和可视化四个部分。以下是对各部分实际功能的详细分析:
1. 信号生成与预处理
程序首先构建了一个采样频率为 1000Hz、时长 1秒的时间序列。为了测试 EMD 的性能,构造了一个包含多种特征的混合信号:
- 低频基波:10Hz 的连续正弦波。
- 间歇高频:仅在 0.3s 至 0.7s 存在的 50Hz 正弦波。
- 非平稳成分:频率随时间变化的 Chirp 信号。
- 趋势项:二次抛物线趋势。
- 噪声:通过设定随机种子(rng 42)生成的微量高斯白噪声。
2. EMD 核心引擎 (Sifting Process)
这是算法的“大脑”部分,负责执行主要的分解循环:
- 输入校验:强制将信号转换为行向量处理。
- 外层循环:不断尝试从当前残差信号中提取新的 IMF,直到残差满足停止条件(如变为单调函数或极值点不足 3 个)。
- 内层筛选循环:
* 计算当前信号的上下包络。
* 求取均值包络。
* 从原信号中减去均值包络。
*
收敛性检查:计算连续两次筛选结果之间的标准差(Standard Deviation, SD),公式为
sum((h_prev - h)^2) / sum(h_prev^2)。若 SD 小于设定的阈值(默认为 0.3)或达到最大筛选次数(20次),则认为当前 IMF 已筛好。
3. 包络计算与边界处理
为了精确拟合包络线,程序实现了以下步骤:
- 极值点识别:利用差分法(
diff)精确捕捉信号的所有局部极大值和极小值索引。 - 镜像延拓(Mirror Extension):这是代码中的关键细节。为了防止样条插值在端点发散,程序选取信号两端最近的 2 个极值点,以端点为轴进行镜像对称, artificially 增加了数据边界。
- 异常处理:如果检测到的极值点极少(<2个),程序会自动降级采用简单的端点连接或保留极值,防止插值报错。
- 样条插值:使用 MATLAB 内置的
spline 函数基于延拓后的极值点生成平滑的包络线。
4. 辅助判定逻辑
程序包含一个专门的状态检查函数,用于判断分解是否应当结束。它计算当前剩余信号的一阶差分,统计极大值和极小值的总数。如果总极值数少于 3 个,则判定信号已不可再分(即已变成单调趋势或简单的单波),触发算法终止。
5. 可视化模块
绘图功能能够根据生成的 IMF 数量动态调整子图布局:
- 布局:第一行绘制原始含噪信号,最后一行绘制最终残差,中间行依次绘制 IMF1, IMF2, ...
- 数值标注:在每个 IMF 子图中计算并标注了该分量的 RMS(均方根)值,帮助用户量化该分量的能量大小。
- 兼容性:代码中包含了对
sgtitle 的版本检查,确保在低版本 MATLAB 中不会因标题函数报错。
系统要求
- 软件:MATLAB
- 工具箱:本项目主要依赖 MATLAB 基础功能,不需要 额外的高级信号处理工具箱(Signal Processing Toolbox),所有核心算法均为原生代码实现。