在数学中,哈尔小波是一系列重新缩放的“方形”函数,它们共同构成小波族或基。小波分析类似于傅立叶分析,因为它允许用正交基来表示间隔内的目标函数。哈尔序列现在被认为是第一个已知的小波基,并被广泛用作教学示例。哈尔小波也是最简单的小波。哈尔小波的技术缺点是它不连续,因此不可微分。然而,这一特性对于分析具有突然转变的信号(离散信号)来说却是一个优势,例如监控机器中的工具故障。

哈尔小波的母小波函数$\psi(t)$可以描述为

$$ \psi(t)= \begin{cases}1 & 0 \leq t<\frac{1}{2} \\ -1 & \frac{1}{2} \leq t<1 \\ 0 & \text { 否则 }\end{cases} $$

其尺度函数$\varphi(t)$可描述为

$$ \varphi(t)= \begin{cases}1 & 0 \leq t<1 \\ 0 & \text { 否则 }\end{cases} $$

与哈尔小波相关的 2×2 哈尔矩阵为

$$ H_2=\left[\begin{array}{cc} 1 & 1 \\ 1 & -1 \end{array}\right] $$

使用离散小波变换,可以将任意长度的偶数序列 $\left(a_0, a_1, \ldots, a_{2 n}, a_{2 n+1}\right)$ 变换为二元序列 -向量 $\left(\left(a_0, a_1\right),\left(a_2, a_3\right), \ldots,\left(a_{2 n}, a_{2 n+1}\right)\right)$ 。如果将每个向量与矩阵 $H_2$ 右乘,则得到结果 $\left(\left(s_0, d_0\right), \ldots,\left(s_n, d_n\right)\right)$ 为快速哈尔小波变换的阶段。通常,我们将序列 s 和 d 分开,然后继续转换序列 s。序列 s 通常被称为平均值部分,而 d 被称为细节部分。

如果一个序列的长度是四的倍数,则可以构建 4 个元素的块,并使用 4×4 哈尔矩阵以类似的方式对其进行变换

$$ H_4=\left[\begin{array}{cccc} 1 & 1 & 1 & 1 \\ 1 & 1 & -1 & -1 \\ 1 & -1 & 0 & 0 \\ 0 & 0 & 1 & -1 \end{array}\right] $$

它结合了快速哈尔小波变换的两个阶段。

一般来说,2N×2N 哈尔矩阵可以通过以下等式导出。

$$ H_{2 N}=\left[\begin{array}{c} H_N \otimes[1,1] \\ I_N \otimes[1,-1] \end{array}\right] $$

其中 $I_N=\left[\begin{array}{cccc}1 & 0 & \ldots & 0 \\ 0 & 1 & \ldots & 0 \\ \vdots & \vdots & \ddots & \vdots \\ 0 & 0 & \ldots & 1\end{array}\right]$ 和 $\otimes$ 是克罗内克积。

Python示例

哈尔小波的特点是简单和二元阶跃函数。其结构有利于图像和信号处理、数值分析,甚至数据压缩领域。其主要优势在于能够提供有关特定函数或数据集的局部频率信息。我们将使用 TensorFlow演示一维离散哈尔小波变换。

 pip install numpy
 pip install tensorflow
 def haar1d_layer(x):
     outputs = []
     len = x.shape[1]
 ​
     while len > 1:
         v_reshape = tf.reshape(x, [-1, len//2, 2])
         v_diff = v_reshape[:,:,1:2] - v_reshape[:,:,0:1]
         v_diff = tf.reshape(v_diff, [-1, len//2])
         outputs.append(v_diff)
         x = tf.reduce_mean(v_reshape, axis=2)
         len = len // 2
 ​
     outputs.append(x)
     return tf.concat(outputs, 1)
 ​
 def haar1d_inv_layer(x):
     idx = 1
     len = x.shape[1]
     while idx < len:
         v_avg = x[:, -idx:]
         v_avg = tf.reshape(v_avg, [-1, idx, 1])
         v_delta = x[:, (len - (idx << 1)):(len - idx)] / 2
         v_delta = tf.stack([-v_delta, v_delta], axis=2)
         v_out = v_avg + v_delta
         v_out = tf.reshape(v_out, [-1, idx*2])
         x = tf.concat([x[:, :-(idx << 1)], v_out], axis=1)
         idx = idx << 1
     return x

haar1d_layer() 函数对输入向量中的元素对进行迭代,计算每对元素的平均值和差异,并将它们写入 output_vectorhaar1d_inv_layer() 函数执行相反的操作,从 input_vector 中获取平均值和差异对,并计算原始值,然后将它们写入 output_vector。函数 stack() 用于将 TensorArray 转换为 Tensor。

使用上述函数