小波变换[1] -- 认识与 Haar 小波
~~ 懒得放封面了, 将就着看吧 ~~
在我的十万年前更新的专栏s [专栏集入口] 里讨论过一种简单的频率分析和滤波的方法 -- 傅里叶变换(FT), 这是把连续信号变为频率和相位的一种...变换, 在频域可以方便地对信号进行滤波和压缩 [专栏], 但是FT无法很好地得出某一个频率开始的时间, 为此提出了窗口傅里叶变换(WFT), 或者又可以叫短时傅里叶变换(STFT) [专栏], 但WFT也有很大的缺陷: 1) 分析 n 维数据会产生 2n 维的(频率-时间)关系图; 2) 窗函数无法调整大小, 意味着对于持续时间短的冲击和持续时间长的大波, WTF并不能很好地分析出来.
为了解决上述问题, 提出了小波变换 (wavelet transform, WT). 小波(wavelet)的意思是快速收敛的波, 傅里叶变换里使用的核函数因为不收敛所以叫做大波. 小波变换的特征是: 分析信号的波函数的大小会随着频率变化而变化, 也就说当频率高时小波会变得窄小, 频率低时小波会变得宽广, 如此带来了非常高的动态范围. 并且对 n 维数据进行小波变换仅会产生 n 维的频率图.**
**: 其实产生的频率相应经过重新排列之后才能组成 n 维的频率图, 这个是另外的内容了.
使用函数空间(function space)描述小波变换里一层一层的频率关系会非常方便, 所以有必要来简单叙述一下函数空间.

简述函数空间
" - 什么是空间? - 空间是点的集合."
假如有一系列函数 , 那么由这些函数进行线性组合
为这些函数张成的函数空间上的一个点, 其中 aₖ 为常数. 那么函数空间为这些函数所有可能的线性组合所组成的集合, 其中 fₖ 为这个函数空间的基函数.
如果定义了空间里的内积, 那么称这个空间为内积空间. 定义两函数 f, g 的内积 . 当一个函数 f 满足
, 则称这个函数为归一的 (或标准的). 当两函数 f, g 满足
则称这两个函数互相正交. 这些概念与一般的向量空间的类似的. 一般来说内积括号写为圆括号也是可以的, 即
. 两函数 f, g 的相对误差定义为
.
如果一个函数 f 不属于函数空间 V, 那么存在唯一的函数 v₀ ∈ V 使得 , 并称 v₀ 是 f 在 V 上的投影. 设 V 的基函数 e₁, ..., eₙ 为归一正交的, 那么 f 在 V 上的投影 v₀ 由
给出, 这是容易证明的 [略].
假设函数空间 V₀ 是函数空间 V 的子空间, 即 V₀ ⊂ V, 那么在 V 里所有与 V₀ 正交的元素的集合被称为 V₀ 的正交补, 即 . 不难知道 V 里的任意函数都可以分解为 V₀ 的函数与 V₀ 的正交补的函数, 即
, 记这种关系为
.

小波变换里有两个很重要的函数: 尺度函数 和 小波函数, 小波函数负责对信号的分解和重构, 尺度函数负责构建小波函数与对信号的近似.
Haar 小波变换作为小波变换里最简单的例子, 可以很好地建立起对小波变换的感觉
Haar 小波变换 -- 尺度函数和小波函数
Haar 尺度函数定义为 , 不难知道 Φ(x-k); k∈Z 是互相正交的, 也就是说这些函数可以张成一个函数空间 V₀. 那么 V₀ 里的函数为
, 因为 Haar 尺度函数不是连续的, 所以 V₀ 里的函数也可能是不连续的, 准确来说当
时, 函数在 x = k 处不连续. 由尺度函数的定义不难看出, 由 Φ(x-k) 组成的变换的分辨率为 1.

考虑函数集 {Φ(2x-k); k∈Z}, 与上面类似, 这个函数集里的函数也可以张成一个函数空间 V₁, 那么 V₁ 里的函数为 , 并且间断点为 x = k/2, 分辨率为 0.5. 特殊地, 当满足 b₂ₖ = b₂ₖ₊₁ 时, 可以得到
, 也就是说 V₀ 是 V₁ 的子空间.
类似地, 可以提出分辨率为 0.25, 0.125, ... 的变换. 以下给出一般的定义; 设 是一个整数, 那么由正交函数
张成函数空间
, 其间断点为
, 分辨率为
. 并且有以下关系:
.
为了把信号分解为频率信息, 需要在信号里找到属于 Vⱼ 但不属于 Vⱼ₋₁ 的信息, 于是引出小波函数 ϕ 把 Vⱼ 分解为 Vⱼ₋₁ 和他的正交补 Wⱼ₋₁. 因为 W₀ 是 V₁ 的子空间, 所以小波函数为 ; 又因为 W₀ 是 V₀ 的正交补, 所以有
. 满足这两点的最简单的小波函数为
. 那么 Wⱼ 是由函数
张成的空间, 并且有
.

Haar小波变换 -- 分解和重构
1) 信号近似: 对于任意一个信号函数 f 都不太可能刚好属于函数空间 Vⱼ, 因此需要对 f 进行近似, 也就是采样. 刚刚简述函数空间里就已经得到了 f 投影到 Vⱼ 的方法: , 对于积分一般来说都是不好求的, 所以可以近似地取
.
2) 分解: 采样得到的信号从 Vⱼ 分解到 Vⱼ₋₁ 与 Wⱼ₋₁ 里, 由尺度函数和小波函数不难得出以下关系式: 和
. 不断迭代这个式子, 可以得到足够粗糙的原信号近似 a 和频率分量 b.
3) 自定义操作: 噪声过滤, 信号压缩什么的跟 FT 里面的没太大区别.
4) 重构: 即是第二步分解的逆操作, 由系数递推式 和
给出.

例子
以一个函数作例子:

可以看得这个信号上有两处不自然的尖峰, 这里使用 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