Come analizzare correttamente l'ingresso / spettro audio


9

Sono abbastanza nuovo su Java e Signal Processing, ma mi è stato assegnato un progetto che si occupa di elaborazione audio. Il mio argomento che mi è stato dato è un gioco che ha una componente di analisi di una canzone (una determinata canzone) e produce dati a seconda della frequenza attualmente in riproduzione (tempo reale). cioè: mentre il brano suona, emette la frequenza corrente (ogni secondo emette la frequenza corrente).

Mi è stato detto su stackoverflow di usare FFT. dicono "basta fare una FFT" ma questo non significa niente per me? COME si fa una FFT? Ho letto tutorial e in pratica capisco di cosa si tratta, ma non ho idea di come implementarlo come in:

  • qual è il tipo di dati del file audio più adatto a tale elaborazione?
  • qual è esattamente l'input della FFT
  • come interpreto i risultati

Qualcuno può suggerire una semplice guida / tutorial da seguire su come elaborare un segnale audio? Inoltre, se qualcuno conosce una buona implementazione di FFT per Java, apprezzerei i suggerimenti.


2
Questa domanda sembra fuori tema perché si tratta di array Java di base, tipi di dati e file di lettura.
hotpaw2,

1
Dissero che dovevo chiedere qui perché ha a che fare con l'elaborazione del segnale
user3241507,

Solo l'ultima parte della tua domanda sembra riguardare DSP. Prova a rimuovere le prime 2 o 3 parti per essere in argomento qui.
hotpaw2,

Risposte:


8

Vediamo. Non ho idea delle classi Java o del tipo di supporto che ha per l'elaborazione del segnale, ma ti darò alcune linee guida. I dettagli particolari dell'implementazione nella lingua, devi capire.

Per eseguire qualsiasi tipo di elaborazione su un file audio sono necessari i dati "grezzi", ovvero un file audio che contiene campioni audio non compressi. Ad esempio, il formato WAV, che normalmente ha campioni nel complemento a 2 bit firmato 2 bit.

Se hai intenzione di utilizzare un computer e di eseguire l'elaborazione offline, potrebbe essere una buona idea trasmettere quel valore a un doppio (che nella maggior parte dei processori oggi significa numero a virgola mobile a 64 bit).

Pertanto avrai un flusso continuo di doppi numeri provenienti dal file. Quindi è necessario definire un modo per gestire i dati continui. Un modo standard, molto utilizzato è quello di utilizzare un buffer circolare (anche se non è in linea, presumo che tu voglia il tuo codice per essere efficiente e caricare l'intero file in memoria poiché un array non è la soluzione migliore). O quello o solo un normale buffer, è la tua scelta. La lunghezza del buffer dovrebbe essere una potenza di 2 (fare per l'efficienza dell'algoritmo Cooley-Tukey radix-2).

Ora devi fare l'effettiva FFT. Questa è semplicemente una moltiplicazione del buffer (che matematicamente è un vettore) per la matrice FFT. Come questa operazione venga effettivamente eseguita in Java, non ne ho idea. In C sarebbe solo passare il puntatore all'array e la lunghezza a una routine FFT che, o restituisce un puntatore alla memoria allocata dinamicamente, o lascia il risultato in un array che gli si passa.

infine, si arriva a una matrice di numeri complessi M (Supponendo che la lunghezza della matrice / buffer / vettore con il segnale sia M). E poi fai quello che vuoi con esso.

Ad esempio, potresti prendere la grandezza di ciascuno dei numeri complessi e trovare il massimo per rilevare dove potrebbe trovarsi la frequenza fondamentale (anche se molto approssimativa).

Extra: tecniche più avanzate da elaborare includono un pre-windowing per evitare perdite, facendo zero-padding per ottenere una maggiore risoluzione sullo spettro con finestre, ecc.

Spero che sia d'aiuto.


5

Se sei abbastanza bravo con JAVApuoi usare JTRANSFORMS una libreria java per la FFTquale potrebbe esserti di aiuto

e secondo le tue necessità sembra un

inserisci qui la descrizione dell'immagine

Visualizzazione musicale tramite l'API Java Sound

Visualizzazione musicale utilizzando FFT in Ruby in 7 passi

puoi seguire questi semplici passaggi secondo le tue esigenze:

* Abituati ad alcuni termini audio

1. Leggi il Playing Frame (diciamo 20-30ms), la dimensione del tuo frame dipende dal tuo sampling ratesupponiamo che stai usando una frequenza di campionamento 8000 e ogni campione è 16bit signed little endian, quindi il tuo frame di 20ms sarà di 160 campioni

Nota: provare a riprodurre un rawfile non un mp3file compresso .

2.Prendi il frame di dati grezzi ed esegui a FFT

3. Eseguire correttamente Windowing

4.Il tuo risultato FFT in uscita avrà due componenti reali e complessi, prova a trarne un diagramma di grandezza che è solo il absolutevalore del componente complesso, il tuo picco ti dà ildominant frequency

5. Dai un'occhiata a semplici tutorial come di seguito

Buon tutorial su FFT

Guida per gli ingegneri di FFT

Tutorial FFT

Panoramica di FFT

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.