完全集成经验模态分解与自适应噪声(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。
相关推荐
清酒难咽3 小时前
算法案例之递归
c++·经验分享·算法
让我上个超影吧3 小时前
【力扣26&80】删除有序数组中的重复项
算法·leetcode
张张努力变强4 小时前
C++ Date日期类的设计与实现全解析
java·开发语言·c++·算法
沉默-_-4 小时前
力扣hot100滑动窗口(C++)
数据结构·c++·学习·算法·滑动窗口
钱彬 (Qian Bin)4 小时前
项目实践19—全球证件智能识别系统(优化检索算法:从MobileNet转EfficientNet)
算法·全球证件识别
feifeigo1234 小时前
基于EM算法的混合Copula MATLAB实现
开发语言·算法·matlab
漫随流水5 小时前
leetcode回溯算法(78.子集)
数据结构·算法·leetcode·回溯算法
IT猿手5 小时前
六种智能优化算法(NOA、MA、PSO、GA、ZOA、SWO)求解23个基准测试函数(含参考文献及MATLAB代码)
开发语言·算法·matlab·无人机·无人机路径规划·最新多目标优化算法
We་ct5 小时前
LeetCode 151. 反转字符串中的单词:两种解法深度剖析
前端·算法·leetcode·typescript
芜湖xin5 小时前
【题解-Acwing】AcWing 5579. 增加模数(TLE)
算法·快速幂