Come controllare i risultati FFT di un'onda sinusoidale?


9

Mi è stato dato un file audio (sinusoidale) 1000Hz come input per il mio algoritmo FFT. Ho 8192 campioni di spettro di potenza in un array.

Qual è il modo migliore e più semplice per verificare se il mio output è giusto o sbagliato?

Se do un file audio silenzioso, l'output è zero per tutti i campioni. In un'onda sinusoidale l'o / p aumenta da 20 (0 ° campione) a 26059811 (743 ° campione) e diminuisce gradualmente a 40.

Se mi viene un'idea della gamma di output, posso dimostrare tecnicamente se la FFT funziona.

Qualsiasi idea sarebbe utile.

Fare riferimento a questo link per eventuali dubbi tecnici.


1
puoi tracciare il tuo array? (forse in un software per fogli di calcolo?)

Ci sono 8192 valori nell'array.Vuoi che io tracci un diagramma manualmente o che il foglio di calcolo lo gestisca. Sto lavorando su MAC

2
Ho tracciato decine di migliaia di campioni in MS Excel; Anche Gnumeric o un altro sono adatti. O anche gnuplot.

Non dimenticare l'ufficio aperto
Nome falso

@Fake Name: non sono in grado di tracciare il grafico ..

Risposte:


4

Sembra che tu stia calcolando lo spettro facendo una media di 10 finestre (non sovrapposte?) Per ottenere la magnitudine quadrata alle frequenze 8192 o 8193 (da 0 a Nyquist, ma alcuni algoritmi potrebbero far cadere la frequenza di Nyquist nel cestino 8192).

La prima cosa da verificare è che il picco sia nel cestino giusto. Non hai detto quale sia la frequenza di campionamento, ma il cestino 743 sarebbe 743/16384 volte la frequenza di campionamento. Se il segnale è veramente a 800 Hz, questo porta Fs a circa 17640 campioni / secondo. Sembra sbagliato. Il segnale di test dovrebbe essere probabilmente a una frequenza standard come 8000, 16000, 22050, 32000, 44100 o 48000. Per Fs = 22050, il picco sarebbe nettamente nel cestino 800/22050 * 16384 = 594.

Un altro criterio da verificare è che l'energia totale nel segnale sia approssimativamente la stessa nei domini di tempo e frequenza. Ecco un esempio in Python:

In [1]: NFFT = 2048; N = 10*NFFT; n = arange(N); Fs = 22050
In [2]: x = 0.4*cos(2*pi*400/Fs*n) + 0.6*cos(2*pi*800/Fs*n)

In [3]: y,freqs = psd(x, NFFT=NFFT, Fs=Fs, pad_to=16384)  # PSD by Welch's Method

In [4]: sum(x**2)/Fs           # time-domain energy
Out[4]: 0.24149869319296949
In [5]: sum(y) * N/16384       # frequency-domain energy
Out[5]: 0.24148752834391252

Il segnale di ingresso x, che consiste di due sinusoidi campionati a Fs = 22050 campioni / secondo, è segmentato in 10 finestre non sovrapposte di dimensioni NFFT = 2048 campioni. La chiamata a psd (densità spettrale di potenza) calcola lo spettro y come la media della grandezza al quadrato di dieci DFT a 16384 punti (in realtà sono 8193 punti poiché x è valutato in modo reale).

L'energia calcolata nel dominio della frequenza ha un fattore di ridimensionamento di N / 16384 perché la funzione psd ha ridimensionato y alla dimensione DFT anziché alla lunghezza totale del segnale. Se questo è un problema dipende dal modo in cui il tuo sistema gestisce la normalizzazione del PSD. Un'altra normalizzazione opzionale è il ridimensionamento di 1 / Fs. Questo abbina l'energia al segnale analogico originale. Le normalizzazioni predefinite dovrebbero essere ben documentate nella libreria.


Ho testato il mio segnale sinusoidale a 1000 Hz. Il mio FFT dà la risposta giusta. Grazie per l'aiuto.

10

Devi tracciare la grandezza dell'output di FFT. Non ho familiarità con il tuo linguaggio di programmazione, ma in Python useresti qualcosa del genere plot(abs(fft(a))). Per un input silenzioso, l'output dovrebbe essere tutti zeri. Per un input sinusoidale, dovresti vedere due picchi:

testo alternativo

Per un segnale reale, i picchi saranno simmetrici da sinistra a destra. Se stai realizzando una vera FFT , tuttavia (che è più efficiente dal punto di vista computazionale) otterrai solo la metà sinistra della trama come output, poiché ignora l'immagine speculare ridondante.

Se la frequenza è più alta, i picchi saranno più vicini al centro. Se la frequenza è perfettamente in sincronia con la dimensione del pezzo , il picco sarà largo solo un punto e tutto il resto sarà esattamente 0. Altrimenti avrà una "gonna" affusolata come sopra.


Intendi il valore dello spettro di potenza come ampiezza?

t -> con riferimento al tempo?

Non preoccuparti del tempo. Se stai solo verificando se la FFT funziona, tutto ciò che devi fare è verificare che la forma della grandezza sia simile a questa.
endolith,

Non sono in grado di tracciare comunque la mia FFT funziona bene. Cercherò sicuramente di implementare il grafico nel mio tempo libero. Grazie mille.

1
@clabacchio: Oh. La FFT produce un output con l'asse f = 0 all'inizio e alla fine del diagramma. Il punto medio del diagramma è l'asse f = fs / 2. C'è spesso una funzione fftfreq o fftshift per riorganizzare il diagramma in modo che la frequenza 0 sia al centro. flic.kr/p/arVeZT
endolith

0

Ho usato lo strumento di analisi di Fourier all'interno di Excel Analysis Toolpak per fare un rapido controllo su dati e risultati.


Sto lavorando su MAC.

@Warrior - Quindi usa MacPorts o Fink per installare Gnumeric (vedi anche questa pagina per alcune informazioni su un wrapper Platypus se lo desideri)
Kevin Vermeer,
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.