一、前言:为什么需要小波变换?
在数据分析、信号处理、图像处理领域,傅里叶变换(FFT)几乎是最常被提及的工具。但它存在一个致命缺陷:
FFT 只能提供频率信息,而无法告诉我们"频率在时间中的位置"。
于是科学家提出了短时傅里叶变换 STFT,但 STFT 固定窗口,无法兼顾高频精度与低频稳定性。
为了实现更灵活的"时频分析",小波变换(Wavelet Transform, WT)应运而生。
小波变换具备以下优势:
- 同时拥有 时间域与频率域的信息
- 在高频部分具有 高时间分辨率
- 在低频部分具有 高频率分辨率
- 更适合 非平稳信号(如心电图、语音、图像、震动信号、股市序列)
Python 中最成熟的小波库就是:
PyWavelets(pywt)
它提供数百种小波基、离散小波、连续小波、多分辨率分解、信号降噪、图像压缩、特征提取等完整功能,是信号处理与图像分析工程的标准库。
二、pywt 库简介
PyWavelets 是一个开源的 Python 小波分析库,支持:
- 离散小波变换 DWT
- 多级小波分解 MRA
- 连续小波变换 CWT
- 小波包变换 WPT
- 图像小波处理(2D DWT)
- 信号降噪(软阈值/硬阈值)
- 信号压缩与重建
- 数百个小波家族
安装方式非常简单:
bash
pip install pywavelets
导入方式:
python
import pywt
import numpy as np
三、小波变换背后的数学原理(简单直观)
为了让你对 pywt 的操作真正"知其然也知其所以然",先介绍小波变换的基本思想。
1. 小波(Wavelet)是什么?
通俗讲,小波是一种:
- 时间局部化
- 频率局部化
- 平均值为 0
- 可以用于信号的多分辨率表示
的小型振荡函数。
常见小波:
- Haar(最简单的小波)
- Daubechies(db1、db2...db40)
- Symlets(sym)
- Coiflets(coif)
- Morlet(连续小波)
- Mexican Hat(连续小波)
例如 Haar 小波:
_____
| |
| |______
__|
它能很好反映信号的跳变位置。
2. 离散小波变换 DWT 的核心
DWT 的核心过程:
- 低通滤波器 → 提取趋势信息(低频部分)
- 高通滤波器 → 提取细节信息(高频部分)
- 每层低频再继续分解
形成多尺度表示:
信号 → [Approximation(低频)] + [Detail(高频)]
示意:
Level1:A1 + D1
Level2:A2 + D2
Level3:A3 + D3
...
3. 连续小波变换 CWT 的核心
CWT 是对信号做全尺度扫描:
不同尺度(scale)
不同平移(translation)
适合检测:
- 突变
- 高频事件
- 周期结构
四、pywt 提供的小波家族
使用以下代码查看所有小波名称:
python
pywt.wavelist()
常用类型:
| 小波类型 | 特点 | 应用 |
|---|---|---|
| Haar (db1) | 最简单,速度快 | 实时检测,跳变分析 |
| Daubechies | 平滑性高,紧支撑 | 图像处理,降噪 |
| Symlets | 对称性更好 | 信号去噪 |
| Coiflets | 多消失矩 | 数值分析 |
| Biorthogonal | 重建稳定 | 图像压缩(JPEG2000) |
| Morlet、Mexican Hat | 连续小波 | 时频分析 |
五、pywt 的核心 API 使用教程
接下来进入实战。
1. 一维离散小波分解(DWT)
python
signal = np.array([1,2,3,4,5,6,7,8])
cA, cD = pywt.dwt(signal, 'db1')
print("低频:", cA)
print("高频:", cD)
输出高频(细节)与低频(趋势)。
2. 多级小波分解
python
coeffs = pywt.wavedec(signal, 'db4', level=3)
返回:
[A3, D3, D2, D1]
3. 信号重建
python
rec = pywt.waverec(coeffs, 'db4')
六、连续小波变换(CWT)
示例:检测信号中的尖峰
python
import pywt
import numpy as np
time = np.linspace(0, 1, 400)
signal = np.sin(50*np.pi*time) + np.sin(80*np.pi*time)
scales = np.arange(1, 128)
coeffs, freqs = pywt.cwt(signal, scales, 'mexh')
CWT 适用于:
- 事件检测
- 雷达信号
- 地震波分析
- 机械振动诊断
七、二维小波变换(图像处理)
图像 DWT 是 pywt 的重要功能。
1. 单级图像小波分解
python
import pywt
from PIL import Image
import numpy as np
img = np.array(Image.open('test.jpg').convert('L'))
coeffs2 = pywt.dwt2(img, 'haar')
cA, (cH, cV, cD) = coeffs2
得到四个子带:
- cA:低频(模糊图)
- cH:水平细节
- cV:垂直细节
- cD:对角细节
2. 图像小波重建
python
recon = pywt.idwt2(coeffs2, 'haar')
八、pywt 在工程中的典型应用案例(10 个场景)
1. 图像降噪(最常用)
小波降噪是传统图像处理中的黄金方案。
步骤:
- 小波分解
- 对高频分量进行阈值处理(硬/软阈)
- 重建图像
示例:
python
coeffs = pywt.wavedec(img, 'db8', level=3)
coeffs_filt = [pywt.threshold(c, 20) for c in coeffs]
denoised = pywt.waverec(coeffs_filt, 'db8')
2. 图像压缩(JPEG2000 原理)
原理:
- 保留低频信息
- 高频量化或裁剪
- 重建
可显著压缩大小。
3. 医疗信号处理------心电图 ECG 去噪
心电图包含:
- QRS 复合波(高频)
- P、T 波(低频)
- 噪声
小波可精准分离噪声与心电成分。
4. 机械故障诊断(轴承、齿轮)
高频异常脉冲可通过 CWT 强化。
5. 地震波分析(Seismic)
小波用于检测:
- 地震事件
- 初至波
- 波段变化
6. 股票价格异常检测
小波能分离:
- 长期趋势
- 高频波动(噪声)
- 极端事件
7. 音频处理(语音增强)
语音中:
- 高频分量为噪声
- 高频阈值后可提升音质
8. 指纹图像增强
小波与 Gabor 常用于指纹图像的纹理增强。
9. 图像边缘检测
CWT 的高频峰适合提取边缘。
10. 多分辨率图像融合
适用于:
- 红外 + 可见光图像融合
- 医疗 CT+MRI 融合
- 低分辨率 + 高分辨率合成
九、pywt 的多分辨率分析(MRA)高级用法
MRA 是小波变换的核心思想。
pywt 提供:
python
pywt.wavedec()
pywt.waverec()
用于:
- 不同层级信息分析
- 局部特征提取
- 异常点检测
十、阈值方法:支持 4 种小波阈值策略
python
pywt.threshold(data, value, mode='soft')
模式包括:
- soft
- hard
- greater
- less
适用于去噪、压缩。
十一、pywt 与 FFT、STFT、scipy.signal 的对比
FFT 对比
| 特点 | FFT | 小波 |
|---|---|---|
| 局部化能力 | 差 | 强 |
| 时间分辨率 | 固定 | 自适应 |
| 适合信号 | 平稳信号 | 非平稳信号 |
STFT 对比
| STFT | 小波 |
|---|---|
| 固定窗口 | 多尺度窗口 |
| 时间-频率矛盾 | 能自动平衡 |
scipy.signal
- 偏向传统滤波
- 不支持高级小波族
- pywt 更专业
十二、工程实践:完整小波降噪实战示例
python
import pywt
import numpy as np
import matplotlib.pyplot as plt
# 原始信号
x = np.linspace(0, 1, 400)
s = np.sin(25 * np.pi * x) + 0.5 * np.random.randn(400)
# 小波分解
coeffs = pywt.wavedec(s, 'db8', level=4)
# 高频阈值
threshold = 0.3
coeffs_filtered = [coeffs[0]] + [pywt.threshold(c, threshold, mode='soft') for c in coeffs[1:]]
# 重建
s_rec = pywt.waverec(coeffs_filtered, 'db8')
十三、pywt 在 AI / 机器学习中的应用
1. 特征工程(重要)
小波能提取:
- 能量
- 峰度
- 多尺度特征
常应用于:
- 故障诊断(机器学习)
- EEG 脑电分类
- ECG 心电异常检测
- 乐音分类
- 机械振动分类
2. 深度学习前的信号清洗
提升:
- ECG 分类
- 音频识别
- 时序预测精度
3. 与图像识别结合(CNN 前置滤波)
例如:
- 边缘增强
- 多尺度纹理提取
十四、性能优化与大规模数据处理策略
1. 使用 Daubechies 小波(db2-db8)速度最好
2. 使用多线程并行处理信号块
3. 对图像使用 2D DWT 分块处理
十五、总结
PyWavelets(pywt)是 Python 中最专业、最完善的小波处理库。它适用于:
- 信号分析
- 图像处理
- 降噪
- 压缩
- 特征提取
- 工业诊断
- 医疗信号
- 金融信号
- 多尺度分析
- AI 与深度学习前置处理
本文从原理到工程实践提供了完整的、可直接使用的代码与理解框架,帮助你在实际项目中充分利用小波技术。