In che modo la dimensione della finestra, la frequenza di campionamento influenzano la stima del passo FFT?


8

Sto cercando di creare un programma di rilevamento del tono che estrae le frequenze dei picchi in uno spettro di potenza ottenuto da un FFT ( fftpack). Sto estraendo le frequenze di picco dal mio spettro usando il Primo Estimatore di Quinn per interpolare tra i numeri di bin. Questo schema sembra funzionare bene in determinate condizioni. Ad esempio, utilizzando una funzione di finestra rettangolare con una dimensione della finestra di 1024 e una frequenza di campionamento di 16000, il mio algoritmo identifica correttamente la frequenza di un tono A440 purocome 440.06 con una seconda frequenza parziale di 880.1. Tuttavia, in altre condizioni, produce risultati imprecisi. Se cambio la frequenza di campionamento (ad esempio a 8000) o la dimensione della finestra (ad esempio a 2048), identifica ancora correttamente il primo parziale come 440, ma il secondo parziale è da qualche parte intorno a 892. Il problema peggiora ancora per i toni inarmonici come quelli prodotto da una chitarra o un piano.

La mia domanda generale è: in che modo la frequenza di campionamento, la dimensione della finestra e la funzione della finestra influiscono sulla stima della frequenza dei picchi FFT? La mia ipotesi era che il semplice aumento della risoluzione dello spettro aumentasse l'accuratezza della stima della frequenza di picco, ma questa non è chiaramente la mia esperienza (anche il riempimento zero non aiuta). Sto anche assumendo che la scelta della funzione finestra non avrà molto effetto perché la dispersione spettrale non dovrebbe cambiare la posizione del picco (sebbene, ora che ci penso, la dispersione spettrale potrebbe potenzialmente influenzare la stima della frequenza interpolata se le dimensioni dei bin adiacenti a il picco viene aumentato artificialmente dalla perdita da altri picchi ...).

qualche idea?

Risposte:


8
  1. Usa una finestra gaussiana: la trasformata di Fourier di gaussiana è gaussiana
  2. Registra in scala lo spettro per enfatizzare i picchi e trasformare i picchi gaussiani in picchi parabolici
  3. Usa l'interpolazione parabolica per trovare i veri picchi.

Si noti che, come menzionato nel §D.1, la grandezza di trasformazione della finestra gaussiana è precisamente una parabola su una scala dB. Di conseguenza, l'interpolazione del picco spettrale quadratico è esatta sotto la finestra gaussiana. Naturalmente, in qualche modo dobbiamo rimuovere in qualche modo le code infinitamente lunghe della finestra gaussiana, ma ciò non causa molta deviazione da una parabola, come mostrato in Fig. 3.30.

https://ccrma.stanford.edu/~jos/sasp/Quadratic_Interpolation_Spectral_Peaks.html

inserisci qui la descrizione dell'immagine

Stimo 1000.000004 Hz per una forma d'onda a 1000 Hz in questo modo: https://gist.github.com/255291#file_parabolic.py

Se hai problemi, traccia lo spettro e usa i tuoi occhi per capire perché non funziona.


2
Grazie! Questo ha perfettamente senso. Il log di un gaussiano è una parabola, quindi l'interpolazione parabolica dei picchi in uno spettro di log con finestre gaussiane è quasi esatta. Dopo aver implementato questo, sto ottenendo stime coerenti della frequenza di picco FFT su diverse frequenze di campionamento e dimensioni delle finestre. Huzzah!
Willpett,

@ will.pett: Quindi forse il problema è stato causato dal "Primo Stimatore di Quinn" più che dalla FFT?
endolith

Non credo che il metodo di interpolazione fosse interamente da biasimare perché anche l'interpolazione quadratica mi ha dato cattivi risultati con determinate funzioni della finestra e frequenze di campionamento. Penso che sia stata la combinazione dei parametri di cui sopra ad essere importante. Non stavo usando la funzione di finestra corretta e non avevo trasformato il mio spettro nel registro. Scommetto che la cosa più importante è stata la trasformazione del log. Probabilmente protocollo standard di cui non ero a conoscenza.
Willpett,

@endolith, grazie, capito (le domande possono seguire)
denis

3

Innanzitutto, la stima della frequenza di picco e la stima dell'intonazione sono due cose diverse. Il passo è un fenomeno psico-acustico. Le persone possono sentire un tono anche con la frequenza fondamentale completamente mancante, o relativamente debole rispetto alla maggior parte degli altri picchi, come nelle note basse prodotte da alcuni strumenti.

In secondo luogo, l'uso di nessuna finestra su una FFT equivale all'utilizzo di una finestra rettangolare, che convoglia il tuo spettro con la funzione Sinc. La funzione Sinc ha molte gobbe diffuse lontano dal picco che si manifestano per tutte le frequenze che non sono esattamente periodiche nella lunghezza della FFT (noto anche come "dispersione spettrale"). Tutta questa dispersione di energia da una forte frequenza interferirà con la stima della posizione di altri picchi di frequenza. Quindi una funzione finestra più adatta (Hamming o von Hann) potrebbe aiutare a ridurre questa interferenza tra i picchi.

Un FFT più lungo ridurrà la frequenza delta tra i bin center, il che dovrebbe aumentare l'interpolazione e quindi l'accuratezza della stima della frequenza per gli spettri stazionari. Tuttavia, se la FFT è così lunga che lo spettro cambia all'interno della finestra della FFT, tutte quelle frequenze modificate verranno sfocate insieme in una FFT più lunga.


1

Hai sicuramente bisogno di una funzione finestra adatta - gli effetti della perdita spettrale variano significativamente a seconda di come sono correlati il ​​periodo di intonazione e la lunghezza della finestra FFT - se ottieni un grande transitorio tra l'ultimo e il primo campione della finestra FFT, questo produrrà molto cattiva sbavatura dello spettro, mentre se si è fortunati e questa discontinuità è piccola, lo spettro risultante sarà molto più pulito. Questo è probabilmente il motivo per cui stai riscontrando incoerenze quando modifichi uno qualsiasi dei tuoi parametri come la dimensione FFT. Con un'adeguata funzione finestra otterrai uno spettro coerente al variare del tono.


Ora ho provato diverse funzioni della finestra (Hamming, Blackman-Harris, Gauss, Weedon-Gauss) e tutte mi danno risultati incredibilmente imprecisi in qualsiasi frequenza di campionamento / condizioni della dimensione della finestra (ad esempio stimando la prima frequenza parziale a 460, 488 e altri). Solo una finestra rettangolare è stata in grado di identificare correttamente un picco a 440 Hz. È interessante notare che questo picco è in gran parte invariante con diverse combinazioni di frequenza di campionamento / dimensione della finestra in una finestra rettangolare, sebbene il secondo parziale sia ancora variabile. Come conciliare questi risultati con i tuoi consigli?

Come nota a margine, sto anche usando un algoritmo di autocorrelazione per confrontare con la FFT. Questo metodo (che è indipendente dalla funzione finestra) fornisce ~ 440,4 Hz per il tono di Wikipedia, mentre il metodo FFT fornisce quasi esattamente 440 senza una funzione finestra. Mi rendo conto che l'autocorrelazione non stima direttamente la prima frequenza parziale, ma piuttosto il "tono" psicoacustico, ma è comunque interessante confrontare. Dalla sperimentazione con i toni di piano, ho notato che il metodo di autocorrelazione sopravvaluta costantemente la prima frequenza parziale rispetto al metodo FFT.

1
È difficile indovinare quali potrebbero essere i problemi senza vedere il codice, ecc. Hai provato a tracciare lo spettro di potenza per vedere come appaiono effettivamente i picchi con / senza una funzione finestra? Questo non dovrebbe solo dirti se il tuo windowing / FFT / etc si sta comportando correttamente, ma potrebbe anche darti un'idea del perché il tuo algoritmo di stima del pitch sta dando i risultati che fa.
Paolo R,

È strano, perché le funzioni della finestra producono davvero spettri dall'aspetto più pulito, con poche sbavature. Tuttavia, le stime delle frequenze di picco non sono corrette. Quando uso le impostazioni che mi danno 440 Hz senza finestre, quindi passo a una finestra Hamming, ottengo 444,6 Hz. Con una finestra Blackman-Harris ottengo 460,9 Hz e con una finestra gaussiana ottengo 446,4 Hz. È possibile che i metodi di interpolazione di picco formulino ipotesi implicite sulla funzione della finestra che potrei violare?
Willpett,

Non ho molta familiarità con i metodi di interpolazione nell'articolo a cui ti colleghi: sembrano usare sia le informazioni di magnitudo che di fase piuttosto che solo la magnitudo, ma non avrei pensato che il windowing avrebbe un impatto significativo sulla fase.
Paolo R,
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.