Python实现信号小波分解与重构

简介: Python实现信号小波分解与重构

使用Python中的PyWavelets库实现信号小波分解和重构

步骤说明

  1. 导入库:使用pywt进行小波变换,numpy处理数据,matplotlib绘图
  2. 生成示例信号:创建包含多个频率成分的合成信号
  3. 小波分解:使用wavedec进行多级分解
  4. 系数处理(可选):可在此步骤修改系数(如去噪、压缩)
  5. 信号重构:使用waverec重构信号
  6. 结果可视化:比较原始信号与重构信号

完整代码

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

# 1. 生成示例信号
t = np.linspace(0, 1, 1000, endpoint=False)
signal = np.sin(2 * np.pi * 10 * t) + 0.5 * np.sin(2 * np.pi * 50 * t)
signal += 0.2 * np.random.randn(len(t))  # 添加噪声

# 2. 小波分解参数设置
wavelet = 'db4'  # 使用Daubechies4小波
level = 4        # 分解层数

# 3. 执行小波分解
coeffs = pywt.wavedec(signal, wavelet, level=level)
cA4, cD4, cD3, cD2, cD1 = coeffs  # 各级系数

print(f"系数结构: {[c.shape for c in coeffs]}")

# 4. (可选) 系数处理 - 这里演示简单的阈值去噪
threshold = 0.5  # 阈值大小
coeffs_thresh = [coeffs[0]]  # 保留近似系数
for i in range(1, len(coeffs)):
    # 对细节系数应用软阈值
    coeffs_thresh.append(pywt.threshold(coeffs[i], threshold, mode='soft'))

# 5. 信号重构
reconstructed = pywt.waverec(coeffs_thresh, wavelet)

# 确保信号长度一致(小波变换可能导致边界扩展)
reconstructed = reconstructed[:len(signal)]

# 6. 结果可视化
plt.figure(figsize=(12, 10))

# 原始信号
plt.subplot(4, 1, 1)
plt.plot(t, signal)
plt.title("原始信号 (含噪声)")
plt.grid(True)

# 分解系数
plt.subplot(4, 1, 2)
for i, coeff in enumerate(coeffs_thresh):
    if i == 0:
        plt.plot(coeff, 'r', label=f'cA{level}')
    else:
        plt.plot(coeff, label=f'cD{level-i+1}')
plt.title("小波系数 (阈值处理后)")
plt.legend()
plt.grid(True)

# 重构信号
plt.subplot(4, 1, 3)
plt.plot(t, reconstructed)
plt.title("重构信号 (去噪后)")
plt.grid(True)

# 重构误差
plt.subplot(4, 1, 4)
plt.plot(t, signal - reconstructed, 'r')
plt.title("重构误差")
plt.grid(True)

plt.tight_layout()
plt.show()

# 计算重构误差
mse = np.mean((signal - reconstructed)**2)
print(f"均方误差 (MSE): {mse:.6f}")
print(f"最大绝对误差: {np.max(np.abs(signal - reconstructed)):.6f}")

关键参数说明

  1. 小波基选择:

    • 'db4':Daubechies 4阶小波(常用)
    • 其他选项:'haar', 'sym5', 'coif3'等(根据信号特性选择)
  2. 分解层数:

    • 通常选择使最低频分量有足够代表性的层数
    • 最大层数限制:level <= pywt.dwt_max_level(len(signal), wavelet)
  3. 阈值处理:

    • soft阈值:$T(x) = \text{sign}(x)(|x| - \text{threshold})_+$
    • hard阈值:$T(x) = x \cdot \mathbb{I}(|x| > \text{threshold})$
    • 阈值选择方法:threshold = np.std(coeff) * np.sqrt(2*np.log(len(signal)))

输出结果

  1. 系数结构:显示各级系数的长度(随分解层级递减)
  2. 四部分可视化:
    • 含噪声的原始信号
    • 阈值处理后的各级系数
    • 重构后的去噪信号
    • 重构误差曲线
  3. 误差指标:
    • 均方误差(MSE)
    • 最大绝对误差

应用场景

  1. 信号去噪:通过阈值处理细节系数
  2. 特征提取:分析各级系数获取时频特征
  3. 数据压缩:保留重要系数,丢弃小系数
  4. 奇点检测:利用细节系数定位突变点

注意事项

  1. 边界效应:小波变换可能引入边界失真,可考虑:

    # 使用周期模式减少边界效应
    coeffs = pywt.wavedec(signal, wavelet, level=level, mode='per')
    
  2. 系数长度:重构后需截取原信号长度

  3. 小波选择:不同小波适用于不同信号类型,需实验确定最优基

相关文章
|
JavaScript 前端开发 数据可视化
Py之mpld3:mpld3的简介、安装、使用方法之详细攻略
Py之mpld3:mpld3的简介、安装、使用方法之详细攻略
Py之mpld3:mpld3的简介、安装、使用方法之详细攻略
|
9月前
|
算法 编译器 C语言
【2026最新】MinGW64官网下载安装保姆级教程(附安装包+图文并茂)
MinGW-w64 是 Windows 下的轻量级 GNU 编译器集合,支持 C/C++ 编译,无需虚拟机即可生成独立 exe 文件。它体积小、免安装、静态链接运行库,兼容 Win10/11 与旧系统,配置简单,广泛用于算法开发、刷题及教学场景。
15911 5
|
12月前
|
存储 弹性计算 固态存储
阿里云新用户优惠:个人、学生和企业购买云服务器配置价格整理
2025阿里云服务器配置全解析:个人用户选200M轻量服务器,68元/年起;企业选2核4G ECS,199元/年,续费同价。详解CPU、内存、带宽及实例类型选择,助力高效上云。
1033 9
|
编解码 算法 数据安全/隐私保护
一维信号的小波变换与重构算法matlab仿真
本程序使用MATLAB2022A实现一维信号的小波变换与重构,对正弦测试信号进行小波分解和重构,并计算重构信号与原信号的误差。核心步骤包括:绘制分解系数图像、上抽取与滤波重构、对比原始与重构信号及误差分析。小波变换通过多分辨率分析捕捉信号的局部特征,适用于非平稳信号处理,在信号去噪、压缩等领域有广泛应用。
|
11月前
|
机器学习/深度学习 人工智能 机器人
焊接情况检测数据集(千张图片已划分)| 面向工业质检的目标检测训练集
总结来看,本次分享的焊接情况检测数据集为工业智能化提供了坚实的基础。数据集涵盖了“良好焊缝”、“不良焊缝”和“缺陷”三大类别,采用了标准的 YOLO 标注格式,保证了在目标检测任务中能够高效、准确地训练模型。通过合理划分训练集、验证集和测试集,开发者可以充分利用数据进行模型优化与验证,从而在实际工业生产环境中实现对焊接表面缺陷的自动检测与监控。
焊接情况检测数据集(千张图片已划分)| 面向工业质检的目标检测训练集
|
算法 数据安全/隐私保护
基于16QAM的载波同步和定时同步性能仿真,采用四倍采样,包括Costas环和gardner环
本内容主要介绍了基于MATLAB的算法仿真及其涉及的理论知识。通过Matlab2022a仿真,展示了载波同步与位同步在通信系统中的实现效果,并提供无水印的完整代码运行结果。理论部分详细阐述了载波同步、位同步的概念,以及Costas环和Gardner定时误差算法的应用原理。核心程序包括鉴相器、环路滤波器处理及NCO相位生成等关键步骤,最终通过星座图对比验证了16QAM信号同步前后的性能改善。
935 30
|
机器学习/深度学习 算法 大数据
机器学习入门:梯度下降算法(下)
机器学习入门:梯度下降算法(下)
|
数据采集 人工智能 算法
资深博导:我以为数据预处理是常识,直到遇到自己的学生
**摘要:** 本文介绍如何使用Python对近红外光谱土壤数据进行预处理,包括MSC(多元散射校正)、SNV(标准正规化变换)、光谱微分、基线校正和去趋势。通过代码示例展示了预处理步骤,以及每种方法前后的光谱对比。预处理旨在减少噪音、消除散射效应、基线漂移和趋势,提高数据质量和可比性,以利于后续的分析和建模。每部分都配有图表,显示了处理前后的光谱变化。
1517 0
资深博导:我以为数据预处理是常识,直到遇到自己的学生
|
机器学习/深度学习 数据采集 算法
【机器学习】DBSCAN算法
【机器学习】DBSCAN算法
1277 0
【机器学习】DBSCAN算法

热门文章

最新文章