完全集成经验模态分解与自适应噪声(CEEMDAN)算法及其在信号降噪中的应用

CEEMDAN简介

在信号处理领域,经验模态分解(EMD)是一种常用的信号分解方法。它能够将复杂的信号分解为一系列内禀模态函数(IMFs),帮助分析信号的局部特征。然而,EMD在实际应用中常常会遇到模态混叠问题,即分解结果中不同模态之间会相互干扰,影响分析效果。为了减轻这一问题,研究者们提出了几种改进方法,包括集成经验模态分解(EEMD)和完全集成经验模态分解(CEEMD)。这两种方法通过在信号中加入随机白噪声来帮助分解,从而减少模态混叠的影响。

尽管EEMD和CEEMD在一定程度上解决了模态混叠问题,但它们在分解结果中仍可能残留一定的白噪声。此外,白噪声的引入可能导致信号的模态数量不一致,从而影响后续的信号分析。为了解决这些问题,Torres 等人提出了完全自适应噪声集成经验模态分解(CEEMDAN)算法。CEEMDAN算法通过进一步改进噪声处理和模态分解过程,表现出了更好的信号分解和降噪能力。

CEEMDAN主要特点

CEEMDAN算法在处理模态混叠和噪声问题方面,具备以下两个主要特点:

  • 逐步添加噪声: 在CEEMDAN算法中,逐步添加噪声是其核心思想之一。具体而言,CEEMDAN算法在每次迭代中,将白噪声添加到经EMD分解后的内禀模态函数(IMF)中。这种逐步添加噪声的方式,能够有效地减轻白噪声对分解结果的影响,从而提高分解的精度和稳定性。

  • 逐阶平均处理:与EEMD和CEEMD通过对所有IMF分量进行总体平均不同,CEEMDAN在每一阶IMF分量获得后立即进行平均处理。这意味着每一阶IMF在计算后都会进行平均,以减少白噪声的影响。随后,处理残余部分并重复此过程,从而有效地解决了白噪声从高频到低频的转移问题。

算法流程图

具体来说:

  • EEMD方法:通过将添加白噪声后的多个信号进行EMD分解,得到若干组IMF分量,并对这些IMF分量进行总体平均处理,得到最终的IMFs。

  • CEEMDAN方法:在每求得一阶IMF分量后,立即对其进行平均处理,然后将残余信号重新加入白噪声后再次进行分解。这个过程会重复进行,从而逐步得到最终的IMF分量,并在每一步减少噪声的影响。

CEEMDAN在信号降噪中的应用

CEEMDAN在处理带噪声的信号时表现出色。通过引入逐步噪声和逐阶平均处理,CEEMDAN能够有效减轻噪声对信号分解的影响。以下是一个具体的示例,展示了如何使用CEEMDAN算法进行信号降噪。

效果展示

降噪结果

IMFs分解结果

示例代码

python 复制代码
import numpy as np
import matplotlib.pyplot as plt
from PyEMD import CEEMDAN

# 生成原始信号 (例如,正弦波)
t = np.linspace(0, 1, 1000)
original_signal = np.sin(2 * np.pi * 5 * t)

# 添加噪声
noise = np.random.normal(0, 0.5, t.shape)
noisy_signal = original_signal + noise

# 使用CEEMDAN进行分解
ceemdan = CEEMDAN()
IMFs = ceemdan(noisy_signal)

# 选择要保留的IMFs进行重构,通常是去掉高频IMFs
# 在这个例子中,我们假设前三个IMFs主要是噪声
reconstructed_signal = np.sum(IMFs[3:], axis=0)

# 绘制结果
plt.figure(figsize=(14, 10))

# 原始信号
plt.subplot(4, 1, 1)
plt.plot(t, original_signal, 'b')
plt.title("Original Signal")
plt.xlabel("Time [s]")

# 带噪声的信号
plt.subplot(4, 1, 2)
plt.plot(t, noisy_signal, 'r')
plt.title("Noisy Signal")
plt.xlabel("Time [s]")

# 降噪后的信号
plt.subplot(4, 1, 3)
plt.plot(t, reconstructed_signal, 'k')
plt.title("Denoised Signal")
plt.xlabel("Time [s]")

plt.tight_layout()
plt.show()

# 单独绘制IMFs
plt.figure(figsize=(14, 10))
for i, imf in enumerate(IMFs):
    plt.subplot(len(IMFs), 1, i + 1)
    plt.plot(t, imf, 'g')
    plt.title("IMF "+str(i+1))
    plt.xlabel("Time [s]")

plt.tight_layout()
plt.show()

代码解释

  1. 生成原始信号:生成一个频率为5Hz的正弦波信号。
  2. 添加噪声:将随机噪声添加到原始信号中,形成带噪声的信号。
  3. 使用CEEMDAN进行分解:将带噪声的信号进行CEEMDAN分解,得到若干个IMFs。
  4. 选择IMFs进行重构:根据分解结果选择适当的IMFs组合重构信号,实现信号的降噪。
  5. 绘制结果:首先绘制原始信号、带噪声的信号和降噪后的信号。然后在一个单独的图形中绘制所有IMFs。
相关推荐
闻缺陷则喜何志丹几秒前
【C++前后缀分解 动态规划】2100. 适合野炊的日子|1702
c++·算法·动态规划·力扣·前后缀分解·日子·适合
逝去的秋风14 分钟前
【代码随想录训练营第42期 Day57打卡 - 图论Part7 - Prim算法与Kruskal算法
算法·图论·prim算法
QXH20000023 分钟前
数据结构—双向链表
c语言·数据结构·算法·链表
旺小仔.42 分钟前
【数据结构篇】~排序(1)之插入排序
c语言·数据结构·算法·链表·性能优化·排序算法
绎岚科技1 小时前
深度学习自编码器 - 随机编码器和解码器篇
人工智能·深度学习·算法·机器学习
jingling5551 小时前
后端开发刷题 | 数字字符串转化成IP地址
java·开发语言·javascript·算法
云边有个稻草人1 小时前
【刷题】Day5--数字在升序数组中出现的次数
开发语言·笔记·算法
ymchuangke2 小时前
评价类——熵权法(Entropy Weight Method, EWM),完全客观评价
人工智能·python·算法·机器学习·数学建模
Crossoads2 小时前
【数据结构】排序算法---希尔排序
c语言·开发语言·数据结构·算法·排序算法
skaiuijing2 小时前
巧用二级指针
c语言·开发语言·算法·架构·操作系统