Ho bisogno di rilevare il tono (misura la frequenza del segnale) mentre i musicisti suonano, dando un avvertimento se sono stonati, ma la musica sembra essere un po 'troppo veloce per FFT (Fast Fourier Transform).
Di seguito provo a fornire una descrizione tecnica del problema.
I musicisti suonano musica a 90-140 bpm. Ciò significa che ci sono 90-140 gruppi di note al minuto, fino a 8 (più frequentemente, fino a 4) note in ciascun gruppo (60/140/8 = 0,0536 sec, 60/90/4 = 0,167 sec), che cioè, le note possono cambiare al ritmo di 6-19 note al secondo.
La musica usa una scala logaritmica (vedi l'immagine allegata): l'intervallo tra, diciamo, 440Hz e 880Hz è diviso in 12 note, di cui solo 7 sono usate per la melodia. (Fondamentalmente, usano solo i tasti bianchi sul piano; quando vogliono spostare la frequenza iniziale, usano alcuni dei tasti neri e non usano alcuni tasti bianchi.) Cioè, la frequenza di ogni nota successiva viene moltiplicata di 2 ^ (1/12) = 1.05946.
Per rendere le cose più complicate, la frequenza A (La) può variare da 438 a 446 Hz. Gli strumenti a corda in teoria possono essere accordati, mentre gli strumenti a fiato dipendono dalla temperatura e dall'umidità dell'aria, quindi la frequenza viene rinegoziata dai musicisti durante il controllo del suono.
A volte musicisti e cantanti commettono errori in frequenza, lo chiamano "stonato". Vogliono un dispositivo che li informi di tali "errori di sintonia". Hanno sintonizzatori, ma i sintonizzatori richiedono di riprodurre lo stesso suono per circa 1 secondo prima di iniziare a mostrare qualcosa. Funziona per l'accordatura, ma non funziona durante la riproduzione della musica.
Molto probabilmente, il sintonizzatore sta facendo FFT, e grazie alla formula attende 1 secondo per ottenere la risoluzione 1Hz.
Per A = 440Hz, la differenza di frequenza tra due note è 440 * 0,05946 = 26,16 Hz, per ottenere quella risoluzione di frequenza, si deve usare un tempo di acquisizione di 0,038 sec, cioè a tempo = 196bpm FFT è in grado di distinguere solo due osserva che a 98 bpm è in grado di dire un errore stonato del 50% a condizione che inizi l'acquisizione nel momento stesso in cui il tono cambia. Se permettiamo il cambio di intonazione nel corso di un periodo di acquisizione, otteniamo 49 bpm, che è troppo lento. Inoltre, è molto desiderabile essere più precisi sulla frequenza, per esempio, rilevare un errore stonato del 25% o del 12%.
C'è un modo per misurare la frequenza (rilevare il pitch) meglio di FFT, ovvero con una migliore risoluzione in meno tempo di acquisizione? (Almeno 2 volte meglio, idealmente, 8-16 volte meglio.) In cambio, non ho bisogno di distinguere tra note di ottave diverse, ad esempio sia 440 che 880 possono essere riconosciuti come A. Non ho bisogno della linearità di FFT output, una scala logaritmica sarebbe migliore. (Probabilmente, sono possibili più compromessi, proprio ora non mi viene in mente altro.)
Ecco un disegno davvero buono: