信号处理基础(2)小波阈值去噪方法

上篇文章主要介绍了小波阈值去噪的原理:信号处理基础(1)小波阈值去噪原理详解-CSDN博客接下来讲下如何使用python进行实现

一、小波阈值去噪的关键步骤

  1. 小波分解:选择合适的小波基和分解层数,将信号分解为近似系数和细节系数。
  2. 阈值处理:确定阈值并选择阈值函数对细节系数进行处理。
  3. 小波重构:利用处理后的系数重构信号。

二、Python 实现小波阈值去噪

主要分为两部分:小波分解与重构、阈值函数实现

1.小波分解与重构

import numpy as np
import pywt
import matplotlib.pyplot as plt

def wavelet_decomposition(signal, wavelet='db4', level=3):
    """
    小波分解函数
    Parameters:
        signal (array): 输入信号
        wavelet (str): 小波基,默认为'db4'
        level (int): 分解层数
    Returns:
        coeffs (list): 分解后的系数列表
        sigma (float): 噪声标准差估计
    """
    # 小波分解
    coeffs = pywt.wavedec(signal, wavelet, level=level)
    
    # 计算噪声估计 (使用最高频细节系数)
    sigma = np.median(np.abs(coeffs[-1])) / 0.6745  # 噪声标准差估计
    
    return coeffs, sigma

def wavelet_reconstruction(processed_coeffs, wavelet='db4', original_length=None):
    """
    小波重构函数
    Parameters:
        processed_coeffs (list): 处理后的系数列表
        wavelet (str): 小波基,这里使用'db4'
        original_length (int): 原始信号长度,用于处理边界效应
    Returns:
        denoised_signal (array): 重构后的信号
    """
    # 小波重构
    denoised_signal = pywt.waverec(processed_coeffs, wavelet)
    
    # 处理边界效应(可能长度不一致)
    if original_length is not None:
        return denoised_signal[:original_length]
    return denoised_signal

2.阈值函数实现部分:硬阈值、软阈值和 Garrote 阈值

def hard_threshold_denoising(coeffs, sigma, threshold_mode='universal'):
    """
    硬阈值去噪函数
    Parameters:
        coeffs (list): 分解后的系数列表
        sigma (float): 噪声标准差估计
        threshold_mode (str): 阈值计算方式 ('universal', 'manual')
    Returns:
        processed_coeffs (list): 处理后的系数列表
    """
    # 计算通用阈值
    if threshold_mode == 'universal':
        N = len(np.concatenate(coeffs))
        threshold = sigma * np.sqrt(2 * np.log(N))
    else:
        threshold = sigma  # 可自定义阈值
    
    # 应用硬阈值处理(不处理近似系数)
    processed_coeffs = [coeffs[0]]  # 保留近似系数
    for i in range(1, len(coeffs)):
        processed_coeffs.append(coeffs[i] * (np.abs(coeffs[i]) >= threshold))
    
    return processed_coeffs

def soft_threshold_denoising(coeffs, sigma, threshold_mode='universal'):
    """
    软阈值去噪函数
    Parameters:
        coeffs (list): 分解后的系数列表
        sigma (float): 噪声标准差估计
        threshold_mode (str): 阈值计算方式 ('universal', 'manual')
    Returns:
        processed_coeffs (list): 处理后的系数列表
    """
    # 计算通用阈值
    if threshold_mode == 'universal':
        N = len(np.concatenate(coeffs))
        threshold = sigma * np.sqrt(2 * np.log(N))
    else:
        threshold = sigma  # 可自定义阈值
    
    # 应用软阈值处理(不处理近似系数)
    processed_coeffs = [coeffs[0]]  # 保留近似系数
    for i in range(1, len(coeffs)):
        processed_coeffs.append(np.sign(coeffs[i]) * np.maximum(np.abs(coeffs[i]) - threshold, 0))
    
    return processed_coeffs

def garrote_threshold_denoising(coeffs, sigma, threshold_mode='universal'):
    """
    Garrote阈值去噪函数
    Parameters:
        coeffs (list): 分解后的系数列表
        sigma (float): 噪声标准差估计
        threshold_mode (str): 阈值计算方式 ('universal', 'manual')
    Returns:
        processed_coeffs (list): 处理后的系数列表
    """
    # 计算通用阈值
    if threshold_mode == 'universal':
        N = len(np.concatenate(coeffs))
        threshold = sigma * np.sqrt(2 * np.log(N))
    else:
        threshold = sigma  # 可自定义阈值
    
    # 应用Garrote阈值处理(不处理近似系数)
    processed_coeffs = [coeffs[0]]  # 保留近似系数
    for i in range(1, len(coeffs)):
        abs_coeffs = np.abs(coeffs[i])
        processed_coeffs.append(np.where(abs_coeffs >= threshold, 
                                        (1 - (threshold**2)/(abs_coeffs**2)) * coeffs[i], 0))
    
    return processed_coeffs

三、参数的选择与分析

  1. 小波基选择:代码中使用了 Daubechies 4 (db4) 小波基,这是一种常用的紧支集小波基。不同的小波基对去噪效果有一定影响,实际应用中需要根据信号特性选择合适的小波基。

  2. 分解层数确定:分解层数level决定了信号被分解的精细程度。层数越多,细节信息越丰富,但计算复杂度也会增加。一般根据信号长度和噪声特性来选择。

  3. 阈值计算方法

    • Universal 阈值:基于 Donoho 提出的通用阈值公式 λ=σ√(2logN)
    • 手动阈值:根据实际情况自定义阈值
  4. 阈值函数比较

    • 硬阈值:直接将小于阈值的系数置零,能较好保留信号的边缘和细节,但可能产生振荡。
    • 软阈值:将大于阈值的系数进行收缩,去噪后的信号更加平滑,但可能导致边缘模糊。
    • Garrote 阈值:介于硬阈值和软阈值之间的折衷方法,既保留了信号的细节,又避免了硬阈值的振荡问题。

四、优化方向(改进与创新)

  1. 自适应阈值选择方法的研究,根据信号局部特性自动调整阈值。
  2. 多小波和提升小波变换的应用,进一步提高去噪性能。
  3. 与深度学习相结合的去噪算法,利用深度学习强大的特征提取能力优化去噪效果。

完整代码:https://download.csdn.net/download/m0_63478459/90849905 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小夜程序猿

感谢打赏,老板大气

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

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

打赏作者

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

抵扣说明:

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

余额充值