一、前言:为什么需要小波变换?
在数据分析、信号处理、图像处理领域,傅里叶变换(FFT)几乎是最常被提及的工具。但它存在一个致命缺陷:
FFT 只能提供频率信息,而无法告诉我们'频率在时间中的位置'。
于是科学家提出了短时傅里叶变换 STFT,但 STFT 固定窗口,无法兼顾高频精度与低频稳定性。
为了实现更灵活的'时频分析',小波变换(Wavelet Transform, WT)应运而生。
小波变换具备以下优势:
PyWavelets 是 Python 中成熟的小波分析库,支持离散/连续小波变换、多分辨率分析及图像处理。本文介绍其数学原理、核心 API 及常用小波家族,涵盖信号降噪、图像压缩、特征提取等工程场景。通过对比 FFT 与 STFT,阐述小波在时频分析中的优势,并提供完整的代码示例与性能优化策略,适用于非平稳信号处理与机器学习特征工程。
在数据分析、信号处理、图像处理领域,傅里叶变换(FFT)几乎是最常被提及的工具。但它存在一个致命缺陷:
FFT 只能提供频率信息,而无法告诉我们'频率在时间中的位置'。
于是科学家提出了短时傅里叶变换 STFT,但 STFT 固定窗口,无法兼顾高频精度与低频稳定性。
为了实现更灵活的'时频分析',小波变换(Wavelet Transform, WT)应运而生。
小波变换具备以下优势:
Python 中最成熟的小波库就是:
PyWavelets(pywt)
它提供数百种小波基、离散小波、连续小波、多分辨率分解、信号降噪、图像压缩、特征提取等完整功能,是信号处理与图像分析工程的标准库。
PyWavelets 是一个开源的 Python 小波分析库,支持:
安装方式非常简单:
pip install pywavelets
导入方式:
import pywt
import numpy as np
为了让你对 pywt 的操作真正'知其然也知其所以然',先介绍小波变换的基本思想。
通俗讲,小波是一种:
的小型振荡函数。
常见小波:
例如 Haar 小波:
_____ | | | |______ __|
它能很好反映信号的跳变位置。
DWT 的核心过程:
形成多尺度表示:
信号 → [Approximation(低频)] + [Detail(高频)]
示意:
Level1: A1 + D1
Level2: A2 + D2
Level3: A3 + D3
...
CWT 是对信号做全尺度扫描:
不同尺度(scale) 不同平移(translation)
适合检测:
使用以下代码查看所有小波名称:
pywt.wavelist()
常用类型:
| 小波类型 | 特点 | 应用 |
|---|---|---|
| Haar (db1) | 最简单,速度快 | 实时检测,跳变分析 |
| Daubechies | 平滑性高,紧支撑 | 图像处理,降噪 |
| Symlets | 对称性更好 | 信号去噪 |
| Coiflets | 多消失矩 | 数值分析 |
| Biorthogonal | 重建稳定 | 图像压缩(JPEG2000) |
| Morlet、Mexican Hat | 连续小波 | 时频分析 |
接下来进入实战。
signal = np.array([1, 2, 3, 4, 5, 6, 7, 8])
cA, cD = pywt.dwt(signal, 'db1')
print("低频:", cA)
print("高频:", cD)
输出高频(细节)与低频(趋势)。
coeffs = pywt.wavedec(signal, 'db4', level=3)
返回:
[A3, D3, D2, D1]
rec = pywt.waverec(coeffs, 'db4')
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 的重要功能。
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
得到四个子带:
recon = pywt.idwt2(coeffs2, 'haar')
小波降噪是传统图像处理中的黄金方案。
步骤:
示例:
coeffs = pywt.wavedec(img, 'db8', level=3)
coeffs_filt = [pywt.threshold(c, 20) for c in coeffs]
dennoised = pywt.waverec(coeffs_filt, 'db8')
原理:
可显著压缩大小。
心电图包含:
小波可精准分离噪声与心电成分。
高频异常脉冲可通过 CWT 强化。
小波用于检测:
小波能分离:
语音中:
小波与 Gabor 常用于指纹图像的纹理增强。
CWT 的高频峰适合提取边缘。
适用于:
MRA 是小波变换的核心思想。
pywt 提供:
pywt.wavedec()
pywt.waverec()
用于:
pywt.threshold(data, value, mode='soft')
模式包括:
适用于去噪、压缩。
| 特点 | FFT | 小波 |
|---|---|---|
| 局部化能力 | 差 | 强 |
| 时间分辨率 | 固定 | 自适应 |
| 适合信号 | 平稳信号 | 非平稳信号 |
| STFT | 小波 |
|---|---|
| 固定窗口 | 多尺度窗口 |
| 时间 - 频率矛盾 | 能自动平衡 |
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')
小波能提取:
常应用于:
提升:
例如:
PyWavelets(pywt)是 Python 中最专业、最完善的小波处理库。它适用于:
本文从原理到工程实践提供了完整的、可直接使用的代码与理解框架,帮助你在实际项目中充分利用小波技术。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online