Come posso eseguire il rilevamento del tono in tempo reale in .NET?
-
26-09-2019 - |
Domanda
Voglio creare un programma che rileva la nota che viene giocata di fronte al microfono. Sto testando la funzione FFT di Naudio, ma con i test che ho fatto in Audacity sembra che FFT non rilevi correttamente il tono. Ho suonato un C5, ma la scelta più alta era all'E7.
Ho cambiato la prima casella a discesa nella finestra dell'analisi della frequenza in "Autocorrelazione incantata" e successivamente la scelta più alta è stata a C5.
Ho cercato su Google "Autocorrelation Enchaced" e non ho avuto fortuna.
Soluzione
Il picco più alto in uno spettro audio non è necessariamente il tono musicale in quanto un essere umano lo perceperebbe, specialmente in un suono con forti sfumature. Questo perché il tono è un fenomeno psico-percettivo umano, il cervello spesso deduce frequenze che non sono nemmeno presenti in una forma d'onda.
Metodi di auto-correlazione dell'auto di frequenza o stima del passo (approssimativamente, trovando quanto lontano anche una forma d'onda dall'aspetto divertente e/o non-sinusoidale nel tempo) è di solito una corrispondenza migliore per ciò che un essere umano chiamerebbe il tono. Il motivo di vari miglioramenti all'algoritmo di autocorrelazione è che la semplice autocorrelazione troverà un numero quasi infinito di lunghezze d'onda ripetute (ad esempio se si ripete ogni 1 secondo si ripete anche due volte ogni 2 secondi, ecc.) In qualche modo statisticamente meglio abbinare ciò che un essere umano indovinerebbe la stessa forma d'onda.
Altri suggerimenti
Probabilmente ti stai buttando via dalle armoniche. Hai provato a testare con un'onda sinusoidale per vedere se la FFT del tuo Naudio è nel campo da baseball?
Vedi questi riferimenti:http://cnx.org/content/m11714/latest/
http://www.gamev.net/comunity/forums/topic.asp?topic_id=506592&whichpage=1�
Riga 48 in Spectrum.cpp
Nel codice sorgente audacia sembra essere vicino a quello che vuoi. Fanno anche riferimento a un Carta IEEE di Tolonen e Karjalainen.
Bene, se riesci a vivere con GPLV2, perché non dare un'occhiata al codice sorgente di audacia?