【信号处理】经验模态分解 (Empirical Mode Decomposition)

经验模态分解(Empirical Mode Decomposition,简称EMD)

经验模态分解EMD是基于瞬时频率、本征模态函数(Intrinsic Mode Function,IMF)的概念,能够将复杂信号分解为若干个IMF分量,每个IMF表征信号的局部特征。依据的是数据自身的时间尺度特征来进行信号分解,无需预先设定任何基函数,因此具有自适应性。再通俗一点,EMD就像一台机器,把一堆混在一起的硬币扔进去,他会自动按照1元、5毛、1毛、5分、1分地分成几份。

经验模态分解的基本思想:将一个频率不规则的波化为多个单一频率的波+残波的形式。原波形 = ∑ IMFs + 余波。

EMD方法是基于如下假设基础上的:
  (1)信号至少有两个极值点,一个极大值和一个极小值;
  (2)特征时间尺度通过两个极值点之间的时间定义;
  (3)若数据缺乏极值点但有形变点,则可通过数据微分一次或几次获得极值点,然后再通过积分来获得分解结果。
  算法流程如下所示:
  ![在这里插入图片描述](https://img-blog.csdnimg.cn/b93b92047a864e779a28db18cffb2851.png
  在这里插入图片描述

EMD分解python代码:

import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
import numpy as np
from PyEMD import EMD
import scipy.io.wavfile as wf

plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False #用来正常显示符号

Fs = 44100
T = 1/Fs

sample_rate, noised_sigs = wf.read('noised.wav')

t = np.linspace(0,len(noised_sigs)-1,len(noised_sigs))
s = np.array(noised_sigs)

emd = EMD()
imfs = emd.emd(s,t,10)

# Plot results
plt.figure(figsize=(12,15))
plt.subplot(7,2,1)
plt.plot(t, s, 'r')
plt.title("Input signal")

plt.figure(figsize=(12,15))
plt.subplot(7,2,1)
plt.plot(t, s, 'r')
plt.title("IMFS")

for n, imf in enumerate(imfs):
    plt.subplot(13,2,n+3)
    plt.plot(t[:2000], imf[:2000], 'g')
    plt.ylabel("IMF %i" %(n+1))

plt.tight_layout()
plt.show()

在这里插入图片描述

同理,集合经验模态分解(EEMD)分解展示如下:

import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
import numpy as np
from PyEMD import EEMD
import scipy.io.wavfile as wf

plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False #用来正常显示符号

Fs = 44100
T = 1/Fs

sample_rate, noised_sigs = wf.read('noised.wav')

t = np.linspace(0,len(noised_sigs)-1,len(noised_sigs))
s = np.array(noised_sigs)

emd = EEMD()
imfs = emd.emd(s,t,10)

# Plot results
plt.figure(figsize=(12,15))
plt.subplot(7,2,1)
plt.plot(t, s, 'r')
plt.title("Input signal")

plt.figure(figsize=(12,15))
plt.subplot(7,2,1)
plt.plot(t, s, 'r')
plt.title("IMFS")

for n, imf in enumerate(imfs):
    plt.subplot(13,2,n+3)
    plt.plot(t[:2000], imf[:2000], 'g')
    plt.ylabel("IMF %i" %(n+1))

plt.tight_layout()
plt.show()

在这里插入图片描述
测试数据(noised.wav)放在这里,方便大家复现:
链接:https://pan.baidu.com/s/1_nMaikrjGYDmae8u1RYIVA
提取码:z55v

  • 8
    点赞
  • 60
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
经验模态分解(Empirical Mode Decomposition,EMD)在迭代过程中常常会出现两个问题:端点效应和模态混叠现象。 1. 端点效应(Endpoint Effect):EMD 在信号的两个端点处存在一种尖锐的跳跃现象,这会导致分解的结果受到边界效应的影响。这是因为在计算局部极大值和极小值时,信号在两端没有足够的数据点进行计算,导致出现误差。 解决端点效应的方法包括: - 边界扩展:通过在信号两端复制边界数据或使用对称扩展等方法来增加边界处的数据点数量,以减轻端点效应。 - 包络函数插值:通过对信号的边界进行插值操作,生成有效的边界数据,从而减少端点效应。 2. 模态混叠现象(Mode Mixing):EMD 的另一个常见问题是模态混叠,即两个或多个模态函数在频域上相互重叠,导致模态函数提取不准确。这是由于局部极大值和极小值的选择不唯一以及噪声的干扰。 解决模态混叠的方法包括: - 后处理方法:应用滤波器、小波变换或其他信号处理技术对模态函数进行后处理,以减少模态混叠的影响。 - 前置处理方法:在进行EMD之前,可以对信号进行预处理,如降噪、滤波等操作,以减少噪声对EMD的影响。 请注意,端点效应和模态混叠是EMD方法的固有问题,具体解决方法可能因具体情况而异。此外,还有一些改进的EMD变体,如快速EMD(Fast EMD)和稳定EMD(S-EMD),可以在一定程度上缓解这些问题。在实际应用中,根据具体情况选择合适的方法和技术来解决这些问题是很重要的。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值