![]() |
|
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);
![]() |
|