2015-07-27 17 views
6

Guardando questa risposta: Python Scipy FFT wav filesPerché dovrei scartare la metà di quanto ritorna un FFT?

La parte tecnica è evidente e di lavoro, ma ho due questioni teoriche (il codice di cui è al di sotto):

1) Perché devo normalizzato (b=...) i telai? Cosa succederebbe se usassi i dati grezzi?

2) Perché dovrei utilizzare solo la metà del risultato FFT (d=...)?

3) Perché dovrei ottenere il risultato FFT abs(c)?

Forse mi manca qualcosa a causa di una comprensione inadeguata del formato WAV o FFT, ma mentre questo codice funziona bene, sarei felice di capire perché funziona e come sfruttarlo al meglio.

Edit: in risposta al commento di @Trilarion:

Sto cercando di scrivere un semplice, non accurato al 100%, ma più come un proof-of-concept Speaker Diarisation in Python. Ciò significa prendere un file wav (in questo momento sto usando this one per i miei test) e in ogni secondo (o qualsiasi altra risoluzione) dire se l'oratore è la persona numero 1 o persona numero 2. So in anticipo che queste sono 2 persone e non sto cercando di collegarle a qualsiasi firma vocale nota, solo per separarle. In questo momento prendi ogni secondo, FFT (e quindi ottieni un elenco di frequenze), e raggruppale usando KMean con il numero di cluster tra 2 e 4 (A, B [, Silenzio [, A + B]]).

Sono ancora nuovo nell'analisi di file wav e audio in generale.

import matplotlib.pyplot as plt 
from scipy.io import wavfile # get the api 
fs, data = wavfile.read('test.wav') # load the data 
a = data.T[0] # this is a two channel soundtrack, I get the first track 
b=[(ele/2**8.)*2-1 for ele in a] # this is 8-bit track, b is now normalized on [-1,1) 
c = sfft.fft(b) # create a list of complex number 
d = len(c)/2 # you only need half of the fft list 
plt.plot(abs(c[:(d-1)]),'r') 
plt.show() 
+1

Per i principianti, è possibile leggere [questo] (http://mathworks.com/help/matlab/math/fast-fourier-transform-fft.html). – mkrieger1

+1

Per quanto riguarda (2): assomiglia ai tagli di risposta originali dei termini di frequenza negativa e utilizza solo i termini di frequenza positiva. Per un segnale audio quelli dovrebbero essere ridondanti. – dhke

+1

Per favore, fai una vera domanda. Perché dovresti fare qualcosa dipende ovviamente da ciò che vuoi ottenere. Poiché è questa domanda non è chiara e quindi non utile tranne per te. Le risposte sono molto generose nello spiegare le conoscenze dietro le trasformazioni di Fourier, ma non possono mai rispondere perché dovresti farlo. – Trilarion

risposta

6

Per affrontare questi in ordine:

1) Non c'è bisogno di normalizzare, ma la normalizzazione ingresso è vicino alla struttura grezza della forma d'onda digitalizzata così i numeri sono poco intuitivo. Ad esempio, quanto è alto il valore di 67? È più facile normalizzarlo nell'intervallo da -1 a 1 per interpretare i valori. (Ma se volevi implementare un filtro, ad esempio, dove hai fatto un FFT, modificato i valori FFT, seguito da un IFFT, normalizzare sarebbe una seccatura inutile.)

2) e 3) sono simili in quello entrambi hanno a che fare con la matematica che vive principalmente nello spazio dei numeri complessi. Cioè, FFT prende una forma d'onda di numeri complessi (ad esempio, [.5 + .1j, .4 + .7j, .4 + .6j, ...]) in un'altra sequenza di numeri complessi.

Così in dettaglio:

2) Si scopre che se la forma d'onda di ingresso è reale anziché complesso, quindi la FFT ha una simmetria circa 0, quindi solo i valori che hanno una frequenza> = 0 sono univocamente interessante.

3) I valori emessi dalla FFT sono complessi, quindi hanno una parte Re e Im, ma possono anche essere espressi come grandezza e fase. Per i segnali audio, di solito è la grandezza più interessante, perché questo è principalmente ciò che ascoltiamo. Pertanto le persone usano spesso abs (che è la grandezza), ma la fase può essere importante anche per diversi problemi.

0

Dipende da cosa stai cercando di fare. Sembra che tu stia cercando di tracciare la densità spettrale e quindi è OK farlo.

In generale, il coefficiente nella DFT dipende dalla fase di ciascuna frequenza, quindi se si desidera mantenere le informazioni sulla fase è necessario mantenere l'argomento dei numeri complessi.

La simmetria che si vede è garantita solo se l'ingresso è una sequenza numerata reale (IIRC). È correlato alla distorsione di mirroring che si ottiene se si hanno frequenze superiori alla frequenza di Nyquist (metà della frequenza di campionamento), la frequenza originale viene visualizzata nella DFT, ma anche la frequenza speculare.

Se si sta andando a DFT inverso si dovrebbero mantenere i dati completi e anche mantenere gli argomenti dei coefficienti DFT.