在python中无包实现Haar小波
我正在尝试编写一个代码来实现离散小波变换(haar小波dwt),而不使用python中的包 到目前为止,我找到了一个链接,在那里他们实现了类似的东西,链接。它在运行时不会给出任何错误,但最终结果不正确。我运行的代码是:在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]=差值 如果长
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" )
看看下面的答案——这能解决你的问题吗?