You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PyWavelets计算Haar小波DWT系数为何与书本示例存在差异?

PyWavelets中Haar小波的归一化问题

是的,PyWavelets默认对Haar小波系数做了正交归一化,这就是你得到的系数和书本示例不同的原因。

两种Haar小波的区别

  • 书本中的未归一化版本:通常使用未归一化的滤波器组,低通滤波器为[1/2, 1/2],高通滤波器为[1/2, -1/2]。计算时,近似系数是相邻样本的平均值,细节系数是相邻样本差值的一半。以你的数据[11,9,5,7]为例,近似系数应为[(11+9)/2, (5+7)/2] = [10,6],细节系数为[(11-9)/2, (5-7)/2] = [1,-1],组合起来是[10,6,1,-1](可能你提到的书本示例存在笔误,或者使用了其他非标准的Haar定义)。
  • PyWavelets默认的归一化版本:使用正交归一化的滤波器组,低通滤波器为[1/√2, 1/√2],高通滤波器为[1/√2, -1/√2]。这种归一化保证了小波变换是正交变换,逆变换可以无误差恢复原始信号(你代码中的idwt结果和原信号完全一致就验证了这一点)。对应你的数据,近似系数为[(11+9)/√2, (5+7)/√2] ≈ [14.142, 8.485],细节系数为[(11-9)/√2, (5-7)/√2] ≈ [1.414, -1.414],和你运行代码得到的结果完全匹配。

如何得到未归一化的系数

如果你想要和书本逻辑一致的未归一化结果,可以通过两种方式实现:

方法1:手动调整系数

归一化系数是乘以了√2,因此将PyWavelets输出的系数除以√2即可得到未归一化的平均值和差值的一半:

import pywt
import numpy as np

x = [11,9,5,7]
cA, cD = pywt.dwt(x, 'haar')

# 转换为未归一化系数
cA_unnorm = cA / np.sqrt(2)
cD_unnorm = cD / np.sqrt(2)

print("未归一化近似系数:", cA_unnorm)  # 输出 [10. 6.]
print("未归一化细节系数:", cD_unnorm)  # 输出 [ 1. -1.]

方法2:自定义未归一化Haar小波

直接定义使用未归一化滤波器组的小波对象:

import pywt

# 定义未归一化的Haar小波
haar_unnorm = pywt.Wavelet(
    'haar_unnormalized',
    filter_bank=[
        [1/2, 1/2],   # 分解低通滤波器
        [1/2, -1/2],  # 分解高通滤波器
        [1/2, 1/2],   # 重构低通滤波器
        [1/2, -1/2]   # 重构高通滤波器
    ]
)

x = [11,9,5,7]
cA, cD = pywt.dwt(x, haar_unnorm)
print("未归一化近似系数:", cA)  # 输出 [10. 6.]
print("未归一化细节系数:", cD)  # 输出 [ 1. -1.]

归一化相关说明

PyWavelets的归一化逻辑核心是保证小波变换的正交性,使得变换后的系数满足能量守恒,逆变换可以完美恢复原始信号。这种正交归一化的Haar小波是信号处理领域的标准配置,相关细节可以在PyWavelets官方文档的小波定义和离散小波变换章节中找到,文档中明确说明了不同小波基的归一化策略。

内容的提问来源于stack exchange,提问作者Johanna

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 18:07:36