在python中无包实现Haar小波

在python中无包实现Haar小波,python,fft,wavelet,haar-wavelet,Python,Fft,Wavelet,Haar Wavelet,我正在尝试编写一个代码来实现离散小波变换(haar小波dwt),而不使用python中的包 到目前为止,我找到了一个链接,在那里他们实现了类似的东西,链接。它在运行时不会给出任何错误,但最终结果不正确。我运行的代码是: def离散haarwavelettransform(x): N=len(x) 输出=[0.0]*N 长度=N>>1 尽管如此: 对于范围内的i(0,长度): 总和=x[i*2]+x[i*2+1] 差=x[i*2]-x[i*2+1] 输出[i]=总和 输出[长度+i]=差值 如果长

我正在尝试编写一个代码来实现离散小波变换(haar小波dwt),而不使用python中的包

到目前为止,我找到了一个链接,在那里他们实现了类似的东西,链接。它在运行时不会给出任何错误,但最终结果不正确。我运行的代码是:

def离散haarwavelettransform(x):
N=len(x)
输出=[0.0]*N
长度=N>>1
尽管如此:
对于范围内的i(0,长度):
总和=x[i*2]+x[i*2+1]
差=x[i*2]-x[i*2+1]
输出[i]=总和
输出[长度+i]=差值
如果长度==1:
返回输出
#交换数组以进行下一次迭代
x=输出[:长度>=1
输入:

list=[56, 40, 8, 24, 48, 48, 40, 16]
电流输出:

[280, -24, 64, 40, 16, -16, 0, 24]
预期产出:

[35, -3, 16, 10, 8, -8, 0, 12]

有什么明显的东西我看不见吗?

类似这样的东西应该可以做到这一点——它几乎是对的直译。这可能意味着这不是非常Python-y代码,但如果你不使用
numpy
,无论如何也不是非常Python-y

没有得到预期输出的主要原因是过滤后忘记缩放输出。这使得下一级的系数大约是原来的两倍

请注意,½的缩放比例为预期输出,但½的缩放比例为√2更常用,用于在小波变换下保持信号的L2范数

def haarFWT ( signal, level ):

    s = .5;                  # scaling -- try 1 or ( .5 ** .5 )

    h = [ 1,  1 ];           # lowpass filter
    g = [ 1, -1 ];           # highpass filter        
    f = len ( h );           # length of the filter

    t = signal;              # 'workspace' array
    l = len ( t );           # length of the current signal
    y = [0] * l;             # initialise output

    t = t + [ 0, 0 ];        # padding for the workspace

    for i in range ( level ):

        y [ 0:l ] = [0] * l; # initialise the next level 
        l2 = l // 2;         # half approximation, half detail

        for j in range ( l2 ):            
            for k in range ( f ):                
                y [j]    += t [ 2*j + k ] * h [ k ] * s;
                y [j+l2] += t [ 2*j + k ] * g [ k ] * s;

        l = l2;              # continue with the approximation
        t [ 0:l ] = y [ 0:l ] ;

    return y

def main():
    s0 = [ 56, 40, 8, 24, 48, 48, 40, 16 ];

    print( "level 0" );
    print( s0 );

    print( "level 1" );
    print( haarFWT (s0, 1 ) );

    print( "level 2" );
    print( haarFWT (s0, 2 ) );

    print( "level 3" );
    print( haarFWT (s0, 3 ) );

if __name__ == "__main__":
    main()
# run with: >>> execfile ( "haarwavelet.py" )

看看下面的答案——这能解决你的问题吗?