Ho bisogno di aiuto per comprendere l'output del calcolo DFT / FFT.
Sono un ingegnere informatico esperto e ho bisogno di interpretare alcune letture dell'accelerometro dello smartphone, come trovare le frequenze principali. Sfortunatamente, ho dormito per la maggior parte delle mie lezioni di EE al college quindici anni fa, ma ho letto su DFT e FFT negli ultimi giorni (con scarso successo, a quanto pare).
Per favore, nessuna risposta di "vai a prendere una lezione di EE". In realtà ho intenzione di farlo se il mio datore di lavoro mi pagherà. :)
Ecco il mio problema:
Ho catturato un segnale a 32 Hz. Ecco un campione di 1 secondo di 32 punti, che ho tracciato in Excel.
Ho quindi ricevuto del codice FFT scritto in Java dalla Columbia University (dopo aver seguito i suggerimenti in un post su " FFT affidabile e veloce in Java ").
L'output di questo programma è il seguente. Credo che stia eseguendo una FFT sul posto, quindi riutilizza lo stesso buffer sia per l'input che per l'output.
Before:
Re: [0.887 1.645 2.005 1.069 1.069 0.69 1.046 1.847 0.808 0.617 0.792 1.384 1.782 0.925 0.751 0.858 0.915 1.006 0.985 0.97 1.075 1.183 1.408 1.575 1.556 1.282 1.06 1.061 1.283 1.701 1.101 0.702 ]
Im: [0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ]
After:
Re: [37.054 1.774 -1.075 1.451 -0.653 -0.253 -1.686 -3.602 0.226 0.374 -0.194 -0.312 -1.432 0.429 0.709 -0.085 0.0090 -0.085 0.709 0.429 -1.432 -0.312 -0.194 0.374 0.226 -3.602 -1.686 -0.253 -0.653 1.451 -1.075 1.774 ]
Im: [0.0 1.474 -0.238 -2.026 -0.22 -0.24 -5.009 -1.398 0.416 -1.251 -0.708 -0.713 0.851 1.882 0.379 0.021 0.0 -0.021 -0.379 -1.882 -0.851 0.713 0.708 1.251 -0.416 1.398 5.009 0.24 0.22 2.026 0.238 -1.474 ]
Quindi, a questo punto, non posso creare testa o croce con l'output. Comprendo i concetti DFT, come la parte reale essendo le ampiezze delle onde del coseno componenti e la parte immaginaria essendo le ampiezze delle onde sinusoidali componenti. Posso anche seguire questo diagramma dal grande libro " The Scientist and Engineer's Guide to Digital Signal Processing ":
Quindi le mie domande specifiche sono:
Dall'uscita della FFT, come trovo le "frequenze più ricorrenti"? Questo fa parte della mia analisi dei dati del mio accelerometro. Devo leggere gli array reali (coseno) o immaginari (seno)?
Ho un input di 32 punti nel dominio del tempo. L'output della FFT non dovrebbe essere un array a 16 elementi per i reali e un array a 16 elementi per l'immaginario? Perché il programma mi fornisce output di array reali e immaginari entrambi di dimensione 32?
In relazione alla domanda precedente, come si analizzano gli indici negli array di output? Dato il mio input di 32 campioni campionati a 32 Hz, la mia comprensione è che un'uscita di matrice a 16 elementi dovrebbe avere il suo indice distribuito uniformemente fino a metà della frequenza di campionamento (di 32 Hz), quindi ho ragione nel capire che ogni elemento della matrice rappresenta (32 Hz * 1/2) / 16 = 1 Hz?
Perché l'uscita FFT ha valori negativi? Ho pensato che i valori rappresentassero le ampiezze di una sinusoide. Ad esempio, l'uscita di Real [3] = -1,075 dovrebbe significare un'ampiezza di -1,075 per un'onda coseno di frequenza 3. È esatto? Come può un'ampiezza essere negativa?