# 10.3 小波变换

### 10.3.1 小波对象

#### 小波族和内建小波名称

小波对象实际上是一组特定于dwt的数据的方便载体，比如正交镜滤波器和一些与之相关的一般属性。

首先让我们看看创建小波对象的方法。最简单和最方便的方法是使用内置的小波。

这些小波被组织成小波族。最常用的家庭有:

\[]:print(pyet.families())

\[]:\['haar', 'db', 'sym', 'coif', 'bior', 'rbio', 'dmey', 'gaus', 'mexh', 'morl', 'cgau', 'shan', 'fbsp', 'cmor']

将wavelist()函数的姓作为参数传递，用于获得每个家族中的小波名列表。

\[]:for family in pywt.families():

print("%s family: " % family + ', '.join(pywt.wavelist(family)))

\[]:haar family: haar

db family: db1, db2, db3, db4, db5, db6, db7, db8, db9, db10, db11, db12, db13, db14, db15, db16, db17, db18, db19, db20, db21, db22, db23, db24, db25, db26, db27, db28, db29, db30, db31, db32, db33, db34, db35, db36, db37, db38

sym family: sym2, sym3, sym4, sym5, sym6, sym7, sym8, sym9, sym10, sym11, sym12, sym13, sym14, sym15, sym16, sym17, sym18, sym19, sym20

coif family: coif1, coif2, coif3, coif4, coif5, coif6, coif7, coif8, coif9, coif10, coif11, coif12, coif13, coif14, coif15, coif16, coif17

bior family: bior1.1, bior1.3, bior1.5, bior2.2, bior2.4, bior2.6, bior2.8, bior3.1, bior3.3, bior3.5, bior3.7, bior3.9, bior4.4, bior5.5, bior6.8

rbio family: rbio1.1, rbio1.3, rbio1.5, rbio2.2, rbio2.4, rbio2.6, rbio2.8, rbio3.1, rbio3.3, rbio3.5, rbio3.7, rbio3.9, rbio4.4, rbio5.5, rbio6.8

dmey family: dmey

gaus family: gaus1, gaus2, gaus3, gaus4, gaus5, gaus6, gaus7, gaus8

mexh family: mexh

morl family: morl

cgau family: cgau1, cgau2, cgau3, cgau4, cgau5, cgau6, cgau7, cgau8

shan family: shan

fbsp family: fbsp

cmor family: cmor

#### 创建小波对象

现在，当我们知道了所有的名字，让我们最终创建一个小波对象:

\[]:w = pywt.Wavelet('db3')

#### 小波属性

但是我们能对小波对象做什么呢?它们有一些有趣的信息。

首先，让我们尝试打印一个小波对象。这显示了关于它的名字，它的姓和一些属性，如正交性和对称性的简短信息。

\[]:print(w)

Wavelet db3

Family name: Daubechies

Short name: db

Filters length: 6

Orthogonal: True

Biorthogonal: True

Symmetry: asymmetric

DWT: True

CWT: False

但最重要的信息是用于离散小波变换的小波滤波器系数。这些系数可以通过dec\_lo，小波。dec\_hi, rec\_lo, rec\_hi属性得到，分别对应于低通分解滤波器和高通分解滤波器，低通重构滤波器和高通重构滤波器:

\[]:def print\_array(arr):

print("\[%s]" % ", ".join(\["%.14f" % x for x in arr]))

获取过滤器数据的另一种方法是使用filter\_bank属性，它在一个元组中返回所有四个过滤器:

\[]:w.filter\_bank == (w.dec\_lo, w.dec\_hi, w.rec\_lo, w.rec\_hi)

其他小波属性为:小波名称，short\_family\_name和family\_name:

\[]:w.name, w.short\_family\_name, w.family\_name

\[]:('db3', 'db', 'Daubechies')

分解(dec\_len)和重构(rec\_len)过滤器长度:

\[]:int(w.dec\_len), int(w.rec\_len)

(6, 6)

正交性与双正交性

w.orthogonal, w.biorthogonal

(True, True)

对称性

\[]:w.symmetry

\[]:'asymmetric'

与滤波器相关联的尺度函数(vanishing\_moments\_phi)和小波函数(vanishing\_moments\_psi)的消失矩数:

\[]:w.vanishing\_moments\_phi, w.vanishing\_moments\_psi

\[]:(0, 3)

现在，当我们对内置小波有了一些了解之后，让我们看看如何创建自定义小波对象。有两种方法可以做到这一点:

1. 传递实现filter\_bank属性的filter bank对象。属性必须返回四个过滤器系数。

\[]:class MyHaarFilterBank(object):

... @property

... def filter\_bank(self):

... from math import sqrt

... return (\[sqrt(2)/2, sqrt(2)/2], \[-sqrt(2)/2, sqrt(2)/2],

... \[sqrt(2)/2, sqrt(2)/2], \[sqrt(2)/2, -sqrt(2)/2])

\[]:my\_wavelet = pywt.Wavelet('My Haar Wavelet', filter\_bank=MyHaarFilterBank())

传递实现filter\_bank属性的filter bank对象。属性必须返回四个过滤器系数。

\[]:from math import sqrt

my\_filter\_bank = (\[sqrt(2)/2, sqrt(2)/2], \[-sqrt(2)/2, sqrt(2)/2],

\[sqrt(2)/2, sqrt(2)/2], \[sqrt(2)/2, -sqrt(2)/2])

my\_wavelet = pywt.Wavelet('My Haar Wavelet', filter\_bank=my\_filter\_bank)

注意，这种自定义小波不会将所有属性设置为正确的值:

\[]:my\_wavelet

\[]:\
Wavelet My Haar Wavelet

Family name:

Short name:

Filters length: 2

Orthogonal: False

Biorthogonal: False

Symmetry: unknown

DWT: True

CWT: False

不过，你可以自己设置一些:

\[]:my\_wavelet.orthogonal = **True**

my\_wavelet.biorthogonal = **True**

\[]:print(my\_wavelet)

Wavelet My Haar Wavelet

Family name:

Short name:

Filters length: 2

Orthogonal: True

Biorthogonal: True

Symmetry: unknown

DWT: True

CWT: False

#### 找点乐子

我们都知道小波函数的有趣之处在于小波函数。如果没有计算小波函数和尺度函数近似值的工具，这个包会是什么样子呢?

这就是wavefun()方法的目的，该方法基于滤波器系数，在给定的细化级别上近似尺度函数(phi)和小波函数(psi)。

返回值的个数取决于小波的正交性。对于正交小波，结果是具有尺度函数、小波函数和xgrid坐标的元组。

\[]:w = pywt.Wavelet('sym3')

w.orthogonal

\[]:True

\[]:(phi, psi, x) = w.wavefun(level=5)

对于双正交(非正交)小波，采用不同的尺度和小波函数进行分解和重构，从而返回五个元素:分解尺度和小波函数逼近、重构尺度和小波函数逼近以及xgrid。

\[]:w = pywt.Wavelet('bior1.3')

w.orthogonal

\[]:(phi\_d, psi\_d, phi\_r, psi\_r, x) = w.wavefun(level=5)

您还可以在小波属性浏览器页面上找到wavefun()的使用实例和所有内置小波的图像。然而，这个网站不再积极维护，并没有包括每一个小波中出现的小波。小波系数在该位置的精度也低于小波系数。
