Il modo più efficiente per estrarre componenti di frequenza del segnale audio con precisione quasi umana in tempo reale


14

Sto cercando di capire come (se possibile) estrarre i componenti di frequenza di un campione audio arbitrario (in genere musica) in un modo simile a FFT, ma nella mia ricerca sull'algoritmo FFT, sto imparando che soffre un po ' severe restrizioni a questo scopo.

Ci sono 3 problemi che presenta la FFT:

  1. Poiché la risoluzione del cestino FFT è equivalente alla dimensione della finestra, per ottenere una precisione abbastanza ragionevole (diciamo 1 Hz), è necessaria una finestra irragionevolmente lunga (diciamo 1 secondo). Ciò significa che non è possibile rilevare rapidamente transitori o frequenze appena introdotte. Significa anche che il problema non può essere risolto con una CPU più veloce e una frequenza di campionamento più elevata: la restrizione è intrinsecamente legata al tempo.

  2. Gli umani percepiscono la frequenza logaritmicamente, ma i contenitori FFT sono distanziati in modo lineare. Ad esempio, una differenza di 20 Hz nella parte bassa del nostro udito è enorme , mentre una differenza di 20 Hz nella parte alta è impercettibile. Quindi, per ottenere l'accuratezza di cui abbiamo bisogno alle basse frequenze, dobbiamo calcolare molto più di quanto richiediamo alle alte frequenze.

  3. Alcuni di questi problemi possono essere risolti interpolando tra i contenitori FFT. Questo può funzionare per molto audio musicale, poiché le frequenze sono spesso distanziate abbastanza lontano e quindi non più di 1 frequenza si perde in una coppia di bin. Ma non sarà sempre così, in particolare per suoni inarmonici come strumenti a percussione. Quindi l'interpolazione è davvero solo una congettura.

Da quello che ho capito dell'algoritmo DFT / FFT, le uscite (ampiezze dei bin) sono effettivamente la correlazione del seno / coseno alla frequenza di ciascun bin. Mi sembra che se l'algoritmo potesse essere riprogettato in modo tale che le frequenze dei bin siano distanziate in modo non lineare (ovvero correliamo un diverso insieme di seni / coseni), potremmo ottenere una risoluzione psicoacusticamente uguale a tutte le frequenze. È possibile o è un sogno irrealizzabile basato sulla mia comprensione incompleta della matematica coinvolta?

Immagino che potrei anche risolvere il problema con la forza bruta, correlando seno / coseno ad ogni singola frequenza che mi interessa. Non sono troppo ben informato sulla matematica qui. È possibile? Che tipo di efficienza? Risolverebbe il mio problema?

Esiste un modo diverso per ottenere una decomposizione più precisa, in tempo reale, della frequenza di un segnale? L'efficienza della CPU è una preoccupazione, ma non la preoccupazione principale: sono parzialmente interessato al fatto che teoricamente possa essere fatto affatto. Tuttavia, qualcosa che sia fattibile in tempo reale su una macchina desktop moderna sarebbe l'ideale.


3
Quale problema stai cercando di risolvere? rilevamento f0, rilevamento multi-f0 (per trascrizione), riconoscimento accordi, modellazione timbrica ...? Esistono soluzioni ad hoc per alcuni di questi problemi. Ti interessa la invertibilità (da utilizzare in un quadro di analisi-> trasformazione-> resintesi)?
Pichenettes,

Il problema che sto cercando di risolvere è certamente piuttosto aperto. Ho un interesse generale per la musica digitale, che copre gran parte della tua lista. Ma la mia vaghezza è in parte dovuto alla mia mancanza di conoscenza di ciò che può essere fatto e quali sono le specifiche migliori modi di risolvere ogni problema si parla (finché non ho fatto questa domanda, avevo sempre pensato FFT era-standard di settore o di esso ). Ma l'elemento della tua lista di maggior interesse per me è la modellazione timbrica. Mi piacerebbe anche trovare il modo di estrarre timbri complessi che suonano simultaneamente in una registrazione. La risintesi è eccitante. Gli algoritmi AI sono di interesse.
Bryhoyt,

Un problema più specifico che ho tentato di risolvere in passato e vorrei riprovare qualche volta: vorrei scrivere un programma per "improvvisare" in tempo reale con un gruppo di musicisti o cantanti registrati con un microfono. Ho avuto la possibilità che il mio computer "fischiettasse" un seno con me, notevolmente ritardato e stonato. Sarebbe di vitale importanza che una tale improvvisazione sia accuratamente accordata e corretta. Certo, ci sono altri modi per raggiungere questo obiettivo (i giocatori suonano strumenti digitali o forniscono al computer "informazioni privilegiate" come una progressione di accordi preimpostata ecc.), Ma questo non è il mio obiettivo.
Bryhoyt,

"L'algoritmo potrebbe essere riprogettato in modo tale che le frequenze dei bin siano distanziate in modo non lineare, in modo da poter ottenere una risoluzione psicoacusticamente uguale a tutte le frequenze." Sembra una continua trasformazione wavelet di Morlet
endolite,

Risposte:


5

Come ho commentato in un post precedente, il metodo di analisi frequenza-tempo noto come "trasformata di Fourier a breve termine" equivale a un banco di filtri, analizzando il segnale x . Per una data finestra di analisi w n , di dimensione N , il filtro alla frequenza k / N è: h n = w - n e j 2 π n kXXwnNK/N

hn=w-nej2πnKN

Per le normali finestre di analisi (Hann, Hamming o persino rettangolo), ciò corrisponde a un filtro passa-basso, con frequenza di taglio intorno a , che viene "spostato" nel contenitore di frequenza k1/NK (grazie alla complessa modulazione esponenziale) , portando quindi a un filtro passa-banda.

A questo punto, al fine di rispondere direttamente alla tua preoccupazione riguardo al riflettere la percezione umana, alcune persone hanno derivato la ["trasformazione costante-Q" (CQT)] [Brown91]. Si basa sullo stesso principio di FT, nella sua interpretazione della banca filtro. Tuttavia, i centri non sono spaziati linearmente come per un FT "normale", ma piuttosto log2-spaziati. La bilancia è quindi strettamente legato ad una scala musicale occidentale: se si sceglie F k + 1 = 2 1 / 12 f k , allora otteniamo 12 frequenze per ottava (suona un campanello :-)?), E la larghezza di banda è impostato su , dire, 2 1 / 12fKfK+1=21/12fK. Puoi anche scegliere altri centri, in base alle tue esigenze.21/12-12fK

È possibile trovare implementazioni della CQT qua e là, un recente dal prof Klapuri, arrivando con un'inversa piuttosto decente può essere trovato qui . Anche il gruppo Audio di Telecom ParisTech ha un'implementazione del Prof. Prado, ma non l'ho ancora provato.

[Brown91] J. Brown, "Calcolo di una costante trasformazione spettrale Q", Journal of Acoustical Society of America, 1991, 89, 425-434

EDIT 20121014: alcune risposte e commenti alle tue domande (di Bryhoyt).

  1. Solo idee generali sui tuoi commenti alla domanda principale: sembri essere interessato a molte applicazioni che, per me, non sono problemi banali da affrontare. La "modellazione timbrica" ​​mi sembra più correlata al riconoscimento vocale o simili, per cui la risoluzione o la precisione del tono o della frequenza non rappresentano un grosso problema (si consideri il modo in cui vengono generalmente calcolati gli MFCC).

    Considera anche quanti importanti ricercatori ( F. Pachet e il team di repmus dell'IRCAM, Francia , per citarne alcuni) stanno lavorando sul tema dell'improvvisazione e dell'accompagnamento automatici: il compito non è impossibile, ma richiede esperienza in molti settori. Riassumendo, un sistema tipico deve imitare (almeno) il sistema uditivo umano, implementare la percezione del suono / musica / intonazione / ritmo, conoscere la teoria musicale e prendere decisioni basate sulle stime di tutti i passaggi precedenti. La trasformata di Fourier, o qualsiasi rappresentazione del segnale, è solo un (piccolo) passo verso l'obiettivo finale - e potenzialmente, secondo me, il meglio compreso finora.

    Detto questo, c'è ancora la possibilità che tutti stiano guardando ben oltre ciò che accade realmente, e che potresti abbatterlo in una soluzione semplice, quindi elegante! Non dimenticare di pubblicarlo una volta finito! :-)

  2. un campione di 0,1 s a 44 kHz è sufficiente per contenere una vasta gamma di frequenze

    FS/N=44100/4410=10Hz

  3. La FFT non è in grado di rilevare questo per le frequenze basse e alte, ma dici che altri algoritmi possono: qual è il compromesso?

    Risposta breve: leggi la mia tesi sulla stima della melodia!

    Per elaborare un po 'di più: molti algoritmi di stima dell'intonazione vanno oltre i limiti dell'FT, grazie alle ipotesi sui suoni da elaborare. Ci aspettiamo che le note dai suoni naturali (voce umana, oboe, sax, piano ...) siano più complesse dei singoli sinusoidi. La maggior parte dei suoni acuti sono più o meno armonici, il che significa che possono essere modellati come somme di sinusoidi la cui frequenza è un multiplo della frequenza fondamentale.

    È quindi utile tenere conto di queste armoniche nella stima del tono, con metodi che utilizzano funzioni di rilevamento come somme spettrali, prodotti spettrali o funzioni di auto-correlazione. Qualcuno ha iniziato un argomento correlato di recente.

  4. Quali sono i compromessi? Più specificamente, quale livello di precisione della frequenza posso aspettarmi per una finestra ragionevolmente breve? (Capisco che la dimensione della finestra in CQT è variabile - quanto?) Ancora più specificamente, quanto vicino sarò in grado di arrivare al mio ca. obiettivo della differenza di frequenza dello 0,5% con una finestra di 0,005 s?

    Come precedentemente detto, con una finestra di 0.005s, ci si può aspettare qualcosa come 200Hz di "perdita di frequenza". Questo è davvero un problema solo quando hai 2 sinusoidi con frequenze più vicine di 200Hz, in modo tale che FT non sarà in grado di mostrare che sono 2 diversi sinusoidi. Bene, siamo lontani dal tuo 0,5% (a proposito, un semitono è al 6% della frequenza!) E 0.005s è davvero un po 'piccolo per il tuo scopo. Tuttavia, se si desidera fornire una stima ogni 0,005 secondi, è comunque possibile elaborare fotogrammi sovrapposti più lunghi, come avviene normalmente nell'elaborazione vocale / musicale. È quello che vuoi veramente?

    NK=FSfK(21/B-1)
    BB=48fK=100Hzrichiedono finestre lunghe circa 0,7 secondi. Non c'è nulla da dire che perdiamo un po 'la risoluzione temporale ... Ma come detto in precedenza, questo è un problema solo se dimentichiamo la struttura del suono. Inoltre, la psicoacustica ritiene che al di sotto di 500Hz, gli umani non distinguano davvero così bene i sinusoidi: anche gli umani sono sfidati lì. Certo, possiamo sperare che i nostri computer possano fare meglio di noi, ma qui affrontiamo un problema difficile!

    Infine, si noti che esistono altri modi per calcolare una rappresentazione in frequenza temporale di un suono, ad esempio prendere in considerazione i banchi di filtri gammatone. Il vantaggio del CQT che ho citato in precedenza è che esiste un software sia per la trasformazione che per il suo invertito. Personalmente, mi attengo ancora allo STFT, per la sua semplicità e perché, finora, non ho mai avuto bisogno di una migliore risoluzione a basse frequenze, anche per la separazione delle sorgenti.

    [Schoerkhuber2010] Schoerkhuber, C. e Klapuri, A., "Cassetta degli attrezzi per la trasformazione di Constant-Q per l'elaborazione della musica", 7ª Conferenza di audio e musica, Barcellona, ​​Spagna, 2010.


Una piccola osservazione: il CQT potrebbe aiutare a risolvere i punti 1 e 2 di voi, ma non il punto 3. Per quanto riguarda il punto 3, c'è sempre un compromesso tra la risoluzione di tempo e frequenza e se si desidera una buona risoluzione di frequenza in basso componenti di frequenza, molto probabilmente è necessario accettare di perdere la risoluzione del tempo. Ora, per la stima del tono, potrebbero esserci altre soluzioni, potresti leggere la mia nella mia tesi di dottorato se sei interessato: D
Jean-louis Durrieu,

Non capisco bene. So che non ottieni nulla gratuitamente - non posso aspettarmi che un algoritmo rilevi accuratamente le frequenze che non sono state campionate a una buona risoluzione per almeno un paio di periodi della frequenza più bassa. Ma un campione di 0.1s a 44kHz è sufficiente per contenere una vasta gamma di frequenze, che un essere umano può distinguere accuratamente (in termini relativi - "ecco un 5 °", "c'è un 4 ° piatto diminuito", ecc.), Dimostrando le informazioni è lì da qualche parte. La FFT non è in grado di rilevare questo per le frequenze basse e alte, ma dici che altri algoritmi possono: qual è il compromesso?
Bryhoyt,

Di tutte le eccellenti risposte di cui sopra, il CQT sembra la misura più esatta per la domanda che stavo ponendo. Quali sono i compromessi? Più specificamente, quale livello di precisione della frequenza posso aspettarmi per una finestra ragionevolmente breve? (Capisco che la dimensione della finestra in CQT è variabile - quanto?) Ancora più specificamente, quanto vicino sarò in grado di arrivare al mio ca. obiettivo della differenza di frequenza dello 0,5% con una finestra di 0,005 s? (Questa è la mia stima approssimativa di quando un essere umano potrebbe iniziare a sentire qualcosa di stonato o fuori dal comune)
bryhoyt,

5

Innanzitutto, con il classico approccio di trasformata di Fourier a breve termine, ci sono alternative all'interpolazione - in particolare tecniche che fanno uso delle informazioni di fase per recuperare la frequenza istantanea ( Vedi questa domanda ) che può darti in modo molto preciso la posizione di un picco spettrale senza un aumento della dimensione FFT. Lo svantaggio, come hai giustamente detto, è che non stai aumentando la capacità del sistema di discriminare i picchi adiacenti, ma questo è già un grande miglioramento rispetto all'utilizzo della frequenza centrale dell'indice bin FFT.

SrFFT_Sioze

Esiste un altro approccio a forza bruta che funziona: "sondare" i tuoi segnali con esponenziale complesso con finestra (wavelet di Gabor). Questi sono caratterizzati da una frequenza centrale, un tempo centrale e una larghezza di banda (che misura il modo in cui l'onda viene diffusa nel tempo o sulla frequenza). Dovrai valutare molte, molte, molte correlazioni tra il tuo segnale e queste wavelet nel numero di offset, frequenze e larghezze di banda che desideri. Il risultato sarà lo stesso di una STFT "piastrellata" molto flessibile in cui è selezionata una dimensione della finestra ottimale per ogni intervallo di tempo e ciascuna banda di frequenza. Oltre al costo computazionale, il rovescio della medaglia è che non esiste un algoritmo efficiente e nessun algoritmo causale (sarà necessario conoscere in anticipo quanti campioni quanti siano le wavelet più lunghe nel dizionario). Se vuoi sperimentare queste tecniche,MPTK .

K

  • K
  • Funzionano bene in presenza di rumore bianco - questo richiede che il segnale sia sbiancato prima dell'analisi; anche l'esecuzione dell'analisi nei singoli canali di un banco di filtri aiuta.

Questi sono computazionalmente costosi, ma possono funzionare online, con finestre brevi se gli ordini dei modelli e / o il rumore sono bassi.


4

Frequenza o tono? Ci sono già tonnellate di articoli di ricerca e libri sulla percezione del tono umano. Ma, IIRC, gli umani tendono ad essere cattivi nel "estrarre" con precisione le frequenze a meno che non risultino un tono fondamentale. E i picchi di frequenza multipli all'interno di una "banda critica" tendono ad essere percepiti come rumore. Pertanto, qualsiasi metodo con "accuratezza quasi umana" potrebbe anche includere alcuni errori di stima percettiva umana.

Un FFT è solo un banco di filtri che non sono ottimali per molti scopi a meno che l'ortogonalità e l'invertibilità non siano requisiti. Altri banchi di filtri sono possibili se non si richiedono quei due (e la percezione umana chiaramente non lo fa), come un banco di filtri di frequenza MEL. Una volta che un picco di frequenza è identificato da un banco di filtri di frequenza MEL, un'ulteriore analisi mediante interpolazione FFT o tecniche di vocoder di fase potrebbe essere utile per affinare una stima della frequenza di qualsiasi picco di frequenza spettrale isolato.

Si noti che nessuna ulteriore informazione viene effettivamente raccolta da nessuna di queste tecniche di filtraggio utilizzate nello stesso arco di dati nel dominio del tempo, rispetto a una FFT. Ciò che sta accadendo potrebbe in realtà essere la perdita di informazioni per adattarsi meglio all '"inesattezza" o alle anomalie del sistema uditivo umano.

E la stima dell'intonazione da una serie di frequenze è un problema completamente diverso, di nuovo un argomento con molti articoli di ricerca e capitolo in libri di audiologia e simili.

L'ultima parte della tua domanda sulle prestazioni potrebbe essere un'aringa rossa. Oggi si possono fare dozzine di FFT e dozzine di diversi banchi di filtri in tempo reale su un processore per telefoni cellulari. Date le librerie FFT molto efficienti disponibili dai fornitori di CPU, una FFT con migliaia di bin "in eccesso" può essere più efficiente di un banco filtro significativamente più piccolo ma con codice più ingenuo.


Risposta molto istruttiva, grazie. Sono consapevole della differenza tra tono e frequenza, ma la tua risposta mi ha davvero aiutato a evidenziare quanta precisione umana dipende dal suono che soddisfa determinati requisiti. Risulta vero per la mia conoscenza dell'armonia che gli umani sono abbastanza cattivi nell'estrarre frequenze che non sono un tono fondamentale. Sono in grado di distinguere accuratamente gli intervalli sintonizzati l'uno dall'altro e dagli intervalli non accordati (intervalli consonanti più facilmente che dissonanti). Ma avrei difficoltà a distinguere due intervalli stonati (diversi da "flat", "very flat", "sharp", ecc.).
Bryhoyt,

2

Ci sono molte alternative, ma dipende da cosa stai facendo. Fisicamente, direi che le nostre orecchie sono più simili a una banca di filtri paralleli che a una FFT, che offre loro una buona risoluzione temporale e un processo chiamato "messa a fuoco" offre loro una buona risoluzione in frequenza. Quindi, in alcuni casi, si potrebbe teoricamente usare un banco di filtri, ma ciò richiede molta elaborazione che lascia molti dati da elaborare.

È possibile visualizzare le wavelet come un insieme di filtri particolarmente efficienti e correlati. Il problema con le wavelet per l'analisi musicale e audio è che in genere ti danno solo una risoluzione di ottava (anche se puoi fare varie cose al riguardo, non ho visto le wavelet essere particolarmente utili nell'audio).

Un altro approccio consiste nell'utilizzare finestre FFT sovrapposte. È possibile aumentare la risoluzione della frequenza della FFT osservando non solo le informazioni sulla grandezza, ma anche le informazioni sulla fase. Ciò ti consente di utilizzare finestre molto più brevi di quelle che potresti altrimenti utilizzare, il che si traduce in prestazioni migliori e una migliore risoluzione temporale. Le finestre sovrapposte sono difficili da ridimensionare correttamente e anche fare troppe ipotesi sulla fase può essere pericoloso. Comunque sia, questi tipi di trucchi sono probabilmente la base per risolvere complessi problemi di analisi tempo-frequenza.

Esistono numerosi altri strumenti anche per applicazioni specifiche.


1
Il calcolo della trasformata di Fourier a breve termine (STFT) equivale all'analisi del segnale con un banco di filtri. PermettereXnXKmwn
Xfm=ΣnXn+mwne-j2πnKN
NXnm
Xfm=ΣpXpwp-me-j2π(p-m)KN=ΣpXphm-p
hn=w-nej2πnKN

1
Gli STFT possono essere un banco di filtri, ma non tutti i banchi di filtri sono STFT.
Bjorn Roche,
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.