2013-08-09 10 views
6

NOTA: questo non è un duplicato, ho requisiti specifici oltre alle domande correlate.Come faccio a tracciare lo spettro di un file wav usando FFT?

Per iniziare, voglio tracciare lo spettro di un file audio (.wav) proprio come fa l'audacity (simile: How to draw a frequency spectrum from a Fourier transform).

Finora sono in grado di leggere e scrivere file wav. Ma il mio problema è che non so esattamente quali valori devo passare alla funzione FFT. Dal modo in cui sto usando Exocortex per FFT in C#. La funzione FFT richiede che io passi una serie di numeri complessi con le giuste dimensioni (512, 1024, ... presumo), un parametro intero opzionale per la lunghezza e la direzione del fourier (avanti/indietro).

Domande specifiche:

  1. Il Complesso (classe) dalla libreria Exocortex ha due valori e cioè reali e immaginari. Ho la matrice di campioni, quindi quale dovrebbe essere reale e quale dovrebbe essere immaginaria?
  2. Ho il file wav, quindi la variabile deve essere assunta. Come posso passare alla funzione FFT? Dovrei selezionare una dimensione (512/1024/etc), dividere l'intero campione alla dimensione, quindi passare tutto alla FFT?
  3. Come faccio a sapere quali frequenze devono essere elencati in giù sul asse x?
  4. Come si tracciano i dati di FFT? (Voglio che l'asse x sia la frequenza e l'asse y in decibel)

Se non ottieni ciò che intendo, prova ad utilizzare Audacity, importa un file audio, quindi fai clic su Analizza> Traccia Spettro. Quelle sono le cose che vogliono ricreare. Per favore rispondi alla mia domanda in dettaglio perché voglio davvero imparare questo. Ho solo un piccolo background su questo. Sono solo un principiante nell'elaborazione del segnale digitale. Inoltre, per quanto possibile, non indirizzarmi verso altri siti FFT perché non rispondono specificamente alla mia domanda.


EDIT:

Ho fatto qualche lettura e scoperto come FFT un dati audio, ma solo in potenze di 2. Quindi, come faccio a fare lo stesso in un file audio con una lunghezza che è non di poteri di 2? Secondo alcuni ho bisogno di usare "finestra". Ho anche fatto qualche ricerca al riguardo e ho scoperto che serve solo una parte della forma d'onda per essere elaborata in seguito. Ricorda sopra che voglio ottenere la FFT del file audio non una parte di esso. Quindi cosa dovrei fare ora? Si prega di aiutare :(

+0

Stai parlando di questo http://sourceforge.net/projects/exocortexdsp/?source=navbar? – Vadim

+0

Per quanto riguarda la nota: 1. Stai chiedendo troppo per una singola domanda. Questo è più materiale per la matematica e otterrai risposte molto migliori (e più) nei forum dedicati. 2. Se i tuoi file contengono un numero di campioni che non è una potenza di due, devi riempirlo con zeri per rendere le sue dimensioni una potenza di due. Questa è una limitazione di FFT. 3. Fondamentalmente si utilizza una finestra per eseguire la FFT su una parte dei dati (se questo è ciò che è necessario). Ma va molto più in profondità, ci sono finestre differenti con effetti diversi. – Vadim

+0

Quello che stai cercando di generare è chiamato [spettrogramma] (http://en.wikipedia.org/wiki/Spectrogram). Sarebbe meglio chiedere come tracciare uno spettrogramma piuttosto che chiedere dello spettro. –

risposta

6

La firma è

public static void FFT(float[] data, int length, FourierDirection direction) 
  1. Si passa una matrice di numeri complessi, rappresentati come coppie. Dal momento che hai solo numeri reali (i campioni), si dovrebbe mettere i campioni in anche posizioni nell'array - dati [0], dati [2], dati [4] e così via. Le posizioni dispari dovrebbero essere 0, dati [1] = dati [3] = 0 ...
  2. La lunghezza è la quantità di campioni su cui vuoi calcolare la tua FFT dovrebbe essere esattamente metà della lunghezza dell'array di dati. Puoi FFT tutto il tuo WAV o parti di esso - dipende da ciò che desideri vedere. traccia lo spettro di potenza della parte selezionata del file, se vuoi fare lo stesso, passa l'intero WAV o le parti selezionate.
  3. FFT solo vi mostrerà le frequenze fino alla metà della frequenza di campionamento. Quindi dovresti avere valori tra 0 e metà della frequenza di campionamento.La quantità di valori dipende dalla quantità di campioni che hai (la quantità di campioni influenzerà la precisione del calcolo)
  4. Audacity traccia lo spettro di potenza. Dovresti prendere ogni coppia di numeri complessi nell'array che ricevi e calcolare il suo ABS. ABS è definito come sqrt (r^2 + i^2). Ogni valore ABS corrisponderà a una singola frequenza.

Ecco un esempio di un codice di lavoro:

float[] data = new float[8]; 
data[0] = 1; data[2] = 1; data[4] = 1; data[6] = 1; 
Fourier.FFT(data, data.Length/2, FourierDirection.Forward); 

Sto dando 4 campioni, tutti uguali. Quindi mi aspetto di ottenere qualcosa solo alla frequenza 0. E infatti, dopo averlo eseguito, ottengo

dati [0] == 1, dati [2] == 1, dati [4] == 1, dati [ 6] == 1

E altri sono 0.

Se voglio usare il sovraccarico complessa di array

Complex[] data2 = new Complex[4]; 
data2[0] = new Complex(1,0); 
data2[1] = new Complex(1, 0); 
data2[2] = new Complex(1, 0); 
data2[3] = new Complex(1, 0); 
Fourier.FFT(data2,data2.Length,FourierDirection.Forward); 

si prega di notare che qui il secondo parametro è uguale alla lunghezza della matrice, dal momento che ogni il membro dell'array è un numero complesso. Ottengo lo stesso risultato di prima.

Penso di aver mancato prima il sovraccarico complesso. Mi sembra meno incline agli errori e più naturale da usare, a meno che i tuoi dati non siano già in coppia.

+2

non è necessario per 'Abs()' quando si calcola una radice quadrata. Il risultato di 'sort()' non è mai negativo. – marko

+0

Naturalmente. Il mio fraseggio era probabilmente sbagliato. Intendevo dire che doveva calcolare l'ABS e che il sqrt era il modo per calcolarlo. Non volevo dire che hai bisogno di applicare un altro addominale. Modificherò la mia risposta. Grazie. – Vadim

+1

Ovviamente intendevo 'sqrt()' lì - colpa della correzione automatica! – marko

Problemi correlati