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.
N'est-ce pas un duplicata de votre question d'hier: http://stackoverflow.com/questions/4996747/interpreting-jtransform-fft-results? –
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
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