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()的使用实例和所有内置小波的图像。然而,这个网站不再积极维护,并没有包括每一个小波中出现的小波。小波系数在该位置的精度也低于小波系数。

Last updated