INDIETRO
  Filtri digitali
AVANTI

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:

Finestratura

L'analogo programma in C usa la libreria FFTW3, che fa parte delle principali distribuzioni Linux.
Ci possono essere piccole differenze nei files di Header (di solito /usr/include/fftw3.h, ma a volte rfftw.h dfftw.h etc etc ... a secondo delle opzioni nella compilazione della libreria).
La documentazione di solito è accessibile con il sistema delle info con comandi tipo
pinfo fftw3

Per compilare i programmi occorre linkarli con le librerie (che fanno parte dei pacchetti -devel e devono essere installate nel sistema); per esempio

cc filtro1.c -o filtro1 -lfftw3 -lm

I programmi qui disponibili sono:
crea_data_filter.c che prende in ingresso un filefilter.conf che descrive la risposta in frequenza desiderata e crea il file dei coefficienti moltiplicativi per la fft.
filtro1.c che fa il filtraggio con la fft un blocco alla volta senza preoccuparsi di raccordare i blocchi, e quindi presenta dei disturbi alle commissure dei blocchi, con frequenza 44100/(lunghezza dei blocchi della fft).
filtro2.c che fa anche il lavoro di raccordo lineare dei blocchi descritto sopra.  
INDIETRO
Laboratorio Sperimentale di Matematica Computazionale - parte II
Sergio Steffè - AA 2015/2016 - PISA
AVANTI