SciPy - 小波包变换 (WPT)
SciPy 中的小波包变换
小波包变换 (WPT) 是一种高级信号处理技术,它扩展了离散小波变换 (DWT),通过允许在每一层分解近似系数和细节系数来实现。这通过提供更详细的信号分析,使 WPT 在需要更精细频率分辨率的应用中非常有用,例如特征提取、压缩和去噪。
数学上,信号 x(t) 的小波包变换可以表示为以下形式 −
$\mathrm{W(j, k, n) = \int_{-\infty}^{\infty} x(t) \psi^* \left( \frac{t - k}{2^j} \right) dt}$
其中 −
- x(t) 是输入信号。
- (t) 是母小波。
- = 2j 是尺度因子。
- = k 是平移参数。
- n 是小波包树中的节点索引。
- W(j, k, n) 表示在尺度 j、位置 k 和节点 n 处的小波包系数。
WPT 的关键特性
以下是小波包变换的关键特性 −
- 完全分解: 与 DWT 不同,WPT 在每一层分解近似系数和细节系数,从而提供更丰富的信号表示。
- 更好的频率分辨率: WPT 比 DWT 提供更好的频率定位,使其适用于精细的频谱分析。
- 灵活的信号表示: WPT 能够基于特定应用需求进行自适应信号表示。
- 计算复杂度: 由于完全分解,WPT 比 DWT 需要更多的计算资源。
与 DWT 类似,WPT 可以使用 PyWavelets(pywt)库实现,该库提供了强大功能用于小波包分析。
使用 PyWavelets (pywt) 进行 WPT
如果我们想在 Python 中执行小波包变换,PyWavelets 提供了易于使用的函数来高效处理 WPT。
使用 PyWavelets 的 WPT 基本示例
小波包变换 (WPT) 提供了比标准离散小波变换 (DWT) 更详细的信号分解。在本示例中,我们将使用 Daubechies 小波 ('db1') 分析一个复合信号,并将其分解为多个子带。WPT 通过提供更丰富的频率-时间分析,使其适用于音频处理、生物医学信号分析和故障检测等应用。
让我们对一个样本信号执行小波包变换并可视化分解 −
import numpy as np
import pywt
import matplotlib.pyplot as plt
# 生成一个包含两个不同频率正弦波的复合信号
t = np.linspace(0, 1, 512, endpoint=False)
signal = np.sin(2 * np.pi * 50 * t) + np.sin(2 * np.pi * 120 * t)
# 使用 Daubechies 小波 ('db1') 执行小波包变换
wp = pywt.WaveletPacket(data=signal, wavelet='db1', mode='symmetric', maxlevel=3)
# 从第 3 层节点提取系数
coeffs = [node.data for node in wp.get_level(3, order='freq')]
# 绘制原始信号和小波包系数
plt.figure(figsize=(10, 8))
# 绘制原始信号
plt.subplot(len(coeffs) + 1, 1, 1)
plt.plot(t, signal, label="Original Signal", color='blue')
plt.title("Original Signal")
plt.legend()
# 绘制不同节点的小波包系数
for i, coef in enumerate(coeffs):
plt.subplot(len(coeffs) + 1, 1, i + 2)
plt.plot(coef, label=f"Node {i}")
plt.title(f"Wavelet Packet Coefficients - Node {i}")
plt.legend()
plt.tight_layout()
plt.show()
以下是使用 PyWavelets 的基本小波包变换的输出 −

WPT 中的最优子带选择
小波包变换 (WPT) 相比标准离散小波变换 (DWT) 提供了更灵活的信号分解,因为它允许对所有频带进行分解。在 WPT 中选择最优子带对于信号压缩、去噪和特征提取等应用至关重要。
选择通常基于诸如熵、能量或统计量等标准,这些标准量化了每个子带中有用的信息量。
子带选择常见标准
- 基于能量的选择: 测量每个子带内的总能量,以选择最重要的子带。
- 基于熵的选择: 选择熵最高的子带,该子带包含最多的信息。
- 重构误差: 选择能够最小化重构误差的子带,以保留最相关的数据。
- 方差或统计量: 使用方差量化系数分布,从而有助于特征提取任务。
在本示例中,我们将对一个合成信号执行小波包变换,并选择能量最高的子带 −
import numpy as np
import pywt
import matplotlib.pyplot as plt
# 生成合成信号(正弦波之和)
t = np.linspace(0, 1, 512, endpoint=False)
signal = np.sin(2 * np.pi * 50 * t) + np.sin(2 * np.pi * 120 * t)
# 使用 'db1' 小波执行 3 级小波包变换
wp = pywt.WaveletPacket(data=signal, wavelet='db1', mode='symmetric', maxlevel=3)
# 获取最大分解级别下的所有子带
nodes = wp.get_level(3, order='freq')
# 计算每个子带的能量
subband_energies = [np.sum(node.data**2) for node in nodes]
# 识别最优子带(最大能量)
optimal_subband_index = np.argmax(subband_energies)
optimal_subband = nodes[optimal_subband_index].data
# 绘制原始信号和最优子带
plt.figure(figsize=(10, 6))
# 绘制原始信号
plt.subplot(2, 1, 1)
plt.plot(t, signal, label="Original Signal", color='blue')
plt.title("Original Signal")
plt.legend()
# 绘制最优子带
plt.subplot(2, 1, 2)
plt.plot(optimal_subband, label=f"Optimal Subband (Node {optimal_subband_index})", color='red')
plt.title(f"Optimal Subband with Highest Energy - Node {optimal_subband_index}")
plt.legend()
plt.tight_layout()
plt.show()
以下输出显示了原始信号以及所选的最优子带,该子带包含最高能量,从而使其适用于进一步分析 −
WPT 的应用
小波包变换 (WPT) 在各种领域得到广泛应用,特别是在需要精细频率分析的领域。一些关键应用如下 −
- 语音和音频处理: WPT 为音频压缩和语音识别提供了更高的分辨率。
- 生物医学信号分析: 用于 ECG 和 EEG 分析中的特征提取和噪声减少。
- 图像压缩: WPT 通过提供自适应子带分解有助于高效压缩。
- 故障诊断: WPT 用于机械和电气系统中检测振动信号中的异常。
为 WPT 选择合适的 小波
为 WPT 选择合适的 小波函数对于最优信号表示至关重要。一些常用的小波包括 −
| 小波 | 最适合 | 示例用例 |
|---|---|---|
| Daubechies (db) | 平滑信号 | 语音和音频处理 |
| Coiflet | 生物医学信号 | EEG/ECG 分析 |
| Symlet | 对称信号 | 压缩 |