Pregunta

Estoy usando la biblioteca Java Jtransforms para realizar análisis en un conjunto de datos determinado.

Un ejemplo de los datos es el siguiente:

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

Estoy usando la función DoubleFFT_1D en jTransforms.La salida de datos es la siguiente:

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

Tengo problemas para interpretar el resultado.Entiendo que el primer elemento de la matriz de salida es el total de las 10 entradas (10952).Es

los otros elementos de la matriz de salida que no entiendo.En última instancia, quiero trazar la densidad espectral de potencia de los datos de entrada en un gráfico y encontrar cantidades entre 0 y 0,5 Hz.

La documentación de las funciones jTransform establece (donde a es el conjunto de datos):

public void realForward(double[] a) calcula 1D hacia adelante DFT de datos reales dejando el resultado en a.El diseño físico de los datos de salida es el siguiente:

si n es par entonces

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 es impar entonces

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]

Este método calcula sólo la mitad de los elementos de la transformación real.La otra mitad satisface la condición de simetría.Si desea la transformación real completa, use Realforwardfull.Para recuperar los datos originales, use realinverse en la salida de este método.

Parámetros:a - datos para transformar

Ahora usando los métodos anteriores:(dado que la longitud de mi matriz de datos es 10, se utilizan los métodos "n es par")

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

Entonces algunas preguntas:¿Este resultado parece correcto?Me parece que Re[0] no debería ser 10952, que es la suma de todos los elementos de la matriz original.

Parece que el resultado debería corregirse ligeramente:(¿Me equivoco?)

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

Ahora usando el siguiente método publicado en el foro:

Para obtener la magnitud de bin k necesitas calcular sqrt(re * re + im * im), donde re, im son los componentes real e imaginario en la salida FFT para bin k.

Para su FFT particular re[k] = a[2*k] and im[k] = a[2*k+1].Por lo tanto para calcular el espectro de potencia:

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

De este modo:

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

Algunas preguntas.¿Estos datos parecen correctos?¿Estoy en el camino correcto?¿Estos datos del espectro entonces trazarían algo como esto?

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

¿Estoy muy lejos?Mi objetivo es producir un gráfico de barras de densidad espectral de potencia de 0 a 0,5 Hz.

¿Fue útil?

Solución

Creo que necesitas interpretar los datos de salida de la siguiente manera:

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]

Las magnitudes son por tanto:

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

[Perdón que ahora haya dos respuestas mías separadas; creo que dos preguntas relacionadas se fusionaron mientras trabajaba en la nueva respuesta]

Otros consejos

Cada entrada en la transformación representa la magnitud (compleja) de la frecuencia en la muestra.

la densidad de potencia en una frecuencia dada es solo la magnitud de la amplitud compleja de la transformada en esa frecuencia.La magnitud de un número complejo se calcula a partir de sus componentes y no deberías tener problemas para obtenerla.

Cada columna representa amplitudes para frecuencias crecientes, comenzando desde 0 (la primera entrada), luego 2 Pi/T (donde T es la longitud de su muestra), hasta la última muestra 2*Pi*N /T (donde N es el número de muestras)

Existen otras convenciones en las que la transformación se devuelve para la frecuencia -Pi * N /T hasta Pi * N / T, y el componente de frecuencia 0 está en el medio de la matriz.

espero que esto ayude

Para obtener la magnitud de bin k necesita calcular sqrt(re * re + im * im), donde re, im son los componentes real e imaginario en la salida FFT para bin k.

Para su FFT particular re[k] = a[2*k] y im[k] = a[2*k+1].Por lo tanto para calcular el espectro de potencia:

for k in 0 to N/2 - 1
  spectrum[k] = sqrt(sqr(a[2*k]) + sqr(a[2*k+1]))
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top