Pagina 1 di 1

Filter function in Matlab

MessaggioInviato: 13 dic 2013, 19:04
da Gia1988
Ciao a tutti,
volevo chiedervi alcune delucidazioni sul comando filter in Matlab.
Dall'help ho capito che diciamo che mi implementa l'equazione alle differenze finite...ma come posso risolvere questo esercizio:

Indicare esattamente i valori assunti dal segnale w motivando analiticamente la risposta.

Codice: Seleziona tutto
N=20;
y=zeros(1,N);
y(1)=1;
for n=2:N
y(n)= 0.5^(n-1) - 0.25^(n-2);
end
      
b=[1 -3/4 1/8];
a=[1 -5/4 1/2];
w=filter(b,a,y);

Re: Filter function in Matlab

MessaggioInviato: 14 dic 2013, 12:36
da simo85
Ciao Foto UtenteGia1988,

Se hai dubbi sulla funzione filter ti consiglio la lettura del capitolo Matlab Analysis of the Simplest Lowpass Filter del libro INTRODUCTION TO DIGITAL FILTERS WITH AUDIO APPLICATIONS di Julius O. Smith III, che puoi leggere online QUI (vedi anche le sotto sezioni! ;-) ) .

Ciao!

Re: Filter function in Matlab

MessaggioInviato: 14 dic 2013, 18:32
da Gia1988
Grazie mille per il consiglio..
Quindi il mio segnale filtrato w sarà della forma:
w(n) - \frac{5}{4}w(n-1) + \frac{1}{2}w(n-2)=y(n)-\frac{3}{4}y(n-1) + \frac{1}{8}y(n-2)

ma per indicare esattamente i valori di w come faccio??
non credo devo calcolarmi i 18 elementi di y e quindi poi di w!!
non c'è un metodo più furbo?

che poi con matlab si vede subito che alla fine w e il vettore 1 0 0 0 ..... 0

Re: Filter function in Matlab

MessaggioInviato: 17 dic 2013, 16:08
da dimaios
Esercizio interessante.
Infatti la simulazione indica che il risultato finale risulta essere \delta(n) per cui ti devi chiedere che relazione c'e' tra il processo che genera i dati y(n) ed il filtro G(z) descritto dai coefficienti espressi in a e b.
Fondamentalmente la domanda a cui rispondere si riferisce al caso in cui l'uscita di un sistema discreto a fronte di un ingresso discreto risulta essere l'impulso unitario discreto.

Re: Filter function in Matlab

MessaggioInviato: 17 dic 2013, 17:56
da Gia1988
quindi..il procedimento è:

noti i coefficienti a e b ricavo la funzione di trasferimento del filtro
G(z)= \frac{\sum_{r=0}^{2}b_{r}z^{-r}}{\sum_{k=0}^{2}a_{k}z^{-k}}

ricavo Y(z) da
y(n)=\sum_{n=2}^{20}0.5^{(n-19)} - 0.25^{(n-2)}
con y(1)=1
e poi trovo W(z)=Y(z)G(z) e quindi w(n)

sbaglio in qualcosa?

Re: Filter function in Matlab

MessaggioInviato: 17 dic 2013, 20:33
da dimaios
Come primo tentativo dovresti provare ad esprimere il processo di generazione dei dati y(n) in modo ricorsivo.

Re: Filter function in Matlab

MessaggioInviato: 18 dic 2013, 1:35
da Gia1988
E in che modo posso scrivere y(n)?

Re: Filter function in Matlab

MessaggioInviato: 19 dic 2013, 10:46
da dimaios
Foto UtenteGia1988 non ho purtroppo molto tempo a disposizione per cui ti faccio vedere una possibilita' risolutiva e poi pensi ad eventuali alternative.

La funzione di trasferimento nel dominio discreto del tuo sistema risulta essere :

G(z) = \frac{ z^2 - 0.75 z + 0.125 }{z^2 - 1.25 z + 0.5}

In Matlab la trovi con lo script :

Codice: Seleziona tutto
b=[1 -3/4 1/8];
a=[1 -5/4 1/2];
Gz = tf( b , a , 1 )


Indaghiamo sul meccanismo di generazione dei dati di ingresso y(n).





Come vedi e' definito dal campione n=1 e non dal campione n=0.

In particolare hai definito :

y(n) = 1 per n = 1

e poi :
y(n)= 0.5^{n-1} - 0.25^{n-2} per n \ge 2


Scriviamo il segnale in forma compatta come :

y(n)=  \delta(n-1) +  \left [ 0.5^{n-1} - 0.25^{n-2}  \right ] \cdot 1(n-2)

Questo segnale risulta diverso da zero solo per n \ge 1.

A questo punto facciamo la Z-Trasformata di y(n)

N.B. L'ho fatto fare a Worlfram Alpha ma tu devi svilupparti i calcoli a mano altrimenti non hai la percezione di quanto tempo ci voglia in una condizione reale sotto esame.

z-Transform.png
z-Transform.png (20.6 KiB) Osservato 6238 volte


Y(z) = \frac{8z^2 - 10 z + 4}{8 z^3 - 6z^2 + z}

Che si puo' anche scrivere :

Y(z) = z^{-1} \frac{z^2 - 1.25 z + 0.5}{z^2 - 0.75 z + 0.125}

A questo punto filtriamo il segnale y(n) facendolo passare attraverso il filtro G(z).




Abbiamo che :

W(z) = G(z) \cdot Y(z)

Che risulta essere :


W(z) = \frac{ z^2 - 0.75 z + 0.125 }{z^2 - 1.25 z + 0.5} \cdot z^{-1} \frac{z^2 - 1.25 z + 0.5}{z^2 - 0.75 z + 0.125} = z^{-1}


Da cui si ha :

w(n) = \delta(n-1)

Ovvero un impulso discreto centrato nel punto n=1.

Il ritardo di un passo dipende dal fatto che il segnale y(n) inizia da n=1 e non da n=0.

Nella realta' questo e' un problema legato al fatto che Matlab accetta gli indici dei vettori a partire da 1 e non da 0 per cui il segnale e' stato definito a partire da 1.

Il meccanismo di generazione dei dati di y(n) contiene l'inverso della funzione di trasferimento del filtro per cui si elidono ( cancellazione brutale ..... ).

In pratica applichi un filtro ed il suo inverso ottenendo l'impulso discreto.

Lascio a te sviluppare i calcoli effettuati dal Wolfram Alpha ed alcune considerazioni sulla posizione dei poli e degli zeri della funzione di trasferimento G(z).


L'esercizio e' interessante perche' il meccanismo di generazione dei dati di y(n) e' di fatto un filtro lineare IIR anche se non esplicitamente visibile dalla scrittura iniziale.

Il fatto che la convoluzione con il filtro G(z) desse in uscita un'impulso lasciava presagire che la dinamica di y(n) fosse frequenzialmente l' "inverso" di G(z).