Domanda

Sto usando JTransForms Java Library per eseguire analisi su un dato set di dati.

Un esempio dei dati è il seguente:

980,988,1160,1080,928,1068,1156,1152,1176,1264
.

Sto usando la funzione DoubleFFT_1D in jtransforms. L'output dei dati è il seguente:

10952, -152, 80.052, 379.936, -307.691, 12.734, -224.052, 427.607, -48.308, 81.472
.

Ho problemi a interpretare l'output. Capisco che il primo elemento nell'array di output è il totale dei 10 ingressi (10952). È

Gli altri elementi dell'array di output che non capisco. In definitiva, voglio tracciare la densità spettrale di potenza dei dati di input su un grafico e trovare importi tra 0 e .5 Hz.

La documentazione per le funzioni JTransform afferma (dove A è il set di dati):

.

public void realForward(double[] a) calcola 1D Avanti DFT di reale dati che lasciano il risultato in a. Il layout fisico dei dati di uscita è il seguente:

Se n è anche allora

a[2*k] = Re[k], 0 <= k < n / 2
a[2*k+1] = Im[k], 0 < k < n / 2
a[1] = Re[n/2]
.

Se n è dispari,

a[2*k] = Re[k], 0 <= k < (n+1)/2
a[2*k+1] = Im[k], 0 < k< (n-1)/2
a[1] = Im[(n-1)/2]
.

Questo metodo calcola solo la metà degli elementi della trasformazione reale. L'altra metà soddisfa la condizione di simmetria. Se vuoi il pieno Vero trasformazione in avanti, usa realforwardfull. Per rimediare ai dati originali, Utilizzare RealInVerse sull'uscita di questo metodo.

Parametri: A - Dati da trasformare

Ora usando i metodi sopra: (Poiché la lunghezza del mio array di dati è 10, vengono utilizzati i metodi "n è pari")

Re[0] = 10952
Re[1] = 80.052
Re[2] = -307.691
Re[3] = -224.052
Re[4] = -48.308
Re[5] = 12.734

Im[0] = -152
Im[1] = 379.936
Im[2] = 12.734
Im[3] = 427.607
Im[4] = 81.472
.

Quindi alcune domande: Questa uscita sembra corretta? Mi sembra che il [0] non dovrebbe essere 10952 che è la somma di tutti gli elementi nell'array originale.

Sembra che l'uscita dovrebbe essere leggermente corretta: (sono sbagliato?)

Re[0] = 80.052
Re[1] = -307.691
Re[2] = -224.052
Re[3] = -48.308
Re[4] = -152

Im[0] = 379.936
Im[1] = 12.734
Im[2] = 427.607
Im[3] = 81.472
.

Ora usando il seguente metodo pubblicato nel forum:

Per ottenere la grandezza di Bin K è necessario calcolare sqrt(re * re + im * im), dove RE, IM sono i componenti reali e immaginari nell'uscita FFT per Bin K.

per il tuo particolare re[k] = a[2*k] and im[k] = a[2*k+1] FFT. Pertanto per calcolare lo spettro di potenza:

for k in 0 to N/2 - 1
{
    spectrum[k] = sqrt(sqr(a[2*k]) + sqr(a[2*k+1]))
}
.

Così:

spectrum[0] = 388.278
spectrum[1] = 307.955
spectrum[2] = 482.75
spectrum[3] = 94.717
.

Alcune domande. Questi dati sembrano corretti? Sono sulla strada giusta? Questi dati di spettro dovrebbero quindi tracciare qualcosa del genere:

388.278 at .125 Hz
307.955 at .25 Hz
482.75 at .375 Hz
94.717 at .5 Hz
.

Sono lontano? Il mio obiettivo è produrre un grafico a barre di densità spettrale di potenza da 0 a .5Hz

È stato utile?

Soluzione

Penso che sia necessario interpretare i dati di output come segue:

10952       Re[0] = sum of all inputs = DC component
 -152       Re[5] - see note about a[1] being special - there is no Im[0]
   80.052   Re[1]
  379.936   Im[1]
 -307.691   Re[2]
   12.734   Im[2]
 -224.052   Re[3]
  427.607   Im[3]
  -48.308   Re[4]
   81.472   Im[4]
.

Le magnitudini sono quindi:

spectrum[0] = 10952
spectrum[1] = sqrt(80.052^2 + 379.936^2) = 388.278
spectrum[2] = sqrt(-307.691^2 + 12.734^2) = 307.427
spectrum[3] = sqrt(-224.052^2 + 427.607^2) = 482.749
spectrum[4] = sqrt(-48.308^2 + 81.472^2) = 94.717
.

[Ci dispiace per esserci due risposte separate da me ora - Penso che due domande correlate siano state fuse mentre stavo lavorando alla nuova risposta]

Altri suggerimenti

Ogni voce nella trasformazione rappresenta la grandezza (complessa) della frequenza nel campione.

La densità di potenza in una data frequenza è solo la grandezza della complessa ampiezza della trasformata in quella frequenza.La grandezza di un numero complesso è calcolata dai suoi componenti e non dovresti avere un problema ottenere questo

Ogni colonna rappresenta ampiezze per aumentare le frequenze, a partire da 0 (la prima voce), quindi 2 pi / t (dove t è la lunghezza del tuo campione), fino all'ultimo campione 2 * pi * n / t (dove nè il numero di campioni)

Ci sono altre convenzioni in cui la trasformazione viene restituita per la frequenza -pi * n / t fino a PI * N / T e il componente di frequenza 0 è al centro dell'array

Spero che questo aiuti

Per ottenere la grandezza di Bin K è necessario calcolare SQRT (RE * RE + IM * IM), Whire Re, IM sono i componenti reali e immaginari nell'uscita FFT per Bin K.

Per il tuo particolare generacolo di generazione FFT e re[k] = a[2*k].Pertanto per calcolare lo spettro di potenza:

for k in 0 to N/2 - 1
  spectrum[k] = sqrt(sqr(a[2*k]) + sqr(a[2*k+1]))
.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top