![]() |
|
Filtraggio con la FFT
E' anche possibile usare direttamente la Trasformata di Fourier Discreta per
ottenere il filtraggio dei segnali.
C'è da tenere presente che la Trasformata di Fourier Discreta opera su
segnali periodici. Per segnali non periodici, occorre prendere delle precauzioni
affinche' la "testa" del segnale non interferisca con la sua "coda", e affinchè
non si formino discontinuità tra un blocco di dati e il successivo.
Ci si riferisce col termine finestratura (inglese: windowing) a questo
tipo di precauzioni: essenzialmente occorre sfumare il segnale in testa e in
coda, eventualmente aggiungendo degli zeri di guardia.
Sono state proposte decine di diverse funzioni per ottenere questa sfumatura.
Nel programma filtro.f90 è implementato
un rudimentale filtro che usa la FFT. Viene usata la libreria (public domain) dfftpack.
Nota per la compilazione: prima va scaricata la libreria
dfftpack. Il comando
tar xzvf dfft.tgz estrae la directory dfftpack con dentro i relativi files.
Poi va eventualmente cambiata la riga nel file Makefile in cui è definito il
compilatore fortran. Il comando make crea la libreria libdfftpack.a .
Per compilare il filtro usare il comando
f95 filtro.f90 libdfftpack.a -o filtro
Il programma legge dal file dati.filtro la
forma della risposta del filtro che si vuole ottenere.
l formato di questo file è molto semplice: il primo numero intero indica quante
sono le coppie di numeri reali che seguono; ciascuna coppia di numeri rappresenta
una frequenza tra 0 e 22050 (frequenza di Nyquist) e un fattore di smorzamento compreso
tra 0.0 e 1.0.
La prima frequenza è 0.0 e l'ultima 22050.0.
Come si vede, il filtro proposto in esempio è un drastico passa-alto che fa
passare solo le frequenze sopra i 7000Hz.
Il programma prende il file in ingresso, lo taglia a blocchetti di 16384 campioni,
sfuma lineramente il primo e l'ultimo quarto di ciascun blocchetto e li inserisce
in buffer da 32768 campioni che viene passato alla routine della FFT, moltiplicato
per gli opportuni fattori come richiesto dal filtro, sottoposto alla trasformata
inversa ed infine ricombinato per formare il segnale in uscita:
![]() |
|