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

这篇博客介绍了经验模态分解(EMD)和集合经验模态分解(EEMD)的概念及其在信号处理中的应用。EMD是一种自适应的信号分解方法,能将复杂信号分解为多个本征模态函数(IMF),每个IMF代表信号的不同局部特征。EEMD则是EMD的增强版,通过加入噪声来提高分解的稳定性。文中提供了Python代码示例,展示了如何使用PyEMD库对音频信号进行EMD和EEMD分解,并可视化结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

经验模态分解(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

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值