2009-12-04 14 views
26

Mi piacerebbe scrivere un programma semplice (preferibilmente in C#) a cui io canto un tono usando un microfono e il programma identifica a quale nota musicale corrisponde quella nota.Libreria .NET per identificare le scene


Grazie mille per le risposte tempestive. Chiarisco:

Vorrei una libreria (preferibilmente .NET) che identificasse le note che canto. Mi piacerebbe una libreria del genere:

  1. Identifica una nota quando canto (una nota dalla scala cromatica).
  2. Mi dice quanto sono lontano dalla nota più vicina.

Intendo utilizzare una tale libreria per cantare una nota alla volta.

+0

... E si desidera sapere quali librerie e componenti utilizzare? – FrustratedWithFormsDesigner

+1

Penso che tu abbia bisogno di chiarire la tua domanda. Hai affermato un desiderio generale, non domande specifiche. – CrimsonX

+0

deve essere in sintonia o dovrebbe consentire note false? – Abel

risposta

7

Generalmente si effettua una trasformazione di Fourier sull'ingresso, quindi si identifica la frequenza più evidente. Questa potrebbe non essere l'intera storia, dal momento che qualsiasi sorgente sonora non sintetica produce un numero di frequenze (esse costituiscono ciò che viene descritto come "tono di colore"). Ad ogni modo, può essere fatto in modo efficiente; ci sono autotuners in tempo reale (non credevi che la starlet pop potesse davvero cantare, vero?).

+1

che non funziona se una delle armoniche è più grande della fondamentale. Questo è più comune di quanto si possa pensare. Spettro Tromba: http://www.eng.cam.ac.uk/DesignOffice/mdp/electric_web/AC/02284.jpg – endolith

+0

endolith, questo è quello che volevo dire con "non tutta la storia". – Svante

19

Il pezzo cruciale di questo problema è la trasformata di Fourier veloce. Questo algoritmo trasforma una forma d'onda (la nota cantata) in una distribuzione di frequenza. Una volta calcolata la FFT, identifica la frequenza fondamentale (di solito la frequenza con l'ampiezza massima nella FFT, ma dipende in qualche modo dalla curva di risposta in frequenza del tuo microfono e dal tipo di suono che il tuo microfono sta ascoltando).

Una volta trovata la frequenza fondamentale è necessario cercare quella frequenza in un elenco che associa le frequenze alle note. Qui avrai bisogno di occuparti degli in inceppati (quindi se la frequenza fondamentale della tua nota cantata è 452 Hz a quale nota risponde effettivamente, A o A #?).

Questo tizio su CodeProject ha un esempio di FFT in C#. Sono sicuro che ci sono altri là fuori ...

+0

Non tutti gli algoritmi di rilevamento del passo sono basati sull'analisi della frequenza. Alcuni sono basati su analisi in tempo (è vero però che anche l'analisi in tempo -EG: autocorrelation- frequente uso FFT per motivi di prestazioni.) Http://en.wikipedia.org/wiki/Pitch_detection_algorithm#Time-domain_approaches – leonbloy

2

Avrai voglia di catturare il tuo input non elaborato, accumulare alcuni campioni e quindi fare un FFT su di essi. La FFT convertirà i tuoi campioni dal dominio del tempo al dominio della frequenza, quindi ciò che produce è un po 'come un istogramma di quanta energia il segnale contiene a varie frequenze.

Arrivare da quello a "la" frequenza può essere un po 'difficile però - una voce umana è non andando a contenere solo una singola, pulita frequenza del suono. Invece normalmente avrai energia ad un discreto numero di frequenze diverse. Quello che farai in genere è partire dalla gamma di voci più basse e risalire, cercando la prima (più bassa) frequenza alla quale l'energia sia significativamente più alta del rumore di fondo.

3

L'esecuzione di una trasformazione di Fourier fornisce valori per ciascuna frequenza rilevata nel campione. Maggiore è la frequenza, maggiore è il valore. Se cerchi il valore più grande, troverai la frequenza di root ma saranno presenti anche i sottotitoli.

Se stai cercando una frequenza specifica, l'utilizzo dell'algoritmo Goertzel può essere molto efficace.

2

È necessario eseguire un FFT del campione e analizzarlo. Le due cose che complicheranno la tua analisi sono:

  1. Overtones. Se si canta/riproduce A a 440 Hz (A4), si otterrà anche un tono a A5 (880 Hz), uno a E6 (1320 Hz), ecc. A seconda delle intensità relative alle frequenze, questo tono potrebbe essere percepito come A4, A5 o E6, e sottolineando il tono non è semplicemente una questione di dove c'è più intensità, l'orecchio umano è più complicato di così. È tuttavia possibile indovinare ragionevolmente che verrà percepito come A.

  2. Granularità. La FFT avrà una granularità che dipende solo dalla durata del campione, non dalla frequenza di campionamento. Se ricordo bene, è necessario un campione di due secondi per poter ottenere una granularità di 1 Hz, che è ancora un po 'grossolana. Un modo per aggirare questo è prendere tre frequenze attorno a ogni picco, approssimare un polinomio di secondo grado intorno a loro, e quindi determinare il massimo di quel polinomio. Ho letto un articolo in cui si afferma che l'utilizzo della fase è più accurato dell'ampiezza per questo, ma non ricordo dove, quindi non posso citarlo.

+0

"percepito come un A4, A5 o E6 "Le armoniche non sono tutte ottave. – endolith

+0

@endolith: cosa intendi? – erikkallen

+0

OK, ora lo vedo. Era un errore di battitura. Risolto il problema – erikkallen

4

Praticamente ogni risposta dice di fare una FFT. Ho scritto questo programma da solo, e ho scoperto che la FFT era brava a identificare approssimativamente la frequenza più forte, ma che ci fu un po '"sbavatura" come risultato - non è sempre facile per precisamente identificare piccole variazioni dal Passo obiettivo utilizzando una FFT, in particolare se il campione è breve.

L'approccio di Erik Kallen sembra ragionevole, ma ci sono altri approcci. Quello che ho trovato funzionato abbastanza bene era usare una combinazione di FFT e un semplice algoritmo di rilevamento "zero crossing" per restringere la frequenza esatta del segnale.

Cioè, contare il numero di volte che il segnale attraversa la linea dello zero in un dato intervallo, adattarlo al "secchio" della frequenza approssimativa prodotto dalla FFT, e si può ottenere un risultato abbastanza preciso.

3

Ho fatto pitch detection in passato, e la semplice soluzione di "prendere una FFT e guardare il picco" non funziona affatto per il parlato. Ho avuto abbastanza fortuna usando cepstral analysis. Un sacco di documenti utili possono essere trovati in Lawrence Rabiner publications. Consiglio di iniziare con "A comparative performance study of several pitch detection algorithms".

Proprio come un avvertimento, probabilmente mi ci sono voluti circa 30-40 ore di lavoro per arrivare al punto in cui avrei potuto inviare un file wav al mio programma e farlo sputare un numero sano. Ero anche più interessato alla frequenza fondamentale della voce di un oratore. Sono sicuro che trattare con la musica aggiungerà molte più rughe.

1

Se si desidera solo il risultato - i, e, per utilizzare il software, c'è un programma chiamato SingAndSee che fa proprio questo. È circa £ 25

+0

Sebbene la cosa ideale sarebbe avere solo la libreria che esegue il rilevamento del pitch, il tuo suggerimento è molto vicino a quello che voglio. Grazie. – Antoni

+0

kpollock, ho appena ottenuto SingAndSee. È semplicemente fantastico. È semplice, utile e dritto al punto. Grazie ancora. – Antoni

+0

felice il mio suggerimento è stato utile. Vorrei solo che aveva un "output midi" opzione .... – kpollock

1

Dato che hai a che fare con una fonte monofonica, la maggior parte dei tuoi pitch rilevati con una FFT dovrebbe essere armonicamente correlata, ma non sei realmente garantito che la fondamentale sia la tonalità più forte. Per molti strumenti e alcuni registri vocali, infatti, probabilmente non lo sarà. Dovrebbe essere il più basso dei toni armonici (in multipli interi dei fondamentali) rilevati però.

8

Stai cercando un algoritmo frequency estimation o pitch-detection. La maggior parte delle persone suggerisce di trovare il valore massimo della FFT, ma questo è troppo semplicistico e non funziona come si potrebbe pensare. Se lo fundamental is missing (ad esempio un timpano) o una delle armoniche è più grande della fondamentale (una tromba, ad esempio), non rileverà la frequenza corretta. Spettro Tromba:

Trumpet spectrum http://www.eng.cam.ac.uk/DesignOffice/mdp/electric_web/AC/02284.jpg

Inoltre, stai sprecando cicli del processore calcolo della FFT se siete solo alla ricerca di una frequenza specifica. È possibile utilizzare elementi come Goertzel algorithm per trovare i toni in una specifica banda di frequenza in modo più efficiente.

È davvero necessario trovare "la prima frequenza significativa" o "la prima frequenza con componenti armoniche forti", che è più ambigua rispetto al solo trovare il massimo.

Autocorrelation o harmonic product spectrum è migliore a trovare il vero fondamentale per strumenti reali, ma se lo strumento è inharmonic (la maggior parte sono), quindi la forma d'onda sta cambiando nel corso del tempo, e ho il sospetto che non funzionerà pure se provi a misurare più di alcuni cicli alla volta, il che diminuisce la tua precisione.

0

Per convertire il segnale Dominio temporale proveniente dal microfono, è necessario disporre di una Trasformata di Fourier Trasformata (DFT) o di una Trasformata di Fourier veloce (FFT). La FFT funzionerà più velocemente ma il codice sarà molto più complesso (una DFT può essere eseguita in 5-10 righe di codice). Una volta che questo è completo devi mappare le frequenze fondamentali alle note, sfortunatamente ci sono diversi schemi di mappatura a seconda del sistema di tuning che stai utilizzando. Il più comune di questi è Equal Temperament. Frequencies here. L'articolo di Wikipedia su Equal Temprement fornisce anche uno sfondo sul temperamento equabile.

Quando si utilizza una matematica di Fourier è necessario sapere come vengono gestite le frequenze e, idealmente, eseguire il filtraggio anti-aliasing prima della trasformazione e anche fare attenzione alla riflessione della frequenza quando si esegue una trasformazione. A causa del teorema di Nyquists è necessario campionare il contenuto del microfono almeno due volte più velocemente della frequenza massima, ad es. per una frequenza massima di 10Hz è necessario campionare a 20Hz.

2

Sono sorpreso da tutte le risposte qui suggerendo l'uso di FFT, dato che FFT non è generalmente abbastanza preciso per il rilevamento del passo. È può essere, ma solo con una finestra FFT non molto grande. Ad esempio, per determinare il fondamentale con 1/100 di precisione semitono (che è ciò che serve per il rilevamento preciso del pitch) quando il fondamentale è attorno al concerto A (440 Hz), è necessaria una finestra FFT con 524.288 elementi. 1024 è una dimensione FFT molto più tipica - il tempo di calcolo diventa progressivamente peggiore quanto più grande è la finestra.

Devo identificare l'intonazione fondamentale dei file WAV nel mio sintetizzatore software (dove una "miss" è immediatamente udibile come uno strumento fuori sintonia) e ho trovato che l'autocorrelazione è di gran lunga il miglior lavoro. Fondamentalmente, faccio scorrere ogni nota nella scala dei 12 toni su un intervallo di 8 ottave, calcolando la frequenza e la lunghezza d'onda di ogni nota, e poi eseguo un'autocorrelazione usando quella lunghezza d'onda come ritardo (una autocorrelazione è dove si misura la correlazione tra un insieme di dati e lo stesso insieme di dati sfalsati di una certa quantità di ritardo).

La nota con il punteggio più alto di autocorrelazione è quindi approssimativamente la tonalità fondamentale. Ho quindi "perfezionato" il vero fondamentale iterando da un semitono in basso a un semitono su 1/1000 di un semitono, per trovare il valore di autocorrelazione del picco locale.Questo metodo funziona in modo molto accurato e, cosa più importante, funziona per un'ampia varietà di file di strumenti (archi, chitarra, voci umane ecc.).

Questo processo è estremamente lento, tuttavia, soprattutto per le lunghe file WAV, quindi non poteva essere usato come un prodotto per un'applicazione in tempo reale. Tuttavia, se hai usato la FFT per ottenere una stima approssimativa della fondamentale, e poi hai usato l'autocorrelazione per azzerare il valore reale (e ti accontentavi di essere meno accurato del 1/1000 di un semitono, che è assurdamente eccessivo preciso) avresti un metodo che è stato relativamente veloce ed estremamente accurato.

0

Forse questa libreria completamente gestiti da CodePlex è appropriato per voi: Realtime C# Pitch Tracker

Autore elenca i seguenti vantaggi di autocorrelazione e la sua implementazione dell'algoritmo:

  1. Veloce. Come accennato in precedenza, l'algoritmo è abbastanza veloce. Può facilmente eseguire test di 3000 colpi al secondo.

  2. Preciso. La deviazione misurata dalla frequenza effettiva è inferiore a + -0,02%.

  3. Preciso su un'ampia gamma di livelli di input. Poiché l'algoritmo utilizza i rapporti di diversi picchi e non valori assoluti, rimane accurato su una gamma molto ampia di livelli di input. Non c'è perdita di precisione nell'intervallo da -40 dB a 0 dB di livello di ingresso.

  4. Preciso su tutta la gamma di frequenza. La precisione rimane elevata su tutta la gamma di frequenze rilevate, da circa 50 Hz a 1,6 kHz. Ciò è dovuto all'interpolazione applicata quando si calcolano i campioni per le finestre scorrevoli.

  5. Accurato con qualsiasi tipo di forma d'onda. A differenza di molti altri tipi di algoritmi di rilevamento del passo, questo algoritmo non è sostanzialmente influenzato da forme d'onda complesse. Ciò significa che funziona con voci maschili e femminili di qualsiasi tipo, così come altri strumenti come chitarre, ecc. L'unico requisito è che il segnale sia monofonico, quindi gli accordi non possono essere rilevati. Questo rilevatore di suoni funzionerà bene come un accordatore di chitarra molto reattivo.

  6. Non si basa sui risultati precedenti. Questo algoritmo è abbastanza preciso da non aver bisogno di fare affidamento sui risultati precedenti. Ogni risultato di pitch è un valore calcolato completamente nuovo. Gli algoritmi di pitch che tracciano il pitch "lock on" sul pitch soffrono del problema che se rilevano il pitch sbagliato (di solito un'ottava troppo alta o bassa) continueranno a essere sbagliati anche per molti test successivi.