Question

J'utilise JTRANSFORMS Java Library pour effectuer une analyse sur un ensemble de données donné.

Un exemple des données est le suivant:

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

J'ai 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 souhaite 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 des fonctions de fonctions JTRANSform (où A est l'ensemble de données):

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

Si n est même 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 étrange 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 ne calcule que la moitié des éléments de la transformée réelle. L'autre moitié satisfait la condition de symétrie. Si vous voulez la transformée en avant complète, 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

Utilisant maintenant les méthodes ci-dessus: (Étant donné que la durée de mon tableau de données est de 10, les méthodes «n est même» 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: cette sortie semble-t-elle correcte? Il me semble que re [0] ne devrait pas être 10952, ce qui est la somme de tous les éléments du tableau d'origine.

On dirait que la sortie devrait être légèrement corrigée: (Ai-je tort?)

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

Utilisant maintenant la méthode suivante publiée dans le forum:

Pour obtenir l'ampleur du bin k, vous devez calculer sqrt(re * re + im * im), où re, im sont les composants réels et imaginaires de la sortie FFT pour le bin k.

Pour votre FFT 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. Ces données semblent-elles correctes? Suis-je sur la bonne voie? Est-ce que ces données de spectre traceraient alors 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 graphique à barre de densité spectrale de puissance de 0 à 0,5 Hz

Était-ce utile?

La solution

Je pense que vous devez 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 amplitudes 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é pour qu'il y ait deux réponses distinctes de moi maintenant - je pense que deux questions connexes ont été fusionnées pendant que je travaillais sur la nouvelle réponse

Autres conseils

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

La densité de puissance dans une fréquence donnée n'est que l'ampleur de l'amplitude complexe de la transformation dans cette fréquence. L'ampleur d'un nombre complexe est calculée à partir de ses composants et vous ne devriez pas avoir de problème à l'obtenir

Chaque colonne représente des amplitudes pour l'augmentation des fréquences, à partir de 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 transformation est retournée pour la fréquence -pi * n / t jusqu'à pi * n / t, et le composant de fréquence 0 est au milieu du tableau

J'espère que cela t'aides

Pour obtenir l'ampleur du bin k, vous devez calculer sqrt (re * re + im * im), weer re, im sont les composants réels et imaginaires de la sortie FFT pour le bin k.

Pour votre FFT 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]))
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top