
MATLAB脚本:EMD/EEMD与小波包分解滤波代码,适用于多种信号处理
在处理振动信号或生物医学信号时,时频分析是绕不开的课题。最近在折腾轴承故障诊断项目,发
现EMD(经验模态分解)这类自适应分解方法对非平稳信号处理确实有效。下面分享几个实战中用到的分解
代码,带点个人踩坑经验。
先看经典EMD的实现。MATLAB自带emd函数,但实际使用要注意端点效应:
```matlab
[imf, residual] = emd(signal, 'Interpolation', 'pchip');
figure;
for i=1:size(imf,2)
subplot(size(imf,2)+1,1,i);
plot(imf(:,i));
end
subplot(size(imf,2)+1,1,size(imf,2)+1);
plot(residual);
```
这个分解结果容易受噪声影响,特别是处理心音信号时,高频成分容易产生伪IMF。有个骚操作是在
信号两端做镜像延拓,分解完再截取中间部分,能有效缓解端点飞翼问题。
EEMD(集合经验模态分解)加了噪声辅助,分解更稳定。这里有个自己改的并行计算版本:
```matlab
function [imfs] = myeemd(signal, ensemble_num, noise_std)
parpool('local',4); % 开4个并行worker
imfs_sum = zeros(length(signal),10); % 预设10层IMF
parfor n = 1:ensemble_num
noisy_signal = signal + noise_std*randn(size(signal));
[imf, ~] = emd(noisy_signal);
imfs_sum(:,1:size(imf,2)) = imfs_sum(:,1:size(imf,2)) + imf;
end
imfs = imfs_sum / ensemble_num;
end