Posso usare la FFT per riconoscere le note musicali su un piano?


13

Voglio creare uno strumento che riconosca alcune note musicali (so che sta reinventando la ruota). Quindi suonerei la C, la D e la E centrali su un piano e dovrei riuscire a classificare quelle note. Ecco come penso che dovrei affrontarlo:

  1. Registrare un campione di me che suona una nota
  2. Converti il ​​segnale nel dominio della frequenza usando la trasformata di Fourier veloce
  3. Trova la frequenza più presente (sostanzialmente argmax dei dati del dominio della frequenza)
  4. Supponi che la frequenza provenga dalla nota suonata e usala per classificare la nota

Non ho ancora provato nulla di tutto questo perché non voglio iniziare sulla strada sbagliata. Quindi, in teoria, funzionerà?


Sarebbe bello se tu potessi essere più specifico nel titolo. Ho cercato di includere un po 'il riconoscimento del piano pitch, ma il mio inglese (non nativo) mi sembra stia fallendo oggi.
pipe

1
@pipe ok l'ho cambiato
michaelsnowden il

1
Il tuo "campione" di suonare una nota dovrebbe già essere una forma d'onda di ampiezza e tempo. In sostanza, il punto 2 è ridondante. Per un'implementazione relativamente semplice, i passaggi precedenti dovrebbero andare bene.
user2943160

@ user2943160 L'ho aggiunto per essere esplicito. Il suono può essere archiviato in molti formati e di solito ci vuole un po 'di manomissione per farlo diventare una buona ampiezza nel tempo.
michaelsnowden,

@michaelsnowden: Si utilizza il termine "ampiezza" sbagliato: l'ampiezza di una funzione sinusoidale è . È il massimo del segnale (tensione, spostamento, ...) ed è una costante (o che cambia lentamente rispetto alla frequenza). Quello che vuoi dire è solo il segnale . Altrimenti penserei per "ampiezza nel tempo" intendi l'inviluppo del segnale, ma per quanto ho capito non lo fai. y(t)=UNpeccato(ωt)UNy(t)
Cagliata

Risposte:


23

Il concetto è buono, ma scoprirai che non è così semplice in pratica.

Il tono non è semplicemente il tono predominante, quindi c'è il problema numero 1.

I bin di frequenza FFT non possono colpire tutti (o anche più) toni della scala musicale contemporaneamente.

Suggerirei di giocare con un programma audio (ad esempio Audacity) che include un analizzatore FFT e un generatore di suoni per avere un'idea di ciò che può (e non può) fare prima di provare a implementare un determinato compito utilizzando FFT.

Se è necessario rilevare solo alcuni toni specifici, è possibile che l' algoritmo Goertzel sia più semplice e veloce.

Il rilevamento del pitch è complicato e in questo campo sono ancora in corso ricerche. Il rilevamento del tono è piuttosto semplice, ma potrebbe non darti quello che vuoi.


Se partiamo dal presupposto che i campioni siano di uno strumento specifico, il problema potrebbe essere un po 'più facile da gestire, giusto?
mkeith,

Questo sembra davvero buono. Una domanda di follow-up è: l'algoritmo di Goertzel può essere utilizzato per rilevare due note che vengono suonate contemporaneamente?
michaelsnowden,

Può essere utilizzato per rilevare toni simultanei. Se questo è sufficiente per rilevare le note simultanee è una domanda diversa e su cui sto ancora lavorando. Ho un rilevatore di note per chitarra basato su Goertzel con il quale ho continuato a suonare da anni.
JRE,

2
@mkeith: sorta di. Puoi testare le note e vedere se il rilevamento del tono predominante è adeguato per un determinato strumento (e forse solo per le note di interesse). Per quanto ne so, tuttavia, non esiste una soluzione generale per rilevare tutte le note da tutti gli strumenti.
JRE,

3

Direi che sarebbe meglio usare una finestra di osservazione multimodale del segnale. Qualcosa sulla falsariga di una decomposizione wavelet del tuo segnale audio che ti permetterà di identificare i vari toni all'interno della nota. Sì, in realtà Wavelets, direi che è la strada da percorrere.

Questa è una ripartizione molto generalizzata di cosa siano le wavelet, ma pensale come una finestra multiresoluzione che passa sopra il tuo segnale come una STFT. Quindi puoi identificare diversi sinusoidali che si verificano in diverse posizioni temporali all'interno del tuo segnale. questo è importante anche perché la nota che suoni non è un segnale stazionario, ma suona e poi decade nel tempo. Non sono un musicista, tuttavia credo che la dominanza del tono cambi durante il decadimento della nota.

ovviamente dopo la decomposizione wavelet dovrai implementare algoritmi che identificano note e toni periferici.

Penso che le wavelet affrontino davvero i problemi di cui le persone hanno parlato in termini di identificazione del pitch.

se vuoi sapere come funzionano le wavelet, questo è un meraviglioso white paper rilasciato da HP al riguardo :) http://www.hpl.hp.com/hpjournal/94dec/dec94a6.pdf e Introduzione alle wavelet

per l'implementazione, MATLAB ha uno strumento wavelet e sono sicuro che ci sono molti altri pacchetti disponibili per piattaforme come R, ecc.


1

Immagino che tu stia pensando alle note suonate nel mezzo della gamma del piano (diciamo tra 200 e 500 Hz) ma anche in quella gamma, una singola nota avrà molti toni, che non sono multipli esatti della frequenza fondamentale, e anche un quantità significativa di rumore a banda larga all'inizio di ogni nota, e forse anche alla fine.

Per le note forti all'estremità inferiore della gamma delle note, scoprirai che pochissima energia sonora (meno dell'1%) è effettivamente nel tono fondamentale della nota.

Un altro problema è che un'interpretazione ingenua di una FFT presuppone che il segnale che si sta tentando di rilevare abbia un'ampiezza costante. Ciò non si applica alle note di pianoforte in cui l'ampiezza segue effettivamente diversi decadimenti esponenziali sovrapposti: la parte iniziale del decadimento ha una costante di tempo relativamente breve, ma la parte successiva ha una costante di tempo più lunga.

Potresti studiare meglio i metodi di trasformazione di Fourier su scala breve, ad esempio la trasformazione di Gabor o metodi basati su wavelet.

Si noti che poiché l'intonazione fondamentale delle note successive aumenta di circa il 6% per ciascuna nota, non è necessariamente necessaria una precisione molto elevata nell'identificare le frequenze delle armoniche nell'audio. Identificare correttamente le note musicali non è lo stesso problema di determinare se le note sono in perfetta sintonia con una scala musicale, dove le frequenze potrebbero dover essere misurate con una precisione migliore dello 0,1%.


0

Sì, questo è l'FFT! Per darti lo spettro di frequenza dei dati che fornisci. La parte difficile sono i dettagli di implementazione, come hai già detto.

A seconda di cosa vuoi fare, esattamente, cambia la risposta.

Se vuoi solo analizzare la tua musica, ci sono già dei software là fuori per farlo. Potresti guardare gli EQ che mostrano la risposta (fondamentalmente la FFT) o ottenere un "EQ musicale" che mostra anche i toni. Puoi ottenere l'audio di VST MIDI che convertono ciò che suoni nelle note MIDI corrette. Se la tua tastiera è midi, salta semplicemente i VST e registra direttamente il midi.

Se vuoi insegnare a te stesso la FFT e come si collega alla musica, allora è meglio ottenere qualcosa come Matlab in cui è possibile calcolare la FFT di qualsiasi dato. Ha la capacità di registrare e anche riprodurre insieme alla lettura di file WAV e simili. Questi poi sono davvero facili da usare. È possibile rappresentare graficamente l'audio ed eseguire tutti i tipi di analisi piuttosto rapidamente se si conosce la sintassi.

Se vuoi costruire un dispositivo per fare una cosa del genere, allora è piuttosto complesso. Avrai bisogno di un uC / dsp / fpga / etc per fare i calcoli. I dispositivi più popolari sono già dotati di codice FFT, quindi non dovrai codificarlo da solo (anche complicato).

Dovrai costruire i circuiti e tutto il resto. Non è difficile ma a seconda della tua esperienza / conoscenza potrebbe richiedere parecchio tempo e ha una curva di apprendimento ripida. Dipende anche dalla qualità del prodotto finale.

Matematicamente, una nota musicale ideale consiste in una serie geometrica del "fondamentale".

Supponiamo che F0 sia la frequenza fondamentale, quindi la maggior parte delle note musicali sarà approssimata da F (t) + F0 * sum (a_k e ^ (2 ^ k F0 * pi i t)) = F0 + a_1 * F1 + a_2 * F2 +. ...

Gli a_k sono solo la forza di quelle frequenze più alte F_k e F_k è solo un multiplo di F0. Se a_k = 0 per tutto k, allora abbiamo una sinusoide pura. Il tono di questo è facile da rilevare. Basta trovare il massimo della FFT e quella frequenza è fondamentale per il tono = la nota musicale.

Quando prendi la FFT, finisci con i dati e fai solo i conti. Fondamentalmente è un calcolo.

Tutto ciò è relativamente semplice.

Alcuni problemi che dovrai affrontare. Si noti che non tutti questi sono "risolti".

  1. Latenza - Se hai intenzione di fare qualsiasi tipo di cose in tempo reale, questo può diventare un problema.

  2. Note multiple - È difficile determinare il gruppo di note a causa di tutte le armoniche extra. Se si gioca A = 440hz e A '= 880hz, la maggior parte delle armoniche si sovrapporranno. Puoi facilmente ottenere A = 440hz, ma ottenere A '= 880hz è più difficile. Quando pensi ad accordi, corse veloci, ecc., Può essere molto difficile ottenere con precisione tutte le informazioni (note). Mentre tutto è generalmente matematicamente possibile, i dati stessi hanno errori e aberrazioni e le equazioni sono sotto definite in alcuni casi.

  3. Rumore - Il rumore nel segnale può dare risultati spuri. Se si verifica un rumore musicale può rovinare i risultati. Sarebbero quindi necessari algoritmi migliori = tempo + denaro + conoscenza.

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.