【参考资料】
【1】《小波与傅里叶分析基础》
【2】http://www.pybytes.com/pywavelets/
一、内积空间
内积空间
定义(这里
Rn空间和
Cn空间是类似的): 一个在复矢量空间V上的内积是一个函数
<.,.>:V×V→C,它满足如下性质:
- 正性:
⟨v,v⟩>0,对于任意非零的
v∈V
- 共轭对称性:
⟨w,v⟩=⟨v,w⟩,对于所有的
v,w∈V
- 均匀性:
⟨cv,w⟩=c⟨v,w⟩,这里对于所有的
v,w∈V,
c∈C属于比例因子
- 加性:
⟨u+v,w⟩=⟨u,w⟩+⟨v,w⟩,这里对于所有的
u,v,w∈V
L2空间和
l2空间
定义: 对于
a≤t≤b,空间
L2([a,b])表示所有的平方可积函数所组成的空间,即:
L2([a,b])={f:[a,b]→C;∫ab∣f(t)∣2dt<∞}
定义:
l2空间是由所有序列
...,x−1,x0,x1,....,其中
xi∈C且
−∞∑+∞∣xn∣2<∞。该空间的内积定义为
−∞∑+∞xnynˉ
备注:对于信号系统而言,其物理意义表示为信号的能量有限
正交
设V是内积空间,则有下面三类正交
- V中的两个矢量X和Y,若
⟨X,Y⟩=0,则称X和Y正交
- 矢量集
ei,i=1,...,N称为正交,对于每一个
ei具有单位长度
∥ei∥=1,并且彼此正交,即
i̸=j时
ej与
ei正交
- 两个子空间
V1V2⊂V称为正交,是指
V1中的每个矢量同
V2中的每个矢量正交
正交基是指空间V的一个矢量基,它是正交的。
举例:
函数f(t)=sint和g(t)=cost在
L2([−π,π])上正交,因为:
⟨f,g⟩=−π∫πsin(t)cos(t)dt
=21−π∫πsin(2t)dt=0
正交投影
假设
V0是内积空间V的一个有限维子空间。对于任意
v∈V,v在
V0上的正交投影是唯一的矢量
v0∈V0,它最接近v。或者说
v−v0这个矢量与
V0正交。
备注:这个定理在二维平面上非常好理解,如下:
正交补定义: 设
V0是内积空间V的空间,
V0的正交补,记作
V0⊥,是V上所有与
V0正交的矢量的集合:
V0⊥={v∈V;⟨v,w⟩=0,w∈V0}
对于上面图中二维的例子,向量
v−v0就是
v0的正交补,而两者的直和就是v。详见定理如下:
设
V0是内积空间V的有限维子空间。对于每个矢量
v∈V,可以唯一地表示为
v=v0+v1,其中
v0∈V0而
v1∈V0⊥;即
V=V0⊕V0⊥
备注:这部分是小波分析在整个泛函知识领域里最重要的一点,是小波分析的基础!!
二、Haar小波分析
Haar尺度函数(父小波)
Haar尺度函数定义如下:
ϕ(x)={1,0,0≤x<1other
令
V0是
k∈Z∑akϕ(x−k)函数所组成的空间,则
V0所显示的函数图形如下:
同时我们有更细粒度的
V1是
k∈Z∑akϕ(2x−k)函数所组成的空间,以及更进一步的
Vj。
上述空间具备了包含关系
V0⊃V1⊃V2,...,Vj−1⊃Vj
同时由于:
-
∥ϕ(x−k)∥2=∫−∞+∞ϕ(x−k)2dx=1
-
⟨ϕ(x−j),ϕ(x−k)⟩=∫−∞+∞ϕ(x−k)ϕ(x−j)dx=0
(重要)可知
ϕ(x−k)是空间
V0的一组正交基,同理可知
2j/2ϕ(2jx−k)是
Vj的一组正交基
Haar小波函数(母小波)
Haar小波函数即其尺度函数的正交补。例如:
ψ(x)=ϕ(2x)−ϕ(2x−1),有
−∞∫+∞ϕ(x)ψ(x)dx=0
定理: 令
Wj是由形如
k∈Z∑akψ(2jx−k)ak∈R的函数所组成的空间。
Wj是
Vj的正交补,即
Vj+1=Vj⊕Wj
Haar小波的分解与重构
所谓的小波分解就是把
L2(R)分解成其子空间的直积和:
L2(R)=V0⊕W0⊕W1....。也就是说对于特别的
f∈L2(R)我们有
f=f0+j=0∑∞wj。
小波信号处理的流程如下:
第一步取样:对于连续信号y=f(t)取适当的J进行采样,令
akJ=f(k/2J),存在f(t)的一个近似
fJ(t)=k∈Z∑akJϕ(2Jx−k)
第二步分解:由上述知识可知
fJ=Wj−1+Wj−2+...+W0+f0,即
fJ(x)=j=0∑J−1wj+f0
=j=0∑J−1(∑k∈Zbljψ(2jx−k))+∑k∈Zak0ϕ(x−k)
第三步处理:修改小波系数
bkj进行信号处理,若处理高频滤波,则将大于某一阈值的
bkj置零;若是压缩数据,则将小于某一阈值的
bkj置零。
第四步重构:利用修改后的小波系数重构
三、程序实现(基于pyWavelet)
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from pywt import wavedec
df = pd.read_csv('./data/test.csv', sep=',')
data = df['std_value'].astype(float)
coeffs= wavedec(data, 'haar', level=2)
titles = ["original","cA2","cD2","cD1"]
cA2, cD2, cD1 = coeffs
fig = plt.figure(figsize=(14, 4))
for i, a in enumerate([data, cA2, cD2, cD1]):
ax = fig.add_subplot(1, 4, i + 1)
plt.plot(a,'r')
ax.set_title(titles[i], fontsize=12)
plt.show()