Rilevazione del passo umano in tempo reale


11

Sto cercando di implementare un gioco di canto che analizzerà l'input di microfono crudo e dirà al giocatore quanto sta cantando bene. Questo deve essere fatto in tempo reale.

Mi sono imbattuto in molti thread che hanno posto la stessa domanda, ma non ne ho ancora abbastanza, probabilmente a causa della mia mancanza di esperienza nel campo e delle conoscenze matematiche poco profonde. Ho implementato un algoritmo basato sull'articolo del pitch shift del sito Web DSPDimension: http://www.dspdimension.com/admin/pitch-shifting-using-the-ft/

Estraggo la vera frequenza e magnitudine proprio come spiega l'articolo, ma non so trovare la frequenza fondamentale con questo. Ho cercato di ottenere il bidone con la massima magnitudine, ma ciò mi dà solo i risultati giusti per i segnali di tonalità più alta, non importa quale fattore di sovracampionamento che uso ottengo ancora dati cattivi per segnali a bassa frequenza. Questo approccio è completamente sbagliato o sono sulla buona strada ma mi manca qualcosa?

Grazie in anticipo,

EDIT: Ho dimenticato di menzionare che sono interessato solo alla classe di pitch, quindi va bene se manca il fondamentale ma ho un forte tono nel campione.

EDIT2: Grazie a tutti, ho appena finito una versione dell'algoritmo che funziona come un fascino. Il problema di stima del tono basso era dovuto al mio test di input. Quando ho cantato la nota, la corrispondenza è corretta. Inoltre, sto prendendo in considerazione tutte le armoniche ora, non solo il picco più alto.


Wikipedia ha alcune informazioni.
Emre,

Risposte:


9

Ho cercato di ottenere il bidone con la massima magnitudine, ma ciò mi dà solo i risultati giusti per i segnali di tonalità più alta, non importa quale fattore di sovracampionamento che uso ottengo ancora dati cattivi per segnali a bassa frequenza.

Questo perché le armoniche sono più grandi di quelle fondamentali. Traccia il tuo spettro e vedrai. Un metodo migliore per trovare il vero fondamentale è l'autocorrelazione. Quindi stai "facendo scivolare" la forma d'onda oltre se stessa e trovi i ritardi con cui la forma d'onda si allinea con se stessa.

http://www.phon.ucl.ac.uk/courses/spsci/matlab/lect10.html

Vuoi davvero che cantino la nota esatta, o va bene se cantano un'ottava sopra o sotto a seconda del loro registro vocale?


Hai ragione, ho dimenticato di dire che mi interessa solo la lezione di tiro. Sto usando questo sito Web per testare il mio strumento: seventhstring.com/tuningfork/tuningfork.html . Per l'ingresso di A (220Hz) restituisce E (660Hz) come la classe di tono trovata. Ho dato un'occhiata allo sprectum e 220Hz è davvero lì, ma con una grandezza inferiore a 660Hz. Dopo aver filtrato i valori al di sotto di una magnitudo minima e le frequenze massime nell'intervallo desiderato, lo sprectum che ne ricavo ha 4 picchi. [picco, mag] = [220, 0,0203], [618, 0,0142], [660, 0,0668], [703, 0,0497].
Felipe Lira,

Mi è appena venuto in mente che forse dovrei prendere in considerazione l'offset di fase durante il calcolo della grandezza, proprio come sto facendo per ottenere la vera frequenza. Ha senso? Quello che voglio dire è che se avessi un offset di fase di circa 90º per un bin, il "picco" sarebbe a 0 magnitudo, no?
Felipe Lira,

@elipedrl: Quindi essenzialmente stai scrivendo un accordatore per chitarra. :) A quanto ho capito, hanno un filtro passa-basso per ripulire la forma d'onda e quindi contare i picchi per ottenere il tono. electronicdesign.com/article/articles/... aboutmicrocontroller.blogspot.com/2008/04/... Ci sono modi migliori, però, se si sta andando per la precisione, piuttosto che economicità gist.github.com/255291
endolith

@elipedrl: l'offset di fase per un bin dovrebbe essere irrilevante per il tono. Ogni cestino è un numero complesso e sei interessato al valore assoluto o alla grandezza di quel numero. en.wikipedia.org/wiki/Absolute_value#Complex_numbers
endolith

1
e se ti capita di avere 2 FFT più brevi per qualche motivo (latenza, quanti di tempo, ecc.), un calcolo del vocoder di fase è meno calcolo rispetto a fare un altro FFT più lungo e interpolare quello.
hotpaw2

6

Sì, l'uso di uno stimatore della frequenza di picco per il pitch è errato. Il tono è un fenomeno psicoacustico, quindi il rilevamento o la stima del tono sono diversi dalla stima della frequenza. Ci sono stati molti metodi di stima del tono forniti nelle risposte precedenti a domande simili qui. C'è più di 1 tra cui scegliere.

Eccone uno: /programming/4227420/matlab-missing-fundamental-from-an-fft/4231322#4231322 e un altro: Suggerimenti per migliorare il rilevamento del tono

AGGIUNTO # 1: Domande simili a questa vengono poste 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


Ho aggiornato la domanda con l'informazione che mi interessa solo la lezione di lancio. Spero davvero che FFT con una post-elaborazione sia sufficiente per questo, sono molto indietro rispetto al mio programma e cambiare l'approccio sarebbe terribile per me.
Felipe Lira,

@elipedrl: FFT dovrebbe funzionare allora. Ottenere diversi picchi e quindi selezionarne uno in modo intelligente dovrebbe essere abbastanza buono. Ricorda che i picchi validi saranno vicini ai multipli interi (ma non esattamente) dei fondamentali, mentre i picchi spuri no. Devi evitare di selezionare picchi spuri ed evitare di selezionare la terza armonica, ecc. Che non sono un'ottava di distanza dalla nota che stai cercando.
endolito il

È possibile, sebbene forse improbabile, che nessun picco di frequenza sia alla frequenza del tono musicale. Alcune vocali maschili possono essere vicine a questo, solo alti tratti lasciati dopo il filtraggio dal formante vocale.
hotpaw2,

Il metodo Harmonic Product Spectrum può essere idoneo per trovare una stima del minimo comune denominatore LCD di un gruppo di picchi spettrali, post-elaborazione dei risultati iniziali della FFT.
hotpaw2
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.