Trasformata logaritmica di Fourier (LFT) su segnale audio


9

Sto cercando di analizzare le musiche il più precisamente possibile. Ovviamente ho provato FFT, ma ho avuto dei problemi.

Ho scoperto che le basse frequenze hanno una risoluzione molto bassa rispetto all'udito umano. Ho provato molto tempo FFT a risolvere questo problema, ma anche analizzando con 8192 campioni / s con frequenza di campionamento di 44100Hz (significa mancanza di risoluzione temporale), non ho ottenuto una risoluzione sufficiente sulle basse frequenze.

Ho scoperto che ci sono alcune soluzioni.

In primo luogo, un'interpolazione quadratica sui contenitori FFT.
Ma non sembra un modo perfetto. I problemi di questo metodo sono:

1. "Se voglio determinare le freq tra i bin di freq, quali tre bin dovrei selezionare per fare un'interpolazione?"
2. 'Anche se lo faccio, non ci sono ulteriori informazioni sul risultato. So che le interpolazioni sono una specie di metodo complicato. '

In secondo luogo, estraendo i bin di ogni freq con la frequenza desiderata, in modo da poter estrarre logicamente i bin.
Ma hai un grave problema di costo computazionale: (forse finito) N ^ 2.

In terzo luogo, LFT (Logarithmic Fourier Transform).
Ciò richiede campioni spaziati logaritmicamente e mi dà il risultato esattamente quello che sto cercando con una velocità incredibilmente veloce; /programming/1120422/is-there-an-fft-that-uses-a-logarithmic-division-of-frequency

Ma non ho idea di questo algoritmo. Ho cercato di capire il documento e di implementarlo, ma era impossibile a causa della mancanza delle mie abilità matematiche e inglesi.

Quindi, ho bisogno di un aiuto per l'implementazione di LFT.

Risposte:


8

La soluzione più semplice e pragmatica è utilizzare una FFT normale di dimensioni sufficientemente grandi da ottenere la risoluzione richiesta alla frequenza di interesse più bassa. Ad esempio, se si desidera una risoluzione di 1 Hz alla frequenza di interesse più bassa, è necessario disporre di una finestra FFT da 1 secondo, ovvero la dimensione FFT dovrebbe essere uguale alla frequenza di campionamento, ad esempio 44100.

Si noti che anche se si potesse implementare una FFT logaritmica, sarebbe comunque vincolata dalle leggi della fisica (teoria dell'informazione) e si avrebbe comunque bisogno di una finestra di esempio di lunghezza simile - tutto ciò che si otterrebbe sarebbe convenienza (non dover aggregare i contenitori di output ) a scapito della prestazione.


È strano. So che teoricamente non ci sono più dati. Se uso una FFT di grandi dimensioni, è vero che non è in grado di analizzare insiemi molto veloci di strumenti musicali. Ed è anche vero che non sono in grado di ottenere una risoluzione più elevata a bassa frequenza. Ma per quanto riguarda il sistema uditivo umano? In che modo quel sistema sta ottenendo una risoluzione maggiore sia nel tempo che nelle frequenze?

3
Forse dovresti prendere in considerazione un approccio gerarchico, in cui decimali ogni ottava successiva di un fattore 2, in modo da poter usare finestre temporali brevi a frequenze più alte e finestre temporali più lunghe a frequenze più basse? Ciò sarebbe in qualche modo analogo a un banco di filtri uditivi, in cui la larghezza di banda aumenta con la frequenza.
Paul R,

Ottimo approccio Goertzel a lungo su basse frequenze, goertzel a breve su alte frequenze? Ha senso. Ma richiederà grandi costi di calcolo.

Probabilmente è più efficiente che fare un grande FFT, anche se è più complesso. Ad esempio, per una gerarchia di 4 ottave potresti voler utilizzare 4 FFT a 2048 punti e 3 filtri passa-basso per il down-sampling x2. La risoluzione del FFT più basso sarà pari a un singolo FFT a 16384 punti alla frequenza di campionamento completa, ma poiché FFT è O (n log n) il costo computazionale totale sarà molto più basso.
Paul R,

aha, FFT 2048, giù campione x2, FFT 2048, giù campione x2 .... di quanto io abbia sia la risoluzione di tempo che di frequenza, con costi molto inferiori rispetto a 16384 FFT. Grande. E proprio ora ho un'altra soluzione: sul campione 16384, goertzel ogni volta per 32. Quindi, con l'accumulo, posso estrarre sia le basse che le alte frequenze con costi minori. Molte grazie. :)

0

Se l'analisi che si intende eseguire richiede la frequenza dei segnali in ciascun bin, è possibile utilizzare la Trasformata di Fourier a breve termine per raggiungere questo obiettivo.

Ogni bin dell'FFT produce un numero complesso che rappresenta il componente reale e immaginario o dopo un po 'di fase di manipolazione e grandezza.

Come frequenza = dPhi / dt, (Phi == fase), prendendo i bin corrispondenti dalle coppie di spettri STFT consecutivi, è possibile calcolare la frequenza.

DSP Dimension ha un buon articolo sul processo.


Sembra che stia contemplando un ulteriore problema più complesso. Posso usare FFT, ma sull'analisi del segnale audio non è adatto, però.

3
Guarda la versione "costante Q" della trasformata di Fourier di Short Time. Questa disposizione della STFT fornisce una risoluzione di frequenza che si regola logaritmicamente per soddisfare i requisiti per diversi intervalli di frequenza.
user2718

Darò un'occhiata. Ho pensato che fosse solo una semplice operazione di trasformazione del filtro-bank applicata al risultato fft.
Laie,
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.