Suggerimenti per migliorare il rilevamento del tono


21

Sto lavorando a una semplice app Web che consente all'utente di accordare la sua chitarra. Sono un vero principiante nell'elaborazione del segnale, quindi non giudicare troppo se la mia domanda non è appropriata.

Quindi, sono riuscito a ottenere la frequenza fondamentale usando un algoritmo FFT e a questo punto l'applicazione è in qualche modo funzionale. Tuttavia, c'è spazio per miglioramenti, in questo momento invio raw pcm all'algoritmo FFT, ma stavo pensando che forse ci sono alcuni algoritmi / filtri pre / post che potrebbero migliorare il rilevamento. Puoi suggerire qualcuno?

Il mio problema principale è che quando rileva una certa frequenza mostra quella frequenza per 1-2 secondi e poi passa ad altre frequenze casuali e ritorna di nuovo e così via, anche se il suono è continuo.

Sono anche interessato a qualsiasi altro tipo di ottimizzazione se si ha esperienza con tali cose.

Risposte:


20

Immagino che le altre frequenze che ottiene siano armoniche del fondamentale? Come se stessi suonando a 100 Hz e invece scegli 200 Hz o 300 Hz? Innanzitutto, dovresti limitare il tuo spazio di ricerca alle frequenze che una chitarra è probabile. Trova il massimo fondamentale di cui probabilmente avrai bisogno e limitati a questo.

L'autocorrelazione funzionerà meglio della FFT nel trovare il fondamentale, se il fondamentale è di ampiezza inferiore rispetto alle armoniche (o manca del tutto, ma questo non è un problema con la chitarra):

inserisci qui la descrizione dell'immagine

Puoi anche provare a ponderare le frequenze più basse per enfatizzare le fondamentali e minimizzare le armoniche, oppure utilizzare un algoritmo di picco-picking come questo e quindi scegliere solo la frequenza più bassa.

Inoltre, dovresti inviare il segnale prima di applicare la FFT. Basta semplicemente moltiplicarlo per una funzione di finestra , che assottiglia l'inizio e la fine della forma d'onda per rendere più pulito lo spettro delle frequenze. Quindi si ottengono picchi alti e stretti per i componenti di frequenza anziché quelli larghi.

È inoltre possibile utilizzare l'interpolazione per ottenere un picco più preciso. Prendi il registro dello spettro, quindi adatta una parabola al picco e ai due punti vicini e trova il vero picco della parabola. Tuttavia, potresti non aver bisogno di tanta precisione.

Ecco il mio codice Python di esempio per tutto questo .


Questo è quello che stavo cercando, ottima risposta, grazie!
Valentin Radu,

2
Moltiplicare per una funzione di finestra che è rastremata in realtà diffonderà eventuali linee spettrali nel segnale, rendendole così più ampie. Ciò che può comprarti, tuttavia, è la gamma dinamica, che consente di identificare, ad esempio, una linea spettrale a bassissima potenza in presenza di un tono interferente ad alta potenza.
Jason R,

@JasonR dato che questo è progettato per funzionare in un ambiente in cui la probabilità di un tono (i) di interferenza ad alta potenza è davvero bassa, suggerisci che è meglio non usare una finestra di Hamming?
Valentin Radu,

1
Posso confermare che l'uso di una finestra di Hamming mi ha avvicinato al mio obiettivo di mantenere costanti le letture. In questo momento, quando suono un A4 ottengo 440 Hz per la maggior parte del tempo e solo molto raramente ottengo una lettura simile a 650 Hz o giù di lì. Immagino che siano armoniche? Inoltre, non potevo fare a meno di notare che per una frequenza più elevata l'app funziona perfettamente e che per una frequenza inferiore inizia a fallire. Probabilmente perché sto usando FTT per rilevare il bin di frequenza di magnitudo di picco e per le frequenze più basse non è sempre fondamentale?
Valentin Radu,

1
@mindnoise: 660 Hz non è un'armonica di 440 Hz, ma è un'armonica di 220 Hz, o un quinto perfetto sopra 440. Potrebbe esserci un'altra stringa che risuona o distorsione o qualcosa del genere? È molto più facile capire problemi come questo se puoi tracciare la FFT e guardarla. Sì, le basse frequenze potrebbero essere filtrate e ridotte rispetto a quelle più alte, sia per effetti meccanici che per i circuiti analogici.
endolith

12

Il passo non è lo stesso del bin di frequenza di magnitudine di picco di un FFT. Pitch è un fenomeno psico-acustico umano. Il suono del pitch potrebbe avere un fondamentale mancante o molto debole (comune in alcuni suoni di voce, piano e chitarra) e / o un sacco di potenti sfumature nel suo spettro che sopraffanno la frequenza del pitch (ma sono comunque sentite come quella nota del pitch da un essere umano) . Pertanto, qualsiasi rivelatore di frequenza di picco FFT (anche includendo alcune finestre e interpolazione) non sarà un metodo affidabile per la stima del tono.

Questa domanda di StackOver include un elenco di alcuni metodi alternativi di stima del pitch che potrebbero produrre risultati migliori.

AGGIUNTO: Se lo stai facendo per i suoni di chitarra, nota che le corde di chitarra più basse possono effettivamente produrre toni leggermente inarmonici, rendendo ancora più difficile la stima del tono, poiché l'orecchio umano può sentire una frequenza di tono più strettamente correlata ai sotto-multipli dei toni piuttosto che alla frequenza di vibrazione fondamentale effettiva della stringa.

AGGIUNTO # 2: Mi viene chiesto così spesso che ho scritto un post sul blog più lungo sull'argomento: http://www.musingpaw.com/2012/04/musical-pitch-is-not-just-fft-frequency.html


appena visitato (e commentato) il blog a cui ci hai appena fatto riferimento.
robert bristow-johnson

5

Ho trascorso molti anni a ricercare il pitch pitch sulla musica polifonica, come rilevare le note di un assolo di chitarra in una registrazione mp3. Ho anche scritto una sezione su Wikipedia che fornisce una breve descrizione del processo (guarda la sottosezione "Rilevazione del passo" nel link sotto).

Quando un singolo tasto viene premuto su un piano, ciò che ascoltiamo non è solo una frequenza di vibrazione del suono, ma un composto di più vibrazioni del suono che si verificano a frequenze matematicamente diverse. Gli elementi di questo composto di vibrazioni a frequenze diverse sono indicati come armoniche o parziali. Ad esempio, se premiamo il tasto C centrale sul piano, le singole frequenze delle armoniche del composito inizieranno a 261,6 Hz come frequenza fondamentale, 523 Hz sarebbe la seconda armonica, 785 Hz sarebbe la terza armonica, 1046 Hz sarebbe essere la 4a armonica, ecc. Le armoniche successive sono multipli interi della frequenza fondamentale, 261,6 Hz (es: 2 x 261,6 = 523, 3 x 261,6 = 785, 4 x 261,6 = 1046).

Uso una trasformata logaritmica DFT modificata per rilevare prima le possibili armoniche cercando frequenze con livelli di picco (vedi diagramma sotto). A causa del modo in cui raccolgo i dati per il mio DFT di registro modificato, NON devo applicare una funzione Windowing al segnale, né aggiungere e sovrapporre . E ho creato il DFT in modo che i suoi canali di frequenza siano posizionati logaritmicamente per allinearli direttamente con le frequenze in cui le armoniche sono create dalle note di una chitarra, un sassofono, ecc.

Ora in pensione, ho deciso di rilasciare il codice sorgente per il mio motore di rilevamento del passo all'interno di un'app dimostrativa gratuita chiamata PitchScope Player . PitchScope Player è disponibile sul Web e puoi scaricare il file eseguibile per Windows per vedere il mio algoritmo al lavoro su un file mp3 di tua scelta. Il link seguente a GitHub.com ti condurrà al mio codice sorgente completo dove puoi vedere come rilevo le armoniche con una trasformazione DFT logaritmica personalizzata e quindi cercare i parziali (armoniche) le cui frequenze soddisfano la relazione intera corretta che definisce un ' intonazione'.

Il mio algoritmo di rilevamento del passo è in realtà un processo in due fasi: a) Innanzitutto viene rilevato ScalePitch ('ScalePitch' ha 12 possibili valori di passo: {E, F, F #, G, G #, A, A #, B, C, C #, D , D #}) b) e dopo aver determinato ScalePitch, l' ottava viene calcolata esaminando tutte le armoniche per le 4 possibili note Ottava-Candidato. L'algoritmo è progettato per rilevare il tono più dominante (una nota musicale) in un dato momento nel tempo all'interno di un file polifonico MP3. Questo di solito corrisponde alle note di un assolo strumentale. Coloro che sono interessati al codice sorgente C ++ per il mio algoritmo 2 Stage Pitch Detection potrebbero voler iniziare con la funzione Stima_ScalePitch () all'interno del file SPitchCalc.cpp su GitHub.com.

https://github.com/CreativeDetectors/PitchScope_Player

https://en.wikipedia.org/wiki/Transcription_(music)#Pitch_detection

Di seguito l'immagine di un DFT Logarithmic (creato dal mio software C ++) per 3 secondi di un assolo di chitarra su una registrazione mp3 polifonica. Mostra come appaiono le armoniche per le singole note di una chitarra, mentre suona un assolo. Per ogni nota su questo DFT logaritmico possiamo vedere le sue armoniche multiple estendersi verticalmente, poiché ciascuna armonica avrà la stessa larghezza temporale. Dopo aver determinato l'ottava della nota, allora conosciamo la frequenza del Fondamentale.

inserisci qui la descrizione dell'immagine

Il diagramma seguente mostra l'algoritmo Octave Detection che ho sviluppato per scegliere la nota Octave-Candidate corretta (vale a dire il fondamentale fondamentale), una volta determinato il ScalePitch per quella nota. Coloro che desiderano vedere quel metodo in C ++ dovrebbero andare alla funzione Calc_Best_Octave_Candidate () all'interno del file chiamato FundCandidCalcer.cpp, che è contenuto nel mio codice sorgente su GitHub.

inserisci qui la descrizione dell'immagine


James, il tuo rilevatore di tonalità DFT rileva le note con un fondamentale mancante (o debole)?
robert bristow-johnson il

Sì, il mio algoritmo di rilevamento del passo a 2 stadi rileverà le note, anche se il segnale ha un "fondamentale mancante (o debole)" - questo è un grande punto di forza di questo processo a 2 stadi. Il Fondamentale viene determinato nella seconda fase quando viene eseguito il rilevamento dell'ottava sulle larghezze temporali visualizzate per le note sul diagramma DFT logaritmico. Dal momento che questa funzione di Pitch Detection funziona all'interno della confusione di un segnale mp3 polifonico, rileverà note che mancano molte armoniche, incluso il Fondamentale. Ho appena aggiunto a questa risposta un secondo diagramma che spiega il mio algoritmo di rilevamento dell'ottava.
James Paul Millard,
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.