CDF 9/7ウェーブレットを使用して、1Dリストで単一レベルの離散ウェーブレット変換を実行し、それを再構築する単純な自己完結型プログラムを作成しようとしています。畳み込み/フィルターバンク法を使用して、それがどのように機能するかを把握しています。言い換えると、リストをフィルターで畳み込み、スケール係数を取得し、リストを別のフィルターで畳み込み、ウェーブレット係数を取得しますが、これは他のすべての要素から開始するだけです。次に、アップサンプリング (つまり、要素間にゼロを追加) し、フィルタをウェーブレットに適用して係数をスケーリングし、それらを加算して、元のリストを取得します。
これを Haar ウェーブレット フィルターで機能させることはできますが、CDF 9/7 フィルターを使用しようとすると、同じ入力が生成されません。ただし、結果のリストと元のリストの合計は同じになります。
たたみ込みの非常にばかげたエラーだと確信していますが、それを理解することはできません。左端から開始するのではなく、インデックス「i」にフィルターを配置するなど、畳み込みの一連の順列を試しましたが、何も機能していないようです...おそらく、作成するバグの1つです私はそれを理解したときに頭を平手打ちします。
コードは次のとおりです。
import random
import math
length = 128
array = list()
row = list()
scaleCoefficients = list()
waveletCoefficients = list()
reconstruction = list()
def upsample(lst, index):
if (index % 2 == 0):
return 0.0
else:
return lst[index/2]
for i in range(length):
array.append(random.random())
## CDF 9/7 Wavelet (doesn't work?)
DWTAnalysisLowpass = [.026749, -.016864, -.078223, .266864, .602949, .266864, -.078223, -.016864, .026749]
for i in range(len(DWTAnalysisLowpass)):
DWTAnalysisLowpass[i] = math.sqrt(2.0) * DWTAnalysisLowpass[i]
DWTAnalysisHighpass = [0.0, .091272, -.057544, -0.591272, 1.115087, -.591272, -.057544, .091272, 0.0]
for i in range(len(DWTAnalysisHighpass)):
DWTAnalysisHighpass[i] = 1.0/math.sqrt(2.0) * DWTAnalysisHighpass[i]
DWTSynthesisLowpass = [0.0, -.091272, -.057544, 0.591272, 1.115087, .591272, -.057544, -.091272, 0.0]
for i in range(len(DWTSynthesisLowpass)):
DWTSynthesisLowpass[i] = 1.0/math.sqrt(2.0) * DWTSynthesisLowpass[i]
DWTSynthesisHighpass = [.026749, .016864, -.078223, -.266864, .602949, -.266864, -.078223, .016864, .026749]
for i in range(len(DWTSynthesisHighpass)):
DWTSynthesisHighpass[i] = math.sqrt(2.0) * DWTSynthesisHighpass[i]
## Haar Wavelet (Works)
## c = 1.0/math.sqrt(2)
## DWTAnalysisLowpass = [c,c]
## DWTAnalysisHighpass = [c, -c]
## DWTSynthesisLowpass = [c, c]
## DWTSynthesisHighpass = [-c, c]
## Do the forward transform - we only need to do it on half the elements
for i in range(0,length,2):
newVal = 0.0
## Convolve the next j elements
for j in range(len(DWTAnalysisLowpass)):
index = i + j
if(index >= length):
index = index - length
newVal = newVal + array[index]*DWTAnalysisLowpass[j]
scaleCoefficients.append(newVal)
newVal = 0.0
for j in range(len(DWTAnalysisHighpass)):
index = i + j
if(index >= length):
index = index - length
newVal = newVal + array[index]*DWTAnalysisHighpass[j]
waveletCoefficients.append(newVal)
## Do the inverse transform
for i in range(length):
newVal = 0.0
for j in range(len(DWTSynthesisHighpass)):
index = i + j
if(index >= length):
index = index - length
newVal = newVal + upsample(waveletCoefficients, index)*DWTSynthesisHighpass[j]
for j in range(len(DWTSynthesisLowpass)):
index = i + j
if(index >= length):
index = index - length
newVal = newVal + upsample(scaleCoefficients, index)*DWTSynthesisLowpass[j]
reconstruction.append(newVal)
print sum(reconstruction)
print sum(array)
print reconstruction
print array
ちなみに、ここの付録からフィルター値を取得しました:http://www1.cs.columbia.edu/~rso2102/AWR/Files/Overbeck2009AWR.pdf、しかし、私はそれらが一連のmatlabサンプルコードで次のように使用されているのを見てきました良い。