完全集成经验模态分解与自适应噪声(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。
相关推荐
火星机器人life2 小时前
基于ceres优化的3d激光雷达开源算法
算法·3d
虽千万人 吾往矣2 小时前
golang LeetCode 热题 100(动态规划)-更新中
算法·leetcode·动态规划
arnold663 小时前
华为OD E卷(100分)34-转盘寿司
算法·华为od
ZZTC3 小时前
Floyd算法及其扩展应用
算法
lshzdq3 小时前
【机器人】机械臂轨迹和转矩控制对比
人工智能·算法·机器人
2401_858286114 小时前
115.【C语言】数据结构之排序(希尔排序)
c语言·开发语言·数据结构·算法·排序算法
猫猫的小茶馆4 小时前
【数据结构】数据结构整体大纲
linux·数据结构·算法·ubuntu·嵌入式软件
u0107735144 小时前
【字符串】-Lc5-最长回文子串(中心扩展法)
java·算法
帅逼码农5 小时前
K-均值聚类算法
算法·均值算法·聚类
姚先生975 小时前
LeetCode 209. 长度最小的子数组 (C++实现)
c++·算法·leetcode