小波变换[4] -- 计算问题
函数近似
在第二篇专栏里提到过多分辨率框架下信号的分解和重构, 可以看到这两个步骤都只与尺度系数 {pₖ} 有关, 而于尺度函数和小波函数的具体形式无关. 但是在特定场合, 比如说可视化或者误差评估的时候, 则需要用到尺度函数的形状了, 下面介绍两种逐渐收敛得到尺度函数的方法.
第一种 是由迭代式 给出. 不断应用这个迭代式, 可以有
, 由尺度函数的标准正交性可以知道
, 由定义得
. 结合两式:
, 使用 l-2ⁿk 代替 l, 交换 k 和 l 的累加顺序后, 得到
, 亦即
. 如果选取 Φ₀ 为 Haar, 可以有
.

第二种 是由尺度关系式 推导二进制点的值得出. 因为 N 阶 D-小波的支撑集在 (0,2N-1) 里, 所以仅在整数 x = 1, ..., 2N-2 上有可能不为零. 记整数点上 Φ 的值为向量形式
, 那么尺度关系式可以看作矩阵作用在向量上, 稍加推导可以得出相应的矩阵为
, 亦即尺度关系式变为 P̂v = v. 由此可以解得 P̂ 特征值为 1 的特征向量 [实际上可以证得 P̂ 特征值为 1 的特征向量存在且只有一个, 但是不太会线代就摸了], 并且因为 D-小波满足
, 所以也满足
[证明在下方 * ], 即求得 v 的值. 假设已经知道了二进制点 x=2⁻ⁿk; k∈Z 的值, 那么可以通过尺度关系式
求得下一级二进制点的值.

有了尺度函数之后就可以使用 求出小波函数. 用二进制点表示, 并使用 1-k 替换 k 得到
, 这个方法对于两种函数近似都是通用的.


有限采样点
当采样点为有限时, 则有可能不能进行足够的分解步骤, 这时候就需要对采样点进行延拓. 常用的延拓方法有4种, 下面介绍一下, 假设采样点的索引是从 0 到 n.
零延拓 就是简单地把在采样点外的数据当作 0, 即 . 适用于信号端点处无关紧要或者信号本身就是有始有终的.

周期延拓 就是把信号当作周期刚好是采样区间那么长的信号, 即 .

线性延拓 把信号断点处的两个采样点当作线性插值的两个样本, 向外面扩展, 即 . 适用于在端点处信噪比比较高的信号.

对称延拓 就是在采样点端点处放一个镜子, 让采样点对称地扩展到外面. 对称延拓有两个不同的实现, 一个是把镜子放在整数点处, 另一个是把镜子放在半整数点处, 用式子写起来怪麻烦的, 可以看看我的源码.



数列索引
可以注意到, 在前3篇专栏里出现的累加绝大部分都是 , 因为计算机不能实现储存无限数据, 所以所有数列都应该是有限的 [除非有推导式].
这里出现的大部分累加都可以归纳为形式 , 其中 a, b 是已知的数列, c 是需要求出的数列, α, β 是相关的索引函数, 并且索引函数都是线性的. 使用 a⁻¹(l) 替换 l, 并重新记 β(k,a⁻¹(l)) 为 β(k,l), 得到
, 需要注意的是, 如果前者里 α(l) 里 l 的系数绝对值大于 1, 那么后者 l 的累加范围不再是整数, 而是二倍点, 三倍点之类的.
为了方便, 记 α₀ 为数列 a 里值不为零的最小索引, α₁ 为值不为零的最大索引, 类似地, 数列 b 有 β₀, β₁. 又因为假设了索引函数是线性的, 所以重新表达为 . 由 b 的索引 uk+vl+w 可以推导出数列 c 里值不为零的最小最大索引 [本来这里想贴代码, 可是通用的实在太长了]. 求得了数列 c 的索引范围后就可以先申请内存再计算数值了. 实际上, b 的索引可以进一步限制 l 的累加范围. 下面给出
在 julia 里的实现作为例子


*: 命题 成立的证明:

这一篇专栏摸了很久了. D-小波的尺度系数还没开始算, 如果存在通用推导式的话, 就专门出一个专栏吧, 不存在的话下一篇就是小波变换的应用了.
项目的 gayhub page: github.com/nyasyamorina/trash-bin/blob/main/wavlet%20-%20funcs.jl
日常推瑟图群: 274767696
封面pid: 88405884