完全集成经验模态分解与自适应噪声(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。
本文章已经生成可运行项目
非常抱歉,我之前提供的代码存在错误。在 PyTorch 中,并没有直接提供离散余弦变换(DCT)的函数。对于 DCT 的实现,你可以使用 `torch.rfft` 函数结合 DCT 系数矩阵来进行计算。 下面是一个修正后的示例代码: ```python import torch import torch.nn as nn import torch.optim as optim # 定义离散余弦变换(DCT)系数矩阵 dct_matrix = torch.zeros(256, 256) for i in range(256): for j in range(256): dct_matrix[i, j] = torch.cos((2 * i + 1) * j * 3.14159 / (2 * 256)) # 定义 OMP 算法 def omp(A, y, k): m, n = A.shape x = torch.zeros(n, 1) residual = y.clone() support = [] for _ in range(k): projections = torch.abs(A.t().matmul(residual)) index = torch.argmax(projections) support.append(index) AtA_inv = torch.linalg.inv(A[:, support].t().matmul(A[:, support])) x_new = AtA_inv.matmul(A[:, support].t()).matmul(y) residual = y - A[:, support].matmul(x_new) x[support] = x_new return x # 加载原始图像 image = torch.randn(256, 256) # 压缩感知成像 measurement_matrix = torch.fft.fft(torch.eye(256), dim=0).real compressed = measurement_matrix.matmul(image.flatten().unsqueeze(1)) # 使用 OMP 进行重构 reconstructed = omp(dct_matrix, compressed, k=100) # 计算重构误差 mse = nn.MSELoss() reconstruction_error = mse(image, reconstructed.reshape(image.shape)) print("重构误差:", reconstruction_error.item()) ``` 在这个示例中,我们手动定义了 DCT 系数矩阵 `dct_matrix`,然后使用 `torch.fft.fft` 函数计算测量矩阵,并进行实部提取。接下来的步骤之前的示例相同。 请注意,这只是一个示例,用于演示如何使用自定义的 DCT 系数矩阵进行压缩感知成像。在实际应用中,你可能需要根据具体的需求进行调整和优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

夏秃然

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

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

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

打赏作者

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

抵扣说明:

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

余额充值