当前位置: 首页 > news >正文

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)=sign(x)(∣x∣−threshold)+T(x) = \text{sign}(x)(|x| - \text{threshold})_+T(x)=sign(x)(xthreshold)+
    • hard阈值:T(x)=x⋅I(∣x∣>threshold)T(x) = x \cdot \mathbb{I}(|x| > \text{threshold})T(x)=xI(x>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. 小波选择:不同小波适用于不同信号类型,需实验确定最优基

http://www.lryc.cn/news/611575.html

相关文章:

  • 飞算JavaAI开发平台:重构开发全流程——从需求到工程的智能化跃迁
  • 数据大集网:以数据为纽带,重构企业贷获客生态的助贷平台实践
  • React 表单处理:移动端输入场景下的卡顿问题与防抖优化方案
  • WebSocket 通信与 WebSocketpp 库使用指南
  • Baumer相机如何通过YoloV8深度学习模型实现农作物水稻病虫害的检测识别(C#代码UI界面版)
  • 深度学习-卷积神经网络CNN-多输入输出通道
  • 2025年大语言模型与多模态生成工具全景指南(V2.0)
  • 《动手学深度学习》读书笔记—9.3深度循环神经网络
  • MCU程序段的分类
  • 如何解决网页视频课程进度条禁止拖动?
  • Linux入门DAY18
  • MCU控制ADAU1701,用System Workbench for STM32导入工程
  • SSL/TLS协议深度解析
  • react 流式布局(图片宽高都不固定)的方案及思路
  • 【Create my OS】8 文件系统
  • 机器学习第六课之贝叶斯算法
  • 《第五篇》基于RapidOCR的图片和PDF文档加载器实现详解
  • 新能源汽车热管理系统核心零部件及工作原理详解
  • apache-tomcat-11.0.9安装及环境变量配置
  • 【算法训练营Day21】回溯算法part3
  • Redis的分布式序列号生成器原理
  • 【C++详解】STL-set和map的介绍和使用样例、pair类型介绍、序列式容器和关联式容器
  • 部署 Zabbix 企业级分布式监控笔记
  • 无人机开发分享——基于行为树的无人机集群机载自主决策算法框架搭建及开发
  • 分布式微服务--GateWay(1)
  • 3479. 水果成篮 III
  • Minio 高性能分布式对象存储
  • 分布式光伏气象站:安装与维护
  • 【论文分析】【Agent】SEW: Self-Evolving Agentic Workflows for Automated Code Generatio
  • 支持多网络协议的测试工具(postman被无视版)