Sto lavorando a un programma di accordatura per pianoforte e parte di esso richiede il rilevamento del pitch in tempo reale. Ecco lo schema che ho finora che funziona in una certa misura ma probabilmente potrebbe usare un po 'di raffinatezza.
Sto catturando audio PCM mono, 44,1 kHz, 16 bit in blocchi di 2 ^ 14 campioni. Combino gli ultimi 4 campioni in un buffer di lunghezza 2 ^ 16, applico una finestra di Hann al buffer ed eseguo un FFT su di esso. Quindi, divido i risultati della FFT in due risoluzioni. Innanzitutto, eseguo il bucket in 200 bucket e quindi eseguo l'algoritmo di rilevamento del passo HPS con questa granularità. Non ho bisogno di ottenere una frequenza esatta qui, voglio solo avvicinarmi. Quindi, eseguo il bucket in 12000 bucket che mi offrono una risoluzione di 1 cent da 10Hz a 10kHz. Una volta che conosco una frequenza approssimativa dall'algoritmo HPS da 200 bin, cerco un picco per quella frequenza del caso bin 12000 per ottenere una frequenza più esatta.
Questo sembra funzionare bene per le note al centro della tastiera. Ciò che accade con le note basse è di circa 1,5 secondi di errata identificazione della nota come di solito la seconda o terza parziale della nota reale e quindi una corretta identificazione della nota.
In tutti i grafici spettrali che ho creato per vedere cosa sta succedendo, c'è più larghezza rispetto ai picchi che mi aspetterei. Questa larghezza è visivamente in qualche modo coerente dal contenitore da 200 a 12000. Mi sarei aspettato che i picchi si restringessero nel caso del contenitore 200.
Quindi, l'elaborazione del segnale è nuova per me, quindi potrebbero esserci problemi che non avrei mai pensato di porre, ma in termini di domande specifiche, le dimensioni del campione sono sufficienti per questo compito? Hann è la scelta giusta per la finestra? Devo lisciare anche i dati prima di FFT? Quanto è sensibile l'HPS al numero di bin? Pensavo che se avessi usato molti bin, allora l'inarmonicità non avrebbe potuto far sovrapporre i parziali ai loro fondamenti con il semplice approccio dell'algoritmo HPS di dividere per 2, 3, 4, ecc.