diff --git a/RefinementEquation/Iteration.py b/RefinementEquation/Iteration.py index c49c756..5053e10 100755 --- a/RefinementEquation/Iteration.py +++ b/RefinementEquation/Iteration.py @@ -14,8 +14,8 @@ print "ok" # Si comincia ad iterare h = numpy.array([0.125 , 0.25, 0.25, 0.25, 0.125]) h = Filtering.DaubechiesFilterBank.lowPassFilter.GetResponse() -h = Filtering.StrangFilterBank.lowPassFilter.GetResponse() -t = numpy.linspace(-0.05,len(h) + 0.05,1000) +# h = Filtering.StrangFilterBank.lowPassFilter.GetResponse() +t = numpy.linspace(-0.5,len(h) + 0.05,1000) def box(x): """box function""" @@ -52,7 +52,7 @@ try: # plot(t,phi) # draw () print "diff = %f" % diff - # time.sleep (0.25) + time.sleep (1) newphi = map(refinement, t) diff = numpy.linalg.norm(numpy.array(newphi) - numpy.array(phi)) phi = newphi diff --git a/Slide/slide.tex b/Slide/slide.tex index cfadbd3..ed392af 100644 --- a/Slide/slide.tex +++ b/Slide/slide.tex @@ -5,7 +5,7 @@ \usepackage[utf8x]{inputenc} \usepackage[italian]{babel} \usepackage{default} -\usepackage{iwona} +% \usepackage{iwona} \usepackage[T1]{fontenc} @@ -57,6 +57,7 @@ \theoremstyle{plain} \newtheorem{teo}{Teorema} \theoremstyle{remark} \newtheorem{de}{Definizione} \theoremstyle{remark} \newtheorem{os}{Osservazione} +\theoremstyle{remark} \newtheorem{problema}{Problema} % % Cominciamo a capire cosa ci interessa di un segnale e come lo vogliamo @@ -356,7 +357,7 @@ \vskip 25pt \item[Compressione] Vorremmo scomporre il segnale in piccole componenti più idonee ad - essere compresse (con dati simili fra loro); + essere compresse (ovvero che contengano dati omogenei); \end{description} \end{frame} @@ -364,71 +365,131 @@ \subsection{Un esempio significativo} \begin{frame} - \frametitle{Haar filterbank} - Consideriamo i seguenti filtri: - \[ - h_0 = (\frac{1}{2}, \frac{1}{2}) \qquad h_1 = (\frac 1 2 , - \frac{1}{2}) \qquad - f_0 = (\frac{1}{2}, \frac{1}{2}) \qquad f_1 = (-\frac 1 2 , \frac{1}{2}) - \] + \frametitle{} +% Consideriamo i seguenti filtri e filterbank: +% \[ +% h_0 = (\frac{1}{2}, \frac{1}{2}) \qquad h_1 = (\frac 1 2 , - \frac{1}{2}) \qquad +% f_0 = (\frac{1}{2}, \frac{1}{2}) \qquad f_1 = (-\frac 1 2 , \frac{1}{2}) +% \] - Chiamiamo \emph{Analysis filterbank} quella che suddivide un segnale $x(n)$ in - \[ - h_0 * x(n) = y_0(n) \qquad h_1 * x(n) = y_1(n) - \] - e \emph{Synthesis filterbank} quella che invece prende in input due segnali $y_0(n)$ e $y_1(n)$ - e restituisce un segnale $x(n)$ calcolato mediante - \[ - x(n) = f_0 * y_0(n) + f_1 * y_1(n) - \] - Prendiamo poi un segnale di esempio. Scegliamo un segnale finito $x(n) = \{e^{i\omega n}\}$. - Estenderemo poi questo caso particolare ad un segnale qualsiasi. + \begin{figure} + \begin{tikzpicture}[rounded corners=2pt, scale=0.5, thick, node distance=50pt] + \tikzstyle{title}=[rectangle,draw=blue!80,fill=white!20] + \tikzstyle{input}=[rectangle,draw=blue!80,fill=yellow!50] + \tikzstyle{output}=[rectangle,draw=blue!80,fill=blue!20] + + %% Disegnamo i pezzetti + \node [input] (inputsignal) [xshift=10mm] {$x(n)$}; + \node [input] (y0) [right of=inputsignal, yshift=10pt, xshift=10mm] {$y_0(n) = h_0 * x(n)$}; + \node [input] (y1) [right of=inputsignal, yshift=-10pt, xshift=10mm] {$y_1(n) = h_1 * x(n)$}; + + \node [output] (y0down) [right of=y0, xshift=15mm] {$\tilde{y_0}(n) = \downsample{2}y_0(n)$}; + \node [output] (y1down) [right of=y1, xshift=15mm] {$\tilde{y_1}(n) = \downsample{2}y_1(n)$}; + + %% .. e li colleghiamo + \draw[->] (inputsignal.east) -- (y0.west); + \draw[->] (inputsignal.east) -- (y1.west); + + \draw[->] (y0.east) -- (y0down.west); + \draw[->] (y1.east) -- (y1down.west); + + \end{tikzpicture} + \caption{Analysis filterbank} + \end{figure} + + + \begin{figure} + \begin{tikzpicture}[rounded corners=2pt, scale=0.5, thick, node distance=50pt] + \tikzstyle{title}=[rectangle,draw=blue!80,fill=white!20] + \tikzstyle{input}=[rectangle,draw=blue!80,fill=yellow!50] + \tikzstyle{output}=[rectangle,draw=blue!80,fill=blue!20] + + + %% Disegnamo i pezzetti + \node [input] (inputsignal0) [xshift=10mm, yshift=3.5mm] {$\tilde{y_0}(n)$}; + \node [input] (inputsignal1) [xshift=10mm, yshift=-3.5mm] {$\tilde{y_1}(n)$}; + + \node[input] (inputsignal0up) [right of=inputsignal0, xshift=5mm] {$z_0(n) = \upsample{2} \tilde{y_0}(n)$}; + \node[input] (inputsignal1up) [right of=inputsignal1, xshift=5mm] {$z_1(n) = \upsample{2} \tilde{y_1}(n)$}; + + \node [output] (xn) [right of=inputsignal0up, xshift=25mm, yshift=-3.5mm] {$x(n) = f_0*z_0(n) + f_1*z_1(n)$}; + + %% .. e li colleghiamo + \draw[->] (inputsignal0up.east) -- (xn.west); + \draw[->] (inputsignal1up.east) -- (xn.west); + \draw[->] (inputsignal0.east) -- (inputsignal0up.west); + \draw[->] (inputsignal1.east) -- (inputsignal1up.west); + + + \end{tikzpicture} + \caption{Synthesis filterbank} + \end{figure} + \begin{problema} + Trovare condizioni necessarie per ricostruire un segnale decomposto con l'analysis filterbank + tramite la synthesis filterbank. + \end{problema} \end{frame} -\begin{frame} \frametitle{Discrete Wavelet Transform} - Osserviamo cosa succede al segnale quando viene trasformato tramite la filterbank. +\begin{frame} \frametitle{Analysis filterbank} - Come abbiamo osservato prima otteniamo $\{e^{in\omega}\}$ è un autovalore per - questi filtri e quindi otteniamo due segnali + Analizziamo un segnale ad una frequenza fissata $\{e^{in\omega}\}$. + + \vskip 10pt + + $\{e^{in\omega}\}$ è un autovalore per + $h_0$ e $h_1$ e quindi dopo il primo passaggio dell'Analysis filterbank si ottiene \[ y_0(n) = H_0(\omega)e^{in\omega} \qquad y_1(n) = H_1(\omega)e^{in\omega} \] - \begin{os} - Con questo filtraggio abbiamo separato le alte frequenze dalla basse frequenze; ora però - ci sono \textbf{il doppio} dei samples di prima e quindi il segnale occupa - il doppio dello spazio. - \end{os} -\end{frame} + \vskip 15pt +% +% \begin{os} +% Con questo filtraggio abbiamo separato le alte frequenze dalla basse frequenze; ora però +% ci sono \textbf{il doppio} dei samples di prima e quindi il segnale occupa +% il doppio dello spazio. +% \end{os} + -\begin{frame} \frametitle{Liberarsi della ridondanza} Per liberarci dell'informazioni in eccesso ne scartiamo la metà effettuando un downsampling, ovvero ponendo \[ \tilde y_0(n) = \downsample{2} y_0(n) \qquad \tilde y_1(n) = \downsample{2} y_1(n) \] - Il problema dell'informazione in eccesso è stato sicuramente risolto, ma sarà possibile - recuperare il segnale originale? \\[15pt] - - Per fortuna la risposta è affermativa. Supponiamo ora di conoscere solamente i segnali - $\tilde y_0$ e $\tilde y_1$ ottenuti da questo processo, ovvero - \[ - \tilde{y_0}(n) = H_0(\omega)e^{2in\omega} \qquad \tilde{y_1}(n) = H_1(\omega)e^{2in\omega} - \] \end{frame} +% +%\begin{frame} \frametitle{Liberarsi della ridondanza} +% Il problema dell'informazione in eccesso è stato sicuramente risolto, ma sarà possibile +% recuperare il segnale originale? \\[15pt] +% +% Per fortuna la risposta è affermativa. Supponiamo ora di conoscere solamente i segnali +% $\tilde y_0$ e $\tilde y_1$ ottenuti da questo processo, ovvero +% \[ +% \tilde{y_0}(n) = H_0(\omega)e^{2in\omega} \qquad \tilde{y_1}(n) = H_1(\omega)e^{2in\omega} +% \] +%\end{frame} + \begin{frame} \frametitle{Il ritorno dell'aliasing} - Cominciamo con il cercare di invertire (per quanto possibile) il downsampling. - Poniamo quindi: + \begin{problema} Cosa succede ad un segnale $\{e^{in\omega}\}$ se effettuiamo un downsampling + seguito da un upsampling? + \end{problema} + \vskip 15pt + \uncover<2-> { + Osserviamo che per ogni $\omega$ vale la seguente uguaglianza \[ - z_0(n) = \upsample{2} \tilde y_0(n) \qquad z_1(n) = \upsample{2} \tilde y_1(n) + \upsample{2}\downsample{2} \{e^{in\omega}\} = \{\frac{1}{2} ( e^{in\omega} + e^{in(\omega+\pi)})\} \] - e osserviamo che per ogni $\omega$ vale questa uguaglianza + ovvero l'upsampling ci restituisce il segnale originale ``sporcato'' con dell'aliasing. + } + + \only<3-> { \[ - \upsample{2}\downsample{2} \{e^{in\omega}\} = \{\frac{1}{2} ( e^{in\omega} + e^{in(\omega+\pi)})\} + z_0(n) = \upsample{2}\downsample{2} h_0 * x(n) \qquad z_1(n) = \upsample{2}\downsample{2} h_1 * x(n) \] - ovvero l'upsampling ci restituisce il segnale originale ``sporcato'' con dell'aliasing. Come liberarsene? - + } + \end{frame} \begin{frame} \frametitle{La sintesi} @@ -448,7 +509,7 @@ \end{frame} \begin{frame} \frametitle{La sintesi} - Per recuperare il segnale iniziale farebbe comodo avere $r(n) = x(n)$ che è equivalente a + La condizione per riottenere il segnale originale è $r(n) = x(n)$ che è equivalente a \[ \left\{ \begin{array}{l} F_0(\omega)H_0(\omega) + F_1(\omega)H_1(\omega) = 1 \\ @@ -459,33 +520,28 @@ In realtà è sufficiente che la prima equazione valga $e^{-il\omega}$ per ogni $\omega$ e per qualche $l \in \N$. \\[5pt] - In questo modo avremmo che $r(n) = e^{-il\omega}x(n) = e^{i(n-l)\omega}$ è uguale a $x(n)$ + \vskip 10pt + + In questo modo avremmo che $r(n) = e^{-il\omega}x(n) = e^{i(n-l)\omega}$, cioè è $x(n)$ con un ritardo di $l$. \\[5pt] - Purtroppo questo è inevitabile, perché i filtri ``guardano solamente indietro'', e quindi introducono - un ritardo. \end{frame} \begin{frame} \frametitle{Il caso di Haar} Ricordando i filtri $h_0, h_1, f_0, f_1$ che avevamo scelto all'inizio, calcoliamo le relative - response function. + response function $H_0, H_1, F_0, F_1$. - \uncover<2-> { - Consideriamo un generico filtro $h$ - si ha - \[ - y(n) = \sum_{k=0}^{N} h(k)x(n-k) = \sum_{k=0}^{N} h(k)e^{i(n-k)\omega} = e^{in\omega}\underbrace{\sum_{k=0}^{N} h(k)e^{-ik\omega}}_{H_0(\omega)} - \] - } - \uncover<3> { - Applicando il procedimento ad $h_0, h_1, f_0, f_1$ si ottiene: + \vskip 10pt + + Ricordando la formula $H(\omega) = \sum_{k=0}^{N} h(k) e^{-ik\omega}$ si ottiene: + + \vskip 10pt \[ H_0(\omega) = \frac 1 2 ( 1 + e^{-i\omega} ) \qquad H_1(\omega) = \frac 1 2 (1 - e^{-i\omega}) \] \[ F_0(\omega) = 1 + e^{-i\omega} \qquad F_1(\omega) = -1 + e^{-i\omega} \] - } \end{frame} \begin{frame} \frametitle{Il caso di Haar} @@ -498,13 +554,16 @@ \right. \] La Filterbank di Haar ci permette quindi di decomporre e ricomporre esattamente un segnale - con un ritardo di $1$ sample. \\ + con un ritardo di $1$! \\[10pt] \uncover<2> { \begin{example} - Consideriamo il vettore $x = (6,4,5,2,3)$ ed applichiamoci i filtri $h_0$ e $h_1$: - \[ - h_0 * x = (3,5,4.5.3.5,2.5,1.5) \qquad h1 * x = (3,-1,0.5,-1.5,0.5,-1.5) - \] + Consideriamo il vettore $x = (6,4,5,2)$ ed applichiamoci i filtri $h_0$ e $h_1$: + \begin{eqnarray*} + y_0 = h_0 * x = (3,5,4.5.3.5,1) & y_1 = h_1 * x = (3,-1,0.5,-1.5,-1) \\ + \tilde{y_0} = \downsample{2}y_0 = (3,4.5,1) & \tilde{y_1} = \downsample{2}y_1 = (3,0.5,-1) \\ + z_0 = \upsample{2}\tilde{y_0} = (3,0,4.5,0,1,0) & z_1 = \upsample{2}\tilde{y_1} = (3,0,0.5,0,-1,0) \\ + \end{eqnarray*} + $$ f_0 * z_0 + f_1 * z_1 = (0,6,5,4,2,0,0) $$ \end{example} } @@ -581,13 +640,16 @@ \end{array} \right. \] - Se il metodo converge ad una funzione $\bar\Phi$ questa sarà forzatamente soluzione + Se il metodo converge ad una funzione $\bar\Phi$ questa sarà soluzione della refinement equation. } \end{frame} -\begin{frame} \frametitle{Condizioni di convergenza} - +\begin{frame} \frametitle{Condizioni per la convergenza} + \begin{problema} + Trovare condizione necessarie e sufficienti per la convergenza della successione $\Phi_k(t)$. + \end{problema} + \end{frame} \end{document}