INDIETRO
  Filtri digitali
AVANTI

Un filtro FIR

Per sperimentare l'effetto dei filtri FIR sui suoni, abbiamo scritto questo semplice programma fir.f90 ( e il suo analogo in C fir.c)

Per utlizzarlo occorre prima di tutto creare un file dati.fir in cui vanno inseriti i valori della successione h che caratterizza il filtro FIR.
Il programma legge da tale file il numero nfir di elementi non nulli di h e poi i loro valori (=firfiltro), e calcola la convoluzione di x con h.
Per non dover rileggere ogni volta i valori dei suoni da filtrare, questi sono salvati in due buffer organizzati come FIFO (=first in first out), uno per il canale destro e uno per il canale sinistro.

L'esempio fornito è un filtro che cancella la banda di frequenze tra 7018 e 17546Hz.

In matlab o octave è disponibile direttamente la convoluzione:

octave:1> h=load('-ascii','solo_dati.fir'); (legge i dati del filtro FIR)
octave:2> infile=fopen('in.cdr','r'); (legge il file da filtrare)
octave:3> a=fread(infile,[2,Inf],"int16","ieee-be");
octave:4> b(:,1)=conv(h,a(1,:))'; (filtraggio con la convoluzione)
octave:5> b(:,2)=conv(h,a(2,:))';
octave:6> save('-ascii','out.octave','b'); (scrive i numeri del suono filtrato)
octave:7> quit
steffe@wallis:$ ./matconv out.octave out.cdr (converte i numeri di formato)


Un altro esempio filtro-300-3000 passa la banda da 300 a 3000Hz.
Il modo più semplice e rudimentale per calcolare i coefficienti di un filtro FIR è quello di fare ricorso alla DFT: si decide a priori la lunghezza del filtro, si assegnano per le frequenze tra 0 e la frequenza di Nyquist i valori di risposta desiderati H, e si calcola la DFT di H ottenendo i valori della successione h.

Comunque i programmi standard per il calcolo lineare, come matlab o scilab o octave, oltre naturalmente a mathematica, offrono tutti delle routines per il calcolo in modo più o meno raffinato dei filtri FIR o anche IIR.
In particolare matlab ha un signal toolbox con moltissime routines già pronte.
octave invece richiede che si scarichino da qualche sito parecchie routine per avere delle funzionalità simili.

Questo è un esempio di sito che riporta moltissime routines utili per avere in octave funzionalità simili aparecchi toolbox di matlab.
Riportiamo qui il solo archivio degli script che riguardano la teoria dei segnali.
Si noti che le versioni di octave più vecchie potrebbero non funzionare.

Per esempio, utilizzando tali scripts,

octave:1>aa=fir1(300,[0.1, 0.4], 'stop', 'noscale');

crea i coefficienti aa di un filtro passa banda per le frequenze comprese tra 0.1 e 0.4 della frequenza di Nyquist, e il comando

octave:2>freqz(aa);

mostra il grafico della risposta in frequenza e in fase del filtro FIR di coefficienti aa.

Per fare un confronto, per vedere con octave il plot della risposta del filtro determinato da dati.fir che abbiamo visualizzato in precedenza con Maple, copiamo il file dati.fir in aa e togliamo la prima riga che contiene il numero dei termini (33); dopodichè possimao usare octave:

octave:3>load aa;

octave:4>freqz(aa);  


INDIETRO
Laboratorio Sperimentale di Matematica Computazionale - parte II
Sergio Steffè - AA 2015/2016 - PISA
AVANTI