基于局域均值分解(LMD)的信号分析程序
项目介绍
本项目实现了一种用于非平稳和非线性信号处理的自适应分析算法——局域均值分解(LMD)。该程序能够将复杂的信号自动分解为一系列具有物理意义的乘积函数(Product Function, PF)分量。每个PF分量本质上是一个调幅-调频(AM-FM)信号,由一个纯调频信号和一个包络信号乘积构成。该算法在通过平滑处理提取信号特征方面具有独特优势,相比传统的经验模态分解(EMD),在抑制端点效应和提升分解精度上做了优化,广泛应用于机械故障分析、生物医学信号处理及时序数据预测等领域。
功能特性
- 自动提取PF分量:程序能够根据信号自身的特征,自适应地分解出不同频段的PF分量及残余信号。
- 瞬时特征分析:利用希尔伯特变换(Hilbert Transform)准确估计各分量的瞬时频率。
- 高精度重构:提供信号重构功能,通过累加所有分量与残差,验证分解过程的无损性。
- 全方位可视化:自动生成原始信号、分量包络、残余信号、重构对比以及瞬时频率分布的多维度图表。
- 收敛控制:内置迭代停止阈值和最大迭代次数限制,确保分解过程的稳定性。
系统要求
- 环境:MATLAB R2016b 或更高版本。
- 工具箱:需要安装 Signal Processing Toolbox(信号处理工具箱),用于调用 findpeaks、hilbert、movmean 等关键函数。
算法实现逻辑
本程序的实现严格遵循LMD的标准迭代流程,主要步骤如下:
1. 模拟信号生成
程序首先构造了一个复杂的多分量合成信号作为测试对象。该信号包含:
- 一个复杂的调幅-调频(AM-FM)分量。
- 一个低频正弦趋势项。
- 叠加了一定强度的随机高斯噪声。
2. PF分量分解循环(外层循环)
程序通过循环不断从原始信号中提取PF分量,直到达到预设的最大分量数(5个)或剩余信号变为单调函数。
3. 解调迭代过程(内层循环)
对于每一个PF分量,通过以下子步骤进行迭代优化,直到包络估计函数趋近于1:
- 极值点检测:使用 findpeaks 查找信号的所有局部极大值和极小值。
- 局部参数计算:在相邻极值点之间,计算局部均值 $m_i$(相邻两极值算术平均)和局部包络估计值 $a_i$(相邻两极值差的绝对值的一半)。
- 插值与平滑:利用分段三次埃尔米特插值(PCHIP)将离散的均值和包络点扩充至全时间轴,并使用滑动平均(Moving Average)进行平滑处理,以获得连续的局部均值函数 $m(t)$ 和局部包络函数 $a(t)$。
- 信号分离:从当前信号中减去局部均值函数并除以局部包络函数,实现信号的解调。
- 包络累积:在迭代过程中持续累乘包络函数,最终形成该分量的完整包络。
4. 分量提取与残差更新
当内层迭代满足阈值条件时,将累积包络与最终的调频信号相乘得到当前的PF分量。随后从原始信号中减去该分量,将剩余部分作为下一轮分解的输入。
5. 后处理与分析
- 重构验证:计算所有PF分量与残差的和,并与原始信号对比,计算平均绝对误差(MAE)和均方根误差(RMSE)。
- 频率解算:对每个PF分量进行希尔伯特变换,通过相位梯度计算随时间变化的瞬时频率。
关键技术细节
- 端点处理:在极值点检测后,程序通过对边界处采用端点延续策略(利用首尾包络值填充),缓解了插值引起的端点效应。
- 平滑窗口长度:滑动平均窗口根据信号长度动态调整(取总长度的1%),兼顾了计算效率与平滑效果。
- 停止准则:采用了包络逼近准则,当包络估计值 $a_t$ 的偏离度小于1e-3时认为当前的PF分量已经纯化。
- 重构精度:由于采用了全过程的残差补偿,该算法理论上可以实现极高精度的信号重构(重构误差通常在10^-15数量级)。
使用方法
- 运行程序:在MATLAB命令行窗口中直接运行主函数。
- 观察图表:
* 第一张图展示分解出的各PF分量及其包络线,红色虚线即为提取出的分量包络。
* 第二张图展示原始信号与重构信号的拟合程度,以及具体的误差分布和MAE数值。
* 第三张图展示各PF分量的瞬时频率随时间的变化曲线。
- 性能评估:查看命令行输出的PF分量总数和RMSE,数值越小说明分解与重构的精度越高。