PDA

View Full Version : Filtro IIR matlab


vpervendetta
13-02-2013, 19:21
Ciao, devo implementare un filtro su matlab e di preciso il filtro è un IIR, ho trovato una breve spiegazione su internet a riguardo che è questa:


Di seguito sono riportate le istruzioni utilizzate dal workspace di Matlab per filtrare il segnale di esempio:[b a]=butter(10,0.1,'low');freqz(b,a,100);segnale_filtrato=filtfilt(b,a,segnale);plot(segnale_filtrato,'r');La prima istruzione permette di ottenere i parametri a e b di un filtro modellizzato secondo Butterworth di ordine 10, frequenza di taglio normalizzata pari a 0.1 e di tipo passa-basso.
8

La seconda istruzione freqz permette di visualizzare la funzione di trasferimento del filtro, nell'immagine sottostante sono visualizzabili i grafici della fase e del modulo relativi al filtro di esempio:Con la terza istruzione avviene effettivamente l'operazione di filtraggio del segnale. Le ultime operazioni permettono di sovrappore e graficare il segnale prima e dopo il filtraggio sulla stessa figura.


Il mio problema è che non riesco a far funzionare il filtraggio, cioè la funzione segnale_filtrato=filtfilt(b,a,data), credo perche la mia matrice data è molto grande (19x77833) ma non ne sono sicuro, gli errori che mi da matlab sono:

??? Error using ==> filtfilt at 75
Data must have length more than 3 times filter order.

Error in ==> filtfilt at 57
y(:,i) = filtfilt(b,a,x(:,i));

Cosa può essere? Come posso risolvere il problema?

vpervendetta
14-02-2013, 11:47
A parte che, se stai facendo un esercizio per l'universita', mi sembra un po' un controsenso andare ad utilizzare le funzioni built-in di matlab per il filtraggio :mbe: , vorrei giusto puntualizzare che, magari, prima di cominciare ad usare degli strumenti gia' pronti o addentrarsi in temi di signal processing che sono fatti di matematica, e' bene studiare e documentarsi.

se vedi il manuale di filtfilt (help filtfilt) ti accorgi che non e' una funzione pensata per applicare semplicemente il filtro, ma e' un filtraggio a fase zero (sai cosa vuol dire?)

quello che serve a te e' la funzione filter( b,a,x ), che opera lungo la prima dimensione non-singleton del vettore, ovvero nel tuo caso hai 75mila diversi canali lunghi 19 campioni da filtrare, quindi devi specificare la dimensione lungo cui filtrare (sempre riferimento a help filter ).

Resta inteso che se e' un esercizio per l'uni, quello che ti viene richiesto e' implementare una qualsiasi delle forme canoniche per filtraggio, che il professore vi avra' mostrato a lezione.

ciao

Non è proprio un esercizio, è una tesi, solo che a me serve il filtro solo per poterlo inserire dentro una GUI, cioe il filtro non mi interessa che tipo di caratteristiche abbia, solo che si possa modificare da passa-alto a passa-basso e che si possa modificare l'ordine del filtro; la mia tesi è sulla GUI, non sul filtro, pero volevo chiederti cosa modificano i paramentri a e b, cioè ho visto che fanno parte della funzione H(z), ma non riesco a capire modificandoli cosa cambia, ho visto che cambia il filtraggio ma come?
Comunque non so cos'è un filtraggio a fase zero. E per quanto riguarda la teoria la sto saltando perche devo fare il piu in fretta possibile, devo consegnare la tesi entro il 20.

vpervendetta
14-02-2013, 11:51
In ogni caso sarei piu propenso ad utilizzare filtri con funzioni conosciute come l'IIR o di Butterworth sempre che si possa inserire un 19x75mila e che si possano selezionare PA o PB o PB ed eventualmente l'ordine del filtro o la freq. di campionamento

vpervendetta
14-02-2013, 13:12
L'unica tua scelta e' usare una funzione di trasferimento nota, calcolata da matlab, e filtrare con il comando filter(b,a,x), mettendo i canali da filtrare per colonne (cioe' la trasposta della matrice che stai cercando di filtrare tu). Se vuoi cambiare i parametri del filtro (Ripple, frequenza di taglio, ecc) lo devi fare sfruttando le funzioni di matlab e non cambiando a casaccio i coefficienti del polinomi. Resta inteso comunque che se usi un semplice butterworth come modello non hai molto su cui giocare, solamente la frequenza di taglio. aumentando il numero dei coefficienti, i.e. l'ordine del filtro, aumentera' la piattezza in banda, l'attenuazione di banda oscura e diminuira' l'ampiezza della banda di transizione.
:)

Dove trovo la funzione di trasferimento nota calcolata da matlab? Le funzioni di matlab da sfruttare per cambiare i parametri quali sono?
Potresti farmi un esempio di come dovrei fare?

vpervendetta
14-02-2013, 16:15
ok, grazie :)