Ich versuche, ein einfaches eigenständiges Programm zu schreiben, das eine diskrete Wavelet-Transformationsebene auf einer 1D-Liste mit den CDF 9/7-Wavelets durchführt und dann rekonstruiert. Ich verwende nur die Faltungs/Filterbank-Methode, um zu verstehen, wie es funktioniert. Mit anderen Worten, falte die Liste mit einem Filter, um die Skalarkoeffizienten zu erhalten, falte die Liste mit einem anderen Filter, um die Wavelet-Koeffizienten zu erhalten, aber mache dies nur, indem du mit jedem zweiten Element beginnst. Dann vergrößere sie (d.h. füge Nullen zwischen die Elemente ein), wende Filter auf die Wavelet- und Skalarkoeffizienten an, addiere sie zusammen und erhalte die originale Liste.
Ich kann dies für den Haar-Wavelet-Filter zum Laufen bringen, aber wenn ich den CDF 9/7 Filter verwende, produziert er nicht die gleiche Eingabe. Die resultierende Liste und die ursprüngliche Liste summieren sich jedoch zu dem gleichen Wert.
Ich bin sicher, dass es ein sehr dummer Fehler bei der Faltung ist, aber ich kann einfach nicht darauf kommen. Ich habe viele Permutationen der Faltung ausprobiert, wie das Zentrieren des Filters auf dem Index "i", anstatt den linken Rand davon zu starten, aber nichts scheint zu funktionieren... Es ist wahrscheinlich einer dieser Fehler, die mich auf die Stirn schlagen werden, wenn ich ihn herausfinde.
Hier ist der Code:
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 (funktioniert nicht?)
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 (funktioniert)
## c = 1.0/math.sqrt(2)
## DWTAnalysisLowpass = [c,c]
## DWTAnalysisHighpass = [c, -c]
## DWTSynthesisLowpass = [c, c]
## DWTSynthesisHighpass = [-c, c]
## Führe die Vorwärtstransformation durch - wir müssen dies nur für die Hälfte der Elemente tun
for i in range(0,length,2):
newVal = 0.0
## Faltung der nächsten j-Elemente
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)
## Führe die inverse Transformation durch
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
Übrigens habe ich die Filterwerte aus dem Anhang hier genommen: http://www1.cs.columbia.edu/~rso2102/AWR/Files/Overbeck2009AWR.pdf, aber ich habe sie auch in einer Menge Matlab-Beispielscode verwendet.