Python数据处理-EMD经验模态分解

一:经验模态分解EMD-signal软件包安装

         利用python进行emd经验模态分解相关的数据处理使用到的是EMD-signal软件包,可以利用如下语句在命令行中进行库安装(anaconda环境将pip改成conda即可),注意软件包的名字,尤其是大小写,不是emd,不是emd-signal,也不是pyemd,如果错误安装了emd、emd-signal、pyemd,很有可能导致EMD-signal安装失败或者安装了也用不了,通过pip list检查并对错误安装的软件包进行uninstall操作后重新安装EMD-signal。      

pip install EMD-signal  # 安装软件包
  # pip3.10 install EMD-signal  # 指定python版本安装
pip uninstall EMD-signal  # 卸载软件包
  # pip3.10 uninstall EMD-signal  # 指定python版本卸载
pip list  # 检查已安装的python包
  # pip3.11 list  # 检查指定python版本 
  # anaconda环境将pip替换为conda

二:EMD原理

        经验模态分解(Empirical Mode Decomposition, EMD)是一种处理非线性、非平稳信号的时频处理方法。根据不同的输入信号,emd方法无需对其进行预处理,就能够自适应的将其分解成若干个由高频到低频的本征模态函数(Intrinsic Mode Functions, IMF)以及残差信号。

\text{original-signal} = \sum_{i=1}^{n} \text{imf}_i + \text{residue-signal}

        其中分解得到的每一个imf都必须满足:

  1. imf信号的极值点和过零点的个数相差不超过一个;
  2. imf信号的上下包络关于x轴对称,即上下包络的均值为零。

        具体的emd分解流程为:

  1. 找出original_signal的极值点,通过三次样条插值构建上下包络线,求解上下包络线均值,利用original_signal减去均值包络线得到中间信号;
  2. 判断中间信号是否满足imf的两个条件,如果满足,将其作为一个imf分量,不满足则利用中间信号重复步骤1的迭代过程得到新的中间信号;
  3. 将original_signal减去得到的imf分量得到的residue_signal赋值为新的original_signal,继续步骤1的迭代过程,得到更多的imf分量;
  4. 当残差信号residue_signal是单调信号或者常数时,停止emd分解;(当然也有其它(可预设的)emd分解停止条件)。

三:EMD代码示例

        这里我们利用从kaggle下载的一段音频数据进行emd分解,研究音频的频率覆盖范围以及噪声情况:

import numpy as np
import matplotlib.pyplot as plt
from PyEMD import EMD
import pandas as pd

file_path = "D:/kaggle/data.txt"
df = pd.DataFrame()

with open(file_path, "r", encoding="ISO-8859-1") as file:
    for line_number, line in enumerate(file, 0):  # 调用enumerate函数返回索引和值的元组
        line = line.strip()  # str.strip()去除字符串两端空白字符(空格、制表符、换行符等)
        if len(line) != 0:
            if line_number < 1000:
                print(f"Line{line_number}:{line}")
                df.loc[line_number, "time"] = line.split(";")[1]  # 时间
                df.loc[line_number, "sample"] = float(line.split(";")[7].split("=")[1])

# 原始信号数据
time = df["time"]
original_signal = df["sample"].values  # <class 'numpy.ndarray'>多维数组

# 进行EMD分解
emd = EMD()
imfs = emd(original_signal)
num_imfs = len(imfs)  # 计算imf数量

# 绘制原始信号和imfs
plt.figure(figsize=(17, 7))

# 原始信号
plt.subplot(num_imfs+1, 1, 1)
plt.plot(time, original_signal, color="orange")
plt.xlabel('Time', labelpad=-13)  # 手动调整标签位置
plt.ylabel('Amplitude')
plt.xticks([time[0], time.iloc[-1]])  # 首尾时间
plt.title("original signal")

# imfs
for i in range(num_imfs):
    plt.subplot(num_imfs+1, 1, i+2)
    plt.plot(time, imfs[i], label=f"imf_{i+1}")
    plt.xticks([time[0], time.iloc[-1]])  # 首尾时间
    plt.legend()

plt.tight_layout()  # 自动调整布局
plt.show()

        EMD分解后的每个 IMF 都是原始音频信号的一部分,具有不同的频率和振幅特征,我们后续可以根据频率和振幅的差异对原始信号进行降噪、信号增强、特征提取等等一系列针对性处理。

参考:
EMD、EEMD、FEEMD、CEEMD、CEEMDAN的区别、原理和Python实现(一)EMD_python实现emd eemd ceemd-CSDN博客
https://zhuanlan.zhihu.com/p/40005057       “EMD就像一台机器,把一堆混在一起的硬币扔进去,他会自动按照1元、5毛、1毛、5分、1分地分成几份。”!!!

王婷.EMD算法研究及其在信号去噪中的应用[D].哈尔滨工程大学,2010.

  • 24
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值