RELAZIONE DEL PROGETTO “DSP”

 

Di Piccirillo Michele (609882) e Maccari Fabio (609889)

 

LA TEORIA

L’applicazione da noi realizzata si avvale di un algoritmo FFT per l’analisi in frequenza di un segnale audio prelevato da un file Wav campionato a 44.1Khz con sample a 16 bit stereo PCM.

 

Un brano musicale, un discorso, un suono è presente nel mondo reale come onda di pressione rappresentabile attraverso un segnale analogico il cui grafico è una funzione sul tempo continuo e a volori continui di pressione.

Tuttavia l’elaboratore non puo’ rappresentare tutti i numeri reali in quanto richiederebbe una memoria infinita per gestire la mole di dati con precisione illimitata.

Pertanto, per poter gestire e conservare le informazioni audio in un elaboratore è necessario trasformare il segnale audio analogico in un segnale digitale.

Questa trasformazione implica 2 passaggi: il campionamento e la quantizzazione.

Il campionamento consiste nel discretizzare il tempo e pensare a tutto il segnale concentrato in picchi ad intervalli regolari la cui frequenza, nelle nostre ipotesi, è 44.1Khz.

Questa operazione porta pero’ ad una inevitabile perdita di informazione ma, sotto le ipotesi di avere un segnale a banda limitata e periodico, è possibile ricostruire il segnale originale campionando ad una frequenza doppia rispetto al limite di banda (teorema di Nyquist): nel caso della musica e del parlato questo limite di banda è circa 22.05Khz.

Dopo l’operazione di campionamento ho un segnale a tempo discreto ma a valori continui (pressione). Devo quindi fare un ulteriore passo per quantizzare il segnale e trasformarlo in un vero e proprio segnale digitale (tempo discreto, valori discreti).

Il formato CD, che permette di ascoltare musica a buon livello, usa per il campionamento valori a 16bit, pertanto noi utilizziamo lo stesso standard.

 

L’ANALISI IN FREQUENZA

Per realizzare il nostro progetto è stato necessario analizzare il segnale digitale dal punto di vista delle frequenze.

La nostra implementazione si avvale di un algoritmo FFT (Fast Fourier Trasform).

La funzione FFT prende in input un segnale digitale e restituisce i pesi delle rispettive armoniche che lo caratterizzano.

Nelle nostre ipotesi di progetto abbiamo una applicazione video che deve essere sincronizzata con la musica in ascolto.

Tale problematica ci ha spinto alla ricerca di diverse implementazioni. Non tutte si sono rivelate soddisfacenti o corrette; tuttavia siamo riusciti a trovare un buon compromesso per l’analisi di un segnale in frequenza in realtime che pur non essendo preciso al 100%, causa problemi legati allo scheduling del sistema operativo e alla mancanza di hardware dedicato, rappresenta comunque un risultato notevole dal punto di vista della percezione visivo-uditiva.

Abbiamo obbligato l’applicazione dsp ad aggiornarsi ogni 40 millisecondi (25fps: limite della percezione di movimento). In tal modo abbiamo realizzato una applicazione fluida e accessibile alla maggior parte degli attuali personal computer.

Ogni 40 msec la nostra applicazione considera 2048 campioni 16bit stereo del file audio, ne esegue la FFT al fine di permettere alla applicazione video di eseguire il suo compito.

La necessità di utilizzare 2048 campioni nasce dal fatto che in un secondo dovrei ascoltare 44'100 campioni audio quindi, da una semplice proporzione, in 40 msec (il tempo necessario all’applicazione “dsp” per aggiornarsi) “ascolto” 1760 campioni.

Tuttavia questo valore non è utilizzabile in quanto la FFT lavora con un numero di campioni che sia una potenza di 2. La potenza più vicina a 1760 per eccesso è infatti 2048.

La FFT è un algoritmo veloce che realizza la traformata di Fourier per la quale comunque esistono algoritmi più lenti che prendono in considerazione un numero arbitrario di campioni. Per le esigenze di real-time abbiamo preferito utilizzare la versione FFT anche al prezzo di utilizzare più campioni.

Con questa soluzione l’applicazione video gira al meglio della sua possibilità (dettate dalla potenza della macchine nel gestire la mole poligonale), mentre l’applicazione audio “dsp” gira a 25fps circa al fine di garantire la coerenza audio-visiva.

Su macchine poco performanti dal punto di vista grafico il risultato è comunque sincrono ma poco appezzabile.

Per garantire la sincronizzazione abbiamo utilizzato un set di primitive API di Windows al fine di interfacciarci direttamente con la scheda audio. Tra queste primitive è stata fondamentale una funzione che ci ha permesso di conoscere il numero del campione audio in ascolto in un preciso istante al fine di poterne analizzare i 2048 successivi che descrivono quello che sto ascoltando. In tal modo l’applicazione video reagirà in base all’audio in ascolto.

Oltre all’analisi in frequenza abbiamo realizzato un filtro digitale FIR ideale (non realizzabile con strumenti fisici) che separa le frequenze alte/medio/basse.

Utilizzando la potenza (l’area delle varie componenti in frequenza) delle rispettive bande gestiamo i colori dell’applicazione video e il movimento della telecamera nell’ambiente 3d al fine di avere una più fedele percezione visiva del brano in ascolto.

I filtri implementati sono passa-banda rettangolari che considerano i campioni da una certa frequenza ad un’altra.

Per motivi di velocità abbiamo preferito non applicare nessuna finestra al filtro realizzato.

Le frequenze di taglio di questi tre filtri sono modificabili dinamicamente agendo col mouse sulla finestra “dsp” ciccando e traslando col mouse fino alla frequenza desiderata.