最近工作需要,看了一下小波变换方面的东西,用python实现了一个简单的小波变换类,将来可以用在工作中。
简单说几句原理,小波变换类似于傅里叶变换,都是把函数用一组正交基函数展开,选取不同的基函数给出不同的变换。例如傅里叶变换,选择的是sin和cos,或者exp(ikx)这种复指数函数;而小波变换,选取基函数的方式更加灵活,可以根据要处理的数据的特点(比如某一段上信息量比较多),在不同尺度上采用不同的频宽来对已知信号进行分解,从而尽可能保留多一点信息,同时又避免了原始傅里叶变换的大计算量。以下计算采用的是haar基,它把函数分为2段(A1和B1,但第一次不分),对第一段内相邻的2个采样点进行变换(只考虑A1),变换矩阵为
sqrt(0.5) sqrt(0.5)
sqrt(0.5) -sqrt(0.5)
变换完之后,再把第一段(A1)分为两段,同样对相邻的点进行变换,直到无法再分。
下面直接上代码
Wavelet.py
import math
class wave:
def __init__(self):
M_SQRT1_2 = math.sqrt(0.5)
self.h1 = [M_SQRT1_2, M_SQRT1_2]
self.g1 = [M_SQRT1_2, -M_SQRT1_2]
self.h2 = [M_SQRT1_2, M_SQRT1_2]
self.g2 =