完全集成经验模态分解与自适应噪声(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分解结果

示例代码

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。
### 解析 Import Error 的常见原因 当遇到 `ImportError: cannot import name 'Generic'` 错误时,通常意味着尝试从模块中导入的对象不存在或无法访问。此问题可能由多种因素引起: - 版本不兼容:不同库之间的版本冲突可能导致此类错误。 - 安装缺失:目标库未正确安装或路径配置有误。 - 导入语句不当:可能存在循环依赖或其他语法层面的问题。 ### 针对 Generic 类型的具体解决方案 对于特定于 `Generic` 的情况,考虑到 Python 中 `Generic` 是 typing 模块的一部分,在处理该类别的 ImportError 时可采取如下措施[^1]: #### 方法一:确认typing模块可用性 确保环境中已安装标准库中的 typing 模块,并且其版本支持所使用的特性。可以通过以下命令验证: ```bash python -c "from typing import Generic; print(Generic)" ``` 如果上述命令执行失败,则可能是由于 Python 或者相关扩展包的版本过低造成的。此时应考虑升级至更高版本的解释器以及对应的开发工具链。 #### 方法二:调整导入方式 有时直接通过顶层命名空间来获取所需组件会更稳定可靠。修改代码以采用这种做法可能会解决问题: ```python from collections.abc import Iterable # 如果是迭代器相关接口 from typing import TypeVar, Protocol # 对于协议和泛型定义 T = TypeVar('T') class MyContainer(Protocol[T]): ... ``` 注意这里并没有显式提到 `Generic` ,而是利用了更为基础的数据结构抽象基类或是其他替代方案实现相同功能[^2]。 #### 方法三:排查环境变量设置 检查系统的 PYTHONPATH 和虚拟环境配置是否正常工作。任何异常都可能导致某些第三方软件包找不到必要的资源文件而引发类似的错误提示。建议清理并重建项目专属的工作区以便排除干扰项的影响。 #### 示例修正后的代码片段 假设原始代码试图这样引入 `Generic` : ```python from some_module import Generic # 可能导致 ImportError ``` 改为遵循官方文档推荐的方式后变为: ```python from typing import Generic # 正确的做法 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夏秃然

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值