DOA estimator


Quello che descrivo in questo articolo è un progetto che ho sviluppato durante il corso di Sound Analysis, Synthesis And Processing al Politecnico di Milano.

L’intera classe di studenti è stata posta nel contesto seguente: un Uniform Linear Array (ULA) con 16 microfoni MEMS distribuiti su 45 cm registra una sorgente a 8 kHz, in movimento davanti all’array.

L’obiettivo è stata la localizzazione di una sorgente sonora (DOA, Direction of Arrival) realizzando un delay-and-sum beamformer adatto a sorgenti wide-band. Poiché il filtraggio spaziale è intrinsecamente narrow-band, l’elaborazione adottata separa lo spettro in bande di frequenza (tramite STFT) e procede frame per frame, così da seguire nel tempo il contenuto sonoro e ricostruirne l’angolo di arrivo con coerenza.


Il processo di implementazione

Lo sviluppo è bottom-up: si validano i blocchi fondamentali e solo dopo si integrano nel sistema.

Il diagramma d’uso delle classi e funzioni che riassume il flusso operativo è il seguente:

Diagramma principale

Descriverò di seguito tutti i moduli uno per uno, trattandoli in ordine di implementazione e test.

  • AudioData: è il punto d’ingresso dei dati. Esso carica l’audio multicanale da file, lo memorizza e lo normalizza.
  • CustomFFT: è una FFT ricorsiva per lunghezze potenza di due, basata su Cooley–Tukey. L’uscita viene confrontata con fft di MATLAB, per garantirne la correttezza numerica.

Test FFT

  • STFTProcessor: calcola la Short-Time Fourier Transform su un singolo canale. La funzione prende in ingresso il segnale, l’fs, le lunghezze di finestra, l’overlap e l’nfft. In uscita si ha: matrice STFT ‘S’ con gli assi di frequenza f e tempo t. La validazione avviene contro spectrogram di MATLAB.

Test STFT

  • AllChannelSTFT: per passare al multicanale, AllChannelSTFT applica lo stesso schema STFT a tutti i microfoni dell’array, trattando i canali in modo indipendente ma con parametri coerenti. I test controllano correttezza e allineamento degli output per ciascun canale.

Test AllChannelSTFT

  • GetCovMatrix: a partire dalle STFT multicanale, GetCovMatrix costruisce la matrice di covarianza spaziale banda per banda. La verifica relativa si basa sul provare la proprietà hermitiana della matrice.

  • GetSteeringVector: calcola il vettore di steering per una data angolazione e frequenza, tenendo conto della spaziatura d, della velocità del suono c e del numero di microfoni. In pratica, assegna a ciascun elemento dell’array la fase prevista rispetto al fronte d’onda.

  • Beamform: implementa il cuore del sistema: delay-and-sum. Per ogni banda e per ciascun frame, si combina la covarianza con i vettori di steering sull’intervallo angolare di interesse, generando una mappa di potenza vs angolo e tempo (p_theta_time). La qualità di questa mappa si riflette direttamente nelle stime finali.

  • DOAEstimator: legge p_theta_tim e restituisce le stime della direzione di arrivo (doa_estimates) individuando, frame per frame, gli angoli a massima energia.

Test DOAEstimator

Tutto ciò che è stato descritto viene orchestrato dalla classe Main, che carica e normalizza i dati (AudioData), calcola le STFT su tutti i canali (AllChannelSTFT), costruisce le matrici di covarianza (GetCovMatrix), applica il beamforming sull’intervallo di angoli (Beamform) ed estrae le stime di DOA (DOAEstimator).


Visualizzazione

Per interpretare i risultati ho implementato le classi visualizePseudospectrum, che mostra il pseudospectrum (potenza in funzione dell’angolo, nel tempo) e visualizeDOAEstimates, che traccia l’andamento delle stime angolari. Inoltre, le classi getSingleFrame, framesGenerator e videoGenerator creano una sequenza di frame e la compongono in un video, utile per una visione dell’evoluzione temporale.

Il risultato visivo è mostrato nelle figure qui sotto:

Pseudospectrum: evidenzia la distribuzione di potenza rispetto all’angolo di arrivo** (e al tempo). I picchi segnalano le direzioni predominanti, quindi le **possibili direzioni della sorgente.

Pseudospectrum

DOA nel tempo: le stime di DOA rivelano la traiettoria frame per frame della sorgente in movimento.

DOA over time

Sequenza di frecce

L’analisi ed i test confermano l’efficacia del beamforming implementato. Puoi trovare il codice su GItHub.


Angelo Antona, 28 Maggio 2024