欢迎光临散文网 会员登陆 & 注册

小波变换[1] -- 认识与 Haar 小波

2021-12-20 12:54 作者:nyasyamorina  | 我要投稿

~~ 懒得放封面了, 将就着看吧 ~~    

在我的十万年前更新的专栏s [专栏集入口] 里讨论过一种简单的频率分析和滤波的方法 -- 傅里叶变换(FT),  这是把连续信号变为频率和相位的一种...变换,  在频域可以方便地对信号进行滤波和压缩 [专栏],  但是FT无法很好地得出某一个频率开始的时间,  为此提出了窗口傅里叶变换(WFT),  或者又可以叫短时傅里叶变换(STFT) [专栏],  但WFT也有很大的缺陷:  1) 分析 n 维数据会产生 2n 维的(频率-时间)关系图;  2) 窗函数无法调整大小,  意味着对于持续时间短的冲击和持续时间长的大波,  WTF并不能很好地分析出来.

为了解决上述问题,  提出了小波变换 (wavelet transform, WT).  小波(wavelet)的意思是快速收敛的波,  傅里叶变换里使用的核函数因为不收敛所以叫做大波.  小波变换的特征是:  分析信号的波函数的大小会随着频率变化而变化,  也就说当频率高时小波会变得窄小,  频率低时小波会变得宽广,  如此带来了非常高的动态范围.  并且对 n 维数据进行小波变换仅会产生 n 维的频率图.**

**: 其实产生的频率相应经过重新排列之后才能组成 n 维的频率图,  这个是另外的内容了.

使用函数空间(function space)描述小波变换里一层一层的频率关系会非常方便,  所以有必要来简单叙述一下函数空间.

简述函数空间

" - 什么是空间?  - 空间是点的集合."

假如有一系列函数 f_1%2C%5C%2Cf_2%2C%5C%2C%5Ccdots%2C%5C%2Cf_n,  那么由这些函数进行线性组合 %5Csum_%7Bk%3D1%7D%5Ena_kf_k 为这些函数张成的函数空间上的一个点,  其中 aₖ 为常数.  那么函数空间为这些函数所有可能的线性组合所组成的集合,  其中 fₖ 为这个函数空间的基函数.

如果定义了空间里的内积,  那么称这个空间为内积空间.  定义两函数 f, g 的内积 %5Clangle%20f%2Cg%5Crangle%3A%3D%5Cint_Rf(x)%5Coverline%7Bg(x)%7Ddx.  当一个函数 f 满足 %7C%7Cf%7C%7C%5E2%3D%5Clangle%20f%2Cf%5Crangle%3D1,  则称这个函数为归一的 (或标准的).  当两函数 f, g 满足 %5Clangle%20f%2Cg%5Crangle%3D0 则称这两个函数互相正交.  这些概念与一般的向量空间的类似的. 一般来说内积括号写为圆括号也是可以的,  即 (f%2Cg).  两函数 f, g 的相对误差定义为 %7C%7Cf-g%7C%7C%2F%7C%7Cf%7C%7C.

如果一个函数 f 不属于函数空间 V,  那么存在唯一的函数 v₀ ∈ V 使得 %7C%7Cf-v0%7C%7C%3D%5Cmin_%7Bv%5Cin%20V%7D%7C%7Cf-v%7C%7C,  并称 v₀ 是 f 在 V 上的投影.  设 V 的基函数 e₁, ..., eₙ 为归一正交的,  那么 f 在 V 上的投影 v₀ 由 v_0%3D%5Csum_%7Bk%3D1%7D%5Ena_ke_k%2C%5C%2Ca_k%3D%5Clangle%20f%2Ce_k%5Crangle 给出,  这是容易证明的 [略].

假设函数空间 V₀ 是函数空间 V 的子空间,  即 V₀ ⊂ V,  那么在 V 里所有与 V₀ 正交的元素的集合被称为 V₀ 的正交补,  即 V_0%5E%5Cperp%3A%3D%5Cleft%5C%7Bv%5Cin%20V%3B%5C%3B%5Clangle%20v%2Cv_0%5Crangle%3D0%2C%5C%2Cv_0%5Cin%20V_0%5Cright%5C%7D. 不难知道 V 里的任意函数都可以分解为 V₀ 的函数与 V₀ 的正交补的函数,  即 v%3Dv_0%2Bv_1%2C%5C%2Cv%5Cin%20V%3B%5C%3Bv_0%5Cin%20V_0%3B%5C%3Bv_1%5Cin%20V_0%5E%5Cperp,  记这种关系为 V%3DV_0%5Coplus%20V_0%5E%5Cperp.


小波变换里有两个很重要的函数:  尺度函数小波函数,  小波函数负责对信号的分解和重构,  尺度函数负责构建小波函数与对信号的近似.

Haar 小波变换作为小波变换里最简单的例子,  可以很好地建立起对小波变换的感觉


Haar 小波变换 -- 尺度函数和小波函数

Haar 尺度函数定义为 %5CPhi(x)%3D%5Cleft%5C%7B%5Cbegin%7Bmatrix%7D1%2C%5C%2Cx%5Cin%5B0%2C1)%5C%5C0%2C%5C%2Celse%5Cend%7Bmatrix%7D%5Cright.,  不难知道 Φ(x-k); k∈Z 是互相正交的,  也就是说这些函数可以张成一个函数空间 V₀.  那么 V₀ 里的函数为 %5Csum_%7Bk%5Cin%5Cmathbb%7BZ%7D%7Da_k%5CPhi(x-k)%5Cin%20V_0,  因为 Haar 尺度函数不是连续的,  所以 V₀ 里的函数也可能是不连续的,  准确来说当 a_%7Bk-1%7D%5Cneq%20a_k 时,  函数在 x = k 处不连续.  由尺度函数的定义不难看出,  由 Φ(x-k) 组成的变换的分辨率为 1.

Haar 尺度函数

考虑函数集 {Φ(2x-k); k∈Z},  与上面类似,  这个函数集里的函数也可以张成一个函数空间 V₁,  那么 V₁ 里的函数为 %5Csum_%7Bk%5Cin%5Cmathbb%7BZ%7D%7Db_k%5CPhi(2x-k)%5Cin%20V_1,  并且间断点为 x = k/2,  分辨率为 0.5.  特殊地,  当满足 b₂ₖ = b₂ₖ₊₁ 时,  可以得到 %5Csum_%7Bk%5Cin%5Cmathbb%7BZ%7D%7Db_%7B2k%7D%5CPhi(2x-2k)%2Bb_%7B2k%2B1%7D%5CPhi(2x-2k-1)%3D%5Csum_%7Bk%5Cin%5Cmathbb%7BZ%7D%7Db_%7B2k%7D%5CPhi(x-k)%5Cin%20V_0,  也就是说 V₀ 是 V₁ 的子空间.

类似地,  可以提出分辨率为 0.25, 0.125, ... 的变换.  以下给出一般的定义;  设 j 是一个整数,  那么由正交函数 %5CPhi(2%5Ejx-k)%3B%5C%3Bk%5Cin%5Cmathbb%7BZ%7D 张成函数空间 V_j,  其间断点为 x%3D2%5E%7B-j%7Dk,  分辨率为 2%5E%7B-j%7D.  并且有以下关系:  %5Ccdots%5Csubset%20V_%7B-1%7D%5Csubset%20V_0%5Csubset%20V_1%5Csubset%5Ccdots.

为了把信号分解为频率信息,  需要在信号里找到属于 Vⱼ 但不属于 Vⱼ₋₁ 的信息,  于是引出小波函数 ϕ 把 Vⱼ 分解为 Vⱼ₋₁ 和他的正交补 Wⱼ₋₁.  因为 W₀ 是 V₁ 的子空间,  所以小波函数为 %5Cphi(x)%3D%5Csum_%7Bk%5Cin%5Cmathbb%7BZ%7D%7Da_k%5CPhi(2x-k);  又因为 W₀ 是 V₀ 的正交补,  所以有 %5Cforall%20k'%5Cin%5Cmathbb%7BZ%7D%3A%5C%3A%5Clangle%5Cphi(x)%2C%5CPhi(x-k')%5Crangle%3D0.  满足这两点的最简单的小波函数为 %5Cphi(x)%3D%5CPhi(2x)-%5CPhi(2x-1).  那么 Wⱼ 是由函数 %5Cphi(2%5Ejx-k)%3B%5C%3Bk%5Cin%5Cmathbb%7BZ%7D 张成的空间,  并且有 V_%7Bj%2B1%7D%3DV_%7Bj%7D%5Coplus%20W_j.

Haar 小波函数


Haar小波变换 -- 分解和重构

1) 信号近似:  对于任意一个信号函数 f 都不太可能刚好属于函数空间 Vⱼ,  因此需要对 f 进行近似,  也就是采样.  刚刚简述函数空间里就已经得到了 f 投影到 Vⱼ 的方法:  f_j(x)%3D%5Csum_%7Bk%5Cin%5Cmathbb%7BZ%7D%7Da_k%5E%7B(j)%7D%5CPhi(2%5Ejx-k)%3B%5C%3Ba_k%5E%7B(j)%7D%3D%5Cint_%7B2%5E%7B-j%7Dk%7D%5E%7B2%5E%7B-j%7D(k%2B1)%7Df(x)dx,  对于积分一般来说都是不好求的,  所以可以近似地取 a_k%5E%7B(j)%7D%5Capprox%20f(2%5E%7B-j%7D(k%2B0.5)).

2) 分解:  采样得到的信号从 Vⱼ 分解到 Vⱼ₋₁ 与 Wⱼ₋₁ 里,  由尺度函数和小波函数不难得出以下关系式:  %5Csum_%7Bk%5Cin%5Cmathbb%7BZ%7D%7Da_k%5E%7B(j-1)%7D%5CPhi(2%5E%7Bj-1%7Dx-k)%5Cin%20V_%7Bj-1%7D%3B%5C%3Ba_%7Bk%7D%5E%7B(j-1)%7D%3D%5Cfrac%7Ba_%7B2k%7D%5E%7B(j)%7D%2Ba_%7B2k%2B1%7D%5E%7B(j)%7D%7D%7B2%7D 和 %5Csum_%7Bk%5Cin%5Cmathbb%7BZ%7D%7Db_%7Bk%7D%5E%7B(j-1)%7D%5Cphi(2%5E%7Bj-1%7Dx-k)%5Cin%20W_%7Bj-1%7D%3B%5C%3Bb_%7Bk%7D%5E%7B(j-1)%7D%3D%5Cfrac%7Ba_%7B2k%7D%5E%7B(j)%7D-a_%7B2k%2B1%7D%5E%7B(j)%7D%7D%7B2%7D.  不断迭代这个式子,  可以得到足够粗糙的原信号近似 a 和频率分量 b.

3) 自定义操作:  噪声过滤,  信号压缩什么的跟 FT 里面的没太大区别.

4) 重构:  即是第二步分解的逆操作,  由系数递推式 a_%7B2k%7D%5E%7B(j%2B1)%7D%3Da_%7Bk%7D%5E%7B(j)%7D%2Bb_%7Bk%7D%5E%7B(j)%7D 和 a_%7B2k%2B1%7D%5E%7B(j%2B1)%7D%3Da_%7Bk%7D%5E%7B(j)%7D-b_%7Bk%7D%5E%7B(j)%7D 给出.


例子

以一个函数作例子: 

可以看得这个信号上有两处不自然的尖峰,  这里使用 Haar 小波变换消除这个尖峰.  为了使用 Haar 小波,  首先需要使用尺度函数对信号进行近似,  在这里例子里使用函数空间 V₈ 就只够好了,  下面为近似结果

可以看得这个尖峰的宽度约为 1/16,  根据 Haar 小波的特性,  这意味着需要把分辨率高于 1/16 的信号全部抹掉,  以下为这个结果

可以看得结果变得非常稀烂,  但是起码尖峰没了.  结果这么稀烂的因为 Haar 小波不连续导致的,  后续会介绍其他更好的小波,  Haar 仅作为最简例子介绍.

Haar 小波变换也可以用作信号压缩,  把信号完全分解后,  设定压缩率,  则把绝对值较少的那些分量变为 0,  然后进行重构,  以下是压缩率为 80% 和 90% 的两个示例

计算两者分别于原信号的相对误差,  压缩率 80% 时相对误差为 0.124,  压缩率 90% 时为 0.220,  可以看得表现还是可以的.

样本程序: https://github.com/nyasyamorina/trash-bin/blob/main/wavelet%20-%20Haar.jl


摸了


日常推瑟图群:  274767696

小波变换[1] -- 认识与 Haar 小波的评论 (共 条)

分享到微博请遵守国家法律