Densité spectrale de puissance de JTRANSFORMS Doublefft_1d
-
14-11-2019 - |
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
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]))