创建 NxN Haar 矩阵

问题描述 投票:0回答:5

我找不到生成非标准化 NxN Haar 矩阵的定义。那么等式是什么?

参见:http://en.wikipedia.org/wiki/Haar_wavelet

谢谢克里斯

math image-processing signal-processing haar-wavelet
5个回答
4
投票

这是基于 recursive formula for the Haar matrix 的归一化和非归一化

Haar 矩阵
的算法:

摘自 W-H Steeb 等人的论文“离散小波和微扰理论”。这是Python中的实现

def haarMatrix(n, normalized=False):
    # Allow only size n of power 2
    n = 2**np.ceil(np.log2(n))
    if n > 2:
        h = haarMatrix(n / 2)
    else:
        return np.array([[1, 1], [1, -1]])

    # calculate upper haar part
    h_n = np.kron(h, [1, 1])
    # calculate lower haar part 
    if normalized:
        h_i = np.sqrt(n/2)*np.kron(np.eye(len(h)), [1, -1])
    else:
        h_i = np.kron(np.eye(len(h)), [1, -1])
    # combine parts
    h = np.vstack((h_n, h_i))
    return h

1
投票

这取决于您到底想要实现什么。 Haar 矩阵是 2x2 DCT 矩阵,因此反过来,您可以将 NxN DCT(II) 矩阵视为该块大小的 Haar 矩阵。

或者如果 N 是二元的,N=2^n,那么您可能会要求 Haar 变换的 n 阶段的变换矩阵。由于每个步骤中的采样率抽取,这可能是一个问题。


1
投票

谢谢大家。维基百科给出了“方程”:

我编写了一个递归解决方案,用于生成八度的非标准化 NxN Haar 矩阵。

function [h] = haar(n)
h = [1];
if n > 2
    h = haar(n/2);
endif
% calculate upper haar part
h_n = kron(h,[1,1]); 
% calculate lower haar part 
h_i = kron(eye(length(h)),[1,-1]);
% combine parts
h = [h_n; h_i];
endfunction

disp(haar(8));

0
投票
def HT(N):
    if N == 1: return np.array([[1]])
    return 1/np.sqrt(2)*np.concatenate(
        (
            np.kron(HT(N//2),[1,1])
        ,
            np.kron(np.identity(N//2),[1,-1])
        ),axis = 0
        )

我使用了维基百科中的方程,添加了归一化因子

1/sqrt(2)
。矩阵变为正交矩阵。有效果吗?


0
投票

Nikolai Janakiev 的答案很接近,但没有正确标准化——对于

n > 4
HH^T != 1
。我在下面强行进行了正确的标准化。

def haarMatrix(n, normalized=False):
    # Allow only size n of power 2
    l = np.log2(n)
    assert l.is_integer(), "Only powers for 2 are permitted."
    n = 2**np.ceil(l)
    if n > 2:
        h = haarMatrix(n // 2)
    else:
        return np.array([[1, 1], [1, -1]])

    # calculate upper haar part
    h_n = np.kron(h, [1, 1])
    # calculate lower haar part
    h_i = np.kron(np.eye(len(h)), [1, -1])
    # combine parts
    h = np.vstack((h_n, h_i))

    if normalized:
        h /= np.sqrt(np.linalg.norm(h, ord=1, axis=-1, keepdims=True))

    return h
© www.soinside.com 2019 - 2024. All rights reserved.