2011-02-15 2 views
10

J'utilise la bibliothèque jtransforms java pour effectuer une analyse sur un ensemble de données donné.Densité spectrale de puissance à partir de jTransforms DoubleFFT_1D

Un exemple des données est la suivante:

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

J'utilise la fonction DoubleFFT_1D dans jTransforms. La sortie de données est la suivante:

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

Je vais avoir du mal à interpréter la sortie. Je comprends que le premier élément du tableau de sortie est le total des 10 entrées (10952). C'est

les autres éléments du tableau de sortie que je ne comprends pas. En fin de compte, je veux tracer la densité spectrale de puissance des données d'entrée sur un graphique et trouver des quantités entre 0 et 0,5 Hz.

La documentation pour les états fonctions de jTransform (où est l'ensemble de données):

public void realForward(double[] a) 1D calcule en avant DFT de réelles données laissant le résultat dans un. La disposition physique des données de sortie est la suivante:

si n est pair alors

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

si n est impair, alors

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] 

Cette méthode calcule seulement la moitié des éléments de la vraie transformation. L'autre moitié satisfait la condition de symétrie. Si vous voulez la transformation complète réelle , utilisez realForwardFull. Pour récupérer les données d'origine, utilisez realInverse sur la sortie de cette méthode.

Paramètres: a - données à transformer

Maintenant, en utilisant les méthodes ci-dessus: (puisque la longueur de mon tableau de données est 10, le "n est même" méthodes sont utilisées)

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 

Donc quelques questions: Est-ce que cette sortie a l'air correcte? Il me semble que Re [0] ne devrait pas être 10952, qui est la somme de tous les éléments du tableau original.

On dirait que la sortie doit être légèrement corrigé: (je me trompe?)

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 

Maintenant, en utilisant la méthode suivante a écrit dans le forum:

Pour obtenir l'ampleur du bac k Vous devez calculer sqrt(re * re + im * im), où re, im sont les composantes réelles et imaginaires dans la sortie FFT pour bin k.

Pour votre FFT en particulier re[k] = a[2*k] and im[k] = a[2*k+1].Par conséquent, pour calculer le spectre de puissance:

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

Ainsi:

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

Quelques questions. Est-ce que ces données semblent correctes? Suis-je sur la bonne voie? Est-ce que ces données de spectre tracer ensuite quelque chose comme ceci:

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

Suis-je loin? Mon objectif est de produire un diagramme à barres de densité spectrale de puissance de 0 à 0,5 Hz.

+0

N'est-ce pas un duplicata de votre question d'hier: http://stackoverflow.com/questions/4996747/interpreting-jtransform-fft-results? –

+0

oui. avec un peu de suivi. Après m'être connecté, j'étais incapable de manipuler l'ancien fil. Aucune de mes anciennes questions (y compris celle référencée) n'apparaissait dans mon compte. Donc je l'ai déplacé et ajouté quelques données de suivi. Pardon. Je ne veux pas ajouter de la confusion. Juste eu des problèmes avec stackoverflow allant de l'invité à l'utilisateur connecté. J'apprécie vraiment l'aide. J'ai l'impression de faire des progrès avec votre aide. – Damon

+1

demander les mods pour résoudre les problèmes de compte pour vous. Aussi, que diriez-vous de marquer la réponse de Paul R comme acceptée et de l'augmenter, cela vous semble plutôt utile. – Kev

Répondre

9

Je pense que vous avez besoin d'interpréter les données de sortie comme suit:

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] 

Les grandeurs sont donc:

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 

[Désolé qu'il y ait deux réponses séparées de moi maintenant - je pense que deux questions connexes ont été fusionnées pendant que je travaillais sur la nouvelle réponse]

+0

Merci Paul. Cela l'efface grandement! Pardonnez mon manque, mais comment les résultats du spectre [0-4] se rapportent aux fréquences comprises entre 0 et 0,5 Hz? – Damon

+0

pour l'exemple ci-dessus, je pense que Fs = 1Hz (de cette façon, les maths fonctionne). – Damon

+0

@Damon: désolé, oui, je voulais dire 'Fs = 1 Hz'. Je vais republier un commentaire corrigé. –

1

Chaque entrée de la transformée représente l'amplitude (complexe) de la fréquence dans l'échantillon.

la densité de puissance dans une fréquence donnée est juste la grandeur de l'amplitude complexe de la transformée dans cette fréquence. l'amplitude d'un nombre complexe est calculée à partir de ses composants et vous ne devriez pas avoir de problème pour l'obtenir

Chaque colonne représente les amplitudes pour les fréquences croissantes, en commençant à 0 (la première entrée), puis 2 Pi/T (où T est la longueur de votre échantillon), jusqu'au dernier échantillon 2 * Pi * N/T (où N est le nombre d'échantillons)

il existe d'autres conventions où la transformée est retournée pour la fréquence -Pi * N/T à Pi * N/T, et la composante de fréquence est 0 dans le milieu de la matrice

espoir que cela aide

0

Pour obtenir l'amplitude de bin k, vous devez calculer sqrt (re * re + im * im), wheer re, im sont les composantes réelles et imaginaires dans la sortie FFT pour bin k.

Pour votre FFT en particulier re[k] = a[2*k] et im[k] = a[2*k+1]. Par conséquent, pour calculer le spectre de puissance:

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

Merci pour l'aide. C'est la meilleure information que j'ai trouvée jusqu'ici. J'ai utilisé votre équation de spectre pour calculer les valeurs pour l'ensemble de données suivant:
1068,1116,1140,1144,1160,1136,1100,1080,1200,1212,1092,952,1060,1068 – Damon

+1

@Damon, si ceci vous aider, s'il vous plaît cliquez sur la droite pour la réponse pour faire la coche devenir vert – lurscher