Il modo migliore per valutare la "qualità" dell'autocorrelazione?


9

Questo è un viaggio laterale dalla mia app russare .

Ho avuto una crepa nel produrre un'autocorrelazione del segnale audio, per vedere se "correla" con il russare / respirare molto bene. Ho un semplice algoritmo in corso (produce 1.0 come elemento zeroth, che è un buon segno), ma mi chiedo come valutare il risultato per determinare se l'autocorrelazione è forte e, forse, come usarlo per separare varie possibili fonti sonore.

Domanda n. 1: l'RMS dell'autocorrelazione (ignorando l'elemento zero) è una metrica di "qualità" buona come una qualsiasi, o c'è qualcosa di meglio?

Per elaborare: voglio semplicemente un modo numerico (vs "guardare" un grafico) per distinguere un segnale altamente autocorrelato da uno meno autocorrelato.

(Non so abbastanza per sapere quali altre domande porre.)

Alcuni risultati iniziali: in alcuni casi l'autocorrelazione (RMS o picco) mostra un salto drammatico su un russare - precisamente la risposta che mi piacerebbe vedere. In altri casi non c'è alcun movimento apparente in queste misure (e questo può essere due russamenti successivi con le due risposte), e in situazioni ad alto rumore le misurazioni in realtà si abbassano (leggermente) durante un russare.

Aggiornamento - 22 maggio: finalmente ho avuto del tempo per lavorarci ancora un po '. (Sono stato estratto su un'altra app che è letteralmente un dolore.) Ho inserito l'output dell'autocorrelazione in una FFT e l'output è piuttosto interessante: mostra un picco abbastanza drammatico vicino all'origine quando inizia un russare.

Quindi ora mi trovo di fronte al problema di quantizzare questo picco in qualche modo. Stranamente, i picchi più alti, in termini di magnitudine assoluta, si verificano altre volte, ma ho provato il rapporto tra picco e media aritmetica e che segue abbastanza bene. Quindi quali sono alcuni buoni modi per misurare il "picco" della FFT. (E per favore non dire che ho bisogno di prenderne una FFT - questa cosa è già vicina a ingoiare la sua coda. :))

Inoltre, mi è venuto in mente che la qualità della FFT potrebbe essere leggermente migliorata se rispecchiassi i risultati dell'autocorrelazione in ingresso, con zero (che è per definizione 1,0 magnitudo) nel mezzo. Ciò metterebbe le "code" su entrambe le estremità. È (forse) una buona idea? L'immagine speculare deve essere verticale o invertita? (Certo, lo proverò indipendentemente da quello che dici, ma ho pensato che forse avrei potuto avere qualche suggerimento sui dettagli.)

Provato piattezza--

I miei casi di test possono essere suddivisi approssimativamente nella categoria "ben educati" e nella categoria "bambini problematici".

Per i casi di test "ben educati", la planarità della FFT dell'autocorrelazione diminuisce drasticamente e il rapporto tra picco e autocorrelazione media sale durante un russare. Il rapporto tra questi due numeri (rapporto di picco diviso per planarità) è particolarmente sensibile, mostrando una salita di 5-10 volte durante un respiro / russare.

Per i "bambini problematici", tuttavia, i numeri vanno esattamente nella direzione opposta. Il rapporto picco / medio diminuisce leggermente mentre la planarità aumenta effettivamente del 50-100%

La differenza tra queste due categorie è (principalmente) triplice:

  1. I livelli di rumore sono (di solito) più alti nei "bambini problematici"
  2. I livelli audio sono (quasi sempre) più bassi nei "bambini problematici"
  3. Il "problema dei bambini" tende a consistere in più respiro e meno russamento effettivo (e devo rilevare entrambi)

Qualche idea?

Aggiornamento - 25/05/2012: è un po 'prematuro fare una danza della vittoria, ma quando ho riflettuto sull'autocorrelazione di un punto, ne ho preso la FFT e poi ho fatto la planarità spettrale, il mio schema di rapporto combinato ha mostrato un buon salto in diversi ambienti diversi. Riflettere l'autocorrelazione sembra migliorare la qualità della FFT.

Un punto minore, tuttavia, è che, poiché il "componente DC" del "segnale" riflesso è zero, il risultato FFT di zeroth è sempre zero, e questo tipo rompe una media geometrica che include zero. Ma saltare l'elemento zeroth sembra funzionare.

Il risultato che sto ottenendo è tutt'altro che sufficiente per identificare russamenti / respiri da solo, ma sembra essere una "conferma" abbastanza sensibile - se non ottengo il "salto", probabilmente non è un russare / respiro.

Non l'ho analizzato da vicino, ma sospetto che ciò che sta accadendo è che un suono sibilante si manifesta da qualche parte durante il respiro / russare e quel fischio è ciò che viene rilevato.


Per quanto riguarda la misura della "forza" della correlazione, ciò che devi fare è normalizzare i tuoi due segnali da correlare, prima di fare una correlazione. (Dopo la normalizzazione, la somma di ciascun segnale dovrebbe essere 1). Quindi il picco di correlazione esisterà sempre tra -1 e 1. Questa è la tua forza. Non sono sicuro del resto della tua domanda, forse puoi modificarlo un po '.
Spacey,

Ho a che fare con l'autocorrelazione, quindi i due segnali sono uguali e sono, per definizione, "normalizzati" l'uno rispetto all'altro. Per "forza" intendo quanta autocorrelazione c'è.
Daniel R Hicks,

Non capisco cosa vuoi, ma penso che vorresti misurare il valore massimo del picco di autocorrelazione, non il valore RMS di tutto.
endolito

@endolith Penso che potrebbe chiederti una misura di "picco" della tua funzione di autocorrelazione, per distinguere un segnale con un delta (autocorrelazione del rumore) da un segnale di molti picchi? (autocorrelazione del segnale con armoniche). Forse qui si può usare anche la misura della piattezza spettrale ...
Spacey,

Sembra che la piattezza spettrale sia ciò che vuole. Daniel: Vuoi determinare quanto è diverso il segnale dal rumore bianco?
Emre,

Risposte:


3

Preliminari

Questa dimostrazione è più semplice con il pacchetto MATLAB audioread , che consente di leggere / scrivere file MP3. In alternativa, è possibile convertire manualmente il file MP3 nell'esempio in WAV.

Custodia facile

Prima di esaminare il tuo file problematico, andiamo a SoundCloud e prendiamo un russare decente in modo da sapere cosa aspettarci quando il SNR è alto. Questo è un 52s stereo 44.1KHz MP3. Scaricalo in una cartella nel percorso di MATLAB.

Ora calcoliamo lo spettrogramma (ho scelto una finestra di Hann da 8192 campioni) e la planarità spettrale:

[snd1,fs1]=mp3read('snoring - brobar.mp3'); % use wavread if you converted manually
[s1,f,t,p1]=spectrogram(mean(snd1,2),hann(8192));
sf1=10*log10(geomean(p1)./mean(p1)); % spectral flatness
plot(linspace(0,length(snd1)/fs1,length(sf1)),sf1); axis tight

Planarità spettrale del russare di brobar

Gli enormi cali della piattezza spettrale (cioè, la deviazione dal rumore bianco) urlano "Io sto russando". Possiamo facilmente classificarlo osservando la deviazione dalla linea di base (mediana):

stem(linspace(0,length(snd1)/fs1,length(sf1)),median(sf1)-sf1>2*std(sf1)); axis tight

La piattezza spettrale classificata del russare di brobar

Abbiamo avuto più di due deviazioni standard di headroom. La variazione standard stessa, per riferimento, è 6.8487 .

Custodia rigida

Ora diamo un'occhiata al tuo file . È un file WAV di 10 minuti e 8 KHz. Poiché il livello è così basso, aiuta a comporre il segnale.

[snd,fs]=wavread('recordedFile20120408010300_first_ten_minutes');
cmp=compand(snd,255,1);
wavwrite(cmp,'companded'); % used for listening purposes
[s,f,t,p]=spectrogram(snd,hann(8192));
sf=10*log10(geomean(p)./mean(p));
plot(linspace(0,600,length(sf)),sf);

Planarità spettrale del file rumoroso

Vedi quelle belle immersioni che accompagnano ogni russare? Nemmeno io. Che ne dici delle belle cime? Non stanno russando, ma il suono del soggetto si muove. La deviazione standard è irrisoria di 0,9388

Conclusione

È necessario acquisire un segnale più pulito se si desidera fare affidamento sulla planarità spettrale! L'ho chiesto solo per sentire qualcosa. Se viene rilevato un SNR basso, spingere l'utente ad avvicinare il telefono o utilizzare un microfono come il telefono in dotazione con l'auricolare.

La buona notizia è che è possibile rilevare il russare anche nel caso problematico. Tuttavia, dal momento che questa domanda non era solo di rilevazione russare Mi fermo qui, e spiegare come fare a vostra altra domanda .


Ora hai la sensazione di cosa sono contro. Quel campione era di qualità "media" tra i campioni con cui devo lavorare - ce ne sono di molto peggio. E posso leggere quel campione abbastanza bene con i miei algoritmi esistenti.
Daniel R Hicks,

Quali algoritmi sono quelli?
Emre,

In breve: il suono viene eseguito attraverso FFT 8 volte al secondo, lo spettro viene suddiviso in 5 bande di frequenza, viene calcolata la differenza di potenza e spettrale per ciascuna banda, quindi i risultati vengono calcolati in modo da dare più peso alle bande che appaiono variare al giusto tasso.
Daniel R Hicks,

@Emre Sto seguendo i tuoi link, ho creato un account soundcloud, ma non riesco a vedere esattamente come hai scaricato quel russare. Non è presente alcun pulsante di download accanto o in nessun altro luogo.
Spacey,

@Mohammad: ho fornito un link per il download.
Emre,

1

L'autocorrelazione è direttamente correlata al DFT inverso della densità spettrale di potenza del segnale. In tal senso, qualsiasi informazione contenuta nel quadrato di grandezza del DFT è contenuta anche nella funzione di autocorrelazione.

Detto questo, tuttavia, l'unica cosa che l'autocorrelazione può dirti è la presenza di armoniche. (La distanza dal picco centrale a quello successivo più alto). Forse il russare la respirazione VS ha diverse armoniche fondamentali e, in tal caso, il "metodo di autocorrelazione" sarebbe certamente un buon punto di partenza in modo che le caratteristiche, (in questo caso le armoniche), possano essere estratte.

Pertanto, l'autocorrelazione del rumore bianco, sarà una funzione delta e non avrà alcun picco secondario (o qualsiasi altro picco per quella materia) al di fuori del suo picco centrale. Al contrario, se il segnale ha armoniche, la sua funzione di autocorrelazione conterrà picchi secondari e terziari, commisurati al presente armonico fondamentale. La distanza dal picco principale (centrale) al picco secondario il periodo della frequenza fondamentale.

MODIFICARE:

Penso che ciò che stai cercando sia una misura - un numero - che codifica quanto una funzione di autocorrelazione sia simile a un delta, VS una funzione di autocorrelazione sembra avere molti picchi. A tal fine, la misura della piattezza spettrale potrebbe essere applicabile o, in un caso più generale, la misurazione della media geometrica in media aritmetica.


Avevo l'impressione che l'autocorrelazione distinguesse meglio il segnale (ritmico) dal rumore (casuale) - il rumore si autocorrelerebbe vicino allo zero. Un DFT, OTOH, rappresenterà il rumore come rumore - uno spettro diffuso. Almeno questa è la "teoria" per come la capisco.
Daniel R Hicks

Si prega di vedere le mie modifiche.
Spacey,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.