Riscritta la classe wavelet. Che per altro prima non era scritta, quindi

Leonardo Robol [2010-03-10 18:07]
Riscritta la classe wavelet. Che per altro prima non era scritta, quindi
diciamo scritta la classe per la wavelet. E adattato il resto in modo
che funzioni come prima. In sintesi, funziona come prima, però è diverso.
Filename
Filtering/Filtering.py
Filtering/dwt
Slide/slide.tex
diff --git a/Filtering/Filtering.py b/Filtering/Filtering.py
index 652fca8..0f8eb67 100644
--- a/Filtering/Filtering.py
+++ b/Filtering/Filtering.py
@@ -48,11 +48,86 @@ def DownSample(samples):
     return array(samples[::2])

 def UpSample(samples):
-
+
     s = zeros(2 * len(samples))
     s[::2] = samples
     return array(s)

+class WaveletTransformedSignal():
+
+    def __init__(self):
+        """
+        Creates a new WaveletTransformedSignal to
+        store the samples from the filterbank
+        """
+        self.samples_number = None
+        self.low_samples = []
+        self.high_samples = []
+
+    def AddHighSamples(self, samples):
+        """
+        Add a new High Sample
+        """
+        if self.samples_number is None:
+            self.samples_number = len(samples)
+            self.high_samples.append(samples)
+        else:
+            if len(samples) != (self.samples_number / 2):
+                raise IndexError("High frequency samples do not have the expected length")
+            else:
+                self.high_samples.append (samples)
+                self.samples_number = len(samples)
+
+    def AddLowSamples(self, samples):
+        """
+        Add the Low samples
+        """
+        if self.samples_number != len(samples):
+            raise IndexError("Low frequency samples do not have the expected length")
+        else:
+            self.low_samples.append(samples)
+
+    def GetLowSamples(self):
+        """
+        Get the low frequency samples
+        """
+        try:
+            return self.low_samples.pop()
+        except:
+            return None
+
+    def GetLowSamplesLength(self):
+        """Get the length of the lowsample array"""
+        try:
+            return len(self.low_samples)
+        except:
+            return None
+
+    def GetNumSamples(self):
+        """Return samples num"""
+        return len(self.low_samples) + len(self.high_samples)
+
+    def GetSamplesMax(self):
+        """Get the maximum abs value of the lowsample and
+        high sample array"""
+        m = [0]
+        for low in self.low_samples:
+            m.append (max(abs(low)))
+        for high in self.high_samples:
+            m.append(max(abs(high)))
+        return max(m)
+
+    def GetHighSamples(self):
+        """
+        Get the high frequency samples
+        """
+
+        try:
+            ret = self.high_samples.pop ()
+            return ret
+        except:
+            return None
+

 class FilterBank():

@@ -158,17 +233,18 @@ class FilterBank():
         method.
         """

-        samplesArray = []
+        # samplesArray = []
+        samplesArray = WaveletTransformedSignal()
         low = self._Truncate(samples)

         # Do the real filtering and downsampling. Store the downsampled
         # details in the array.
         for recursion in xrange(0, self.depth):
-            samplesArray.append (DownSample (self.highPassFilter (low)))
+            samplesArray.AddHighSamples (DownSample (self.highPassFilter (low)))
             low = DownSample (self.lowPassFilter (low))

         # In the end append the low downsampled data to the array
-        samplesArray.append (low)
+        samplesArray.AddLowSamples (low)

         return samplesArray

@@ -178,12 +254,15 @@ class FilterBank():
         method.
         """

-        low = sampleArray.pop ()
+        low = sampleArray.GetLowSamples ()
+
+        counter = 0

-        # Iterate over the reversed array
-        for high in sampleArray[::-1]:
+        high = sampleArray.GetHighSamples ()
+        while(high != None):
             low = self.lowPassInverseFilter (UpSample (low))
             low += self.highPassInverseFilter (UpSample (high))
+            high = sampleArray.GetHighSamples ()

             # Facciamo shiftare l'array in modo che il delay dei sample
             # ricostruiti non disturbi la ricostruzione dei prossimi.
diff --git a/Filtering/dwt b/Filtering/dwt
index 0ae6b82..028fb1a 100755
--- a/Filtering/dwt
+++ b/Filtering/dwt
@@ -142,27 +142,36 @@ class DWT():
         """
         Shows the result of filtering
         """
-        scale = 1
-        singleOffset = 2 * max(abs(wavelets[-1]))
+        scale = pow(2, wavelets.GetNumSamples ())
+        singleOffset = 2 * wavelets.GetSamplesMax()
         offset = -3 * singleOffset
-        # We plot only the first 2000 samples, to avoid memory
+        # We plot only the first 1000000 samples, to avoid memory
         # being flooded with our data :)
         toPlot = 1000000
-        for samples in wavelets[0:-1]:
+
+        # Stampo i low
+        scale = int(0.5 * scale)
+        low = wavelets.GetLowSamples()
+        data = low[:toPlot / scale]
+        print len(low), len(data), scale
+        axes = range(0, len(data) * scale, scale)
+
+        plot(axes, data + offset)
+
+        offset += singleOffset
+
+        samples = wavelets.GetHighSamples ()
+        while samples is not None:

             data = samples[0:toPlot / scale]
             axes = range(0, len(data) * scale , scale)

             plot (axes, data + offset)
             offset += singleOffset
-            scale = 2*scale
-
-        # Stampo i low
-        scale = int(0.5 * scale)
-        data = wavelets[-1][:toPlot / scale]
-        axes = range(0, len(data) * scale, scale)
+            scale = int(0.5*scale)
+
+            samples = wavelets.GetHighSamples ()

-        plot(axes, data + offset)
         show ()


diff --git a/Slide/slide.tex b/Slide/slide.tex
index be2cd5a..307e5e5 100644
--- a/Slide/slide.tex
+++ b/Slide/slide.tex
@@ -224,10 +224,12 @@
 	\vskip 25pt

 	Consideriamo un segnale generico $x(n)$, e la sua trasformata di Fourier $X(\omega)$.
-	La trasformata di Fourier del segnale $y(n)$ ottenuto dopo l'applicazione del filtro
-	sarà il prodotto di $X(\omega)$ e di $H(\omega)$\footnote{che in effetti è la trasformata
-	di Fourier del filtro considerato come funzione da $\R$ in $\R$.}.
-
+	La trasformata di Fourier $Y(\omega)$ del segnale $y(n)$ ottenuto dopo l'applicazione del filtro
+	sarà
+	\[
+		Y(\omega) = X(\omega) H(\omega)
+	\]
+
 	\vskip 25pt

 	Il filtro \textbf{amplifica ogni frequenza del segnale} di un coefficiente $H(\omega)$.
ViewGit