Pergunta

Eu estou usando Jtransforms biblioteca java para executar a análise em um determinado conjunto de dados.

Um exemplo dos dados é o seguinte:

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

Eu estou usando o DoubleFFT_1D função jTransforms.A saída de dados é o seguinte:

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

Estou tendo problemas para interpretar a saída.Eu entendo que o primeiro elemento na matriz de saída é o total de 10 entradas (10952).É

os outros elementos da matriz de saída que eu não entendo.Enfim, eu quero desenhar a Densidade Espectral de Potência de entrada de dados em um gráfico e encontrar valores entre 0 e. 5 Hz.

A documentação para a jTransform funções estados (onde a é o conjunto de dados):

public void realForward(double[] a) calcula 1D frente DFT de real de dados, deixando o resultado em um .A disposição física dos dados de saída é o seguinte:

se n for par, em seguida,

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

se n é ímpar, em seguida,

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 apenas metade dos elementos do real transformação.A outra metade satisfaz a condição de simetria.Se você deseja que o total real frente transformação, use realForwardFull.Para obter de volta o original de dados, use realInverse sobre a saída deste método.

Parâmetros:a - dados para transformar

Agora, usando os métodos acima:(uma vez que o comprimento do meu matriz de dados é 10, o "n" é mesmo" métodos são usados)

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

Então, algumas perguntas:Esta aparência de saída correto?Parece-me que Re[0] não deve ser 10952 que é a soma de todos os elementos no array original.

Parece que a saída deve ser levemente corrigido:(estou errado?)

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

Agora, usando o seguinte método postado no fórum:

Para obter a magnitude de bin k, você precisa calcular sqrt(re * re + im * im), onde re, mi são o real e o imaginário componentes da FFT saída para a bandeja k.

Para a sua FFT re[k] = a[2*k] and im[k] = a[2*k+1].Portanto, para calcular o espectro de potência:

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

Assim:

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

Algumas perguntas.Estes dados parecem correctas?Estou no caminho certo?Seria esse espectro de dados, em seguida, registrar algo como isto:

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

Estou fora de forma?Meu objetivo é produzir uma Densidade Espectral de Potência gráfico de barras a partir de 0 .5Hz

Foi útil?

Solução

Eu acho que você precisa interpretar os dados de saída da seguinte forma:

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]

As magnitudes são, portanto:

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

[Desculpem lá estar a dois separados respostas de mim agora, eu acho que duas perguntas relacionadas tenho intercalado enquanto eu estava trabalhando na nova resposta]

Outras dicas

Cada entrada na transformação representar a (complexa) magnitude e a freqüência na amostra.

a densidade de energia em uma determinada freqüência, é apenas a magnitude do complexo amplitude da transformação em que freqüência.a magnitude de um número complexo é calculado a partir de seus componentes, e você não deve ter problemas em obter este

Cada coluna representa as amplitudes para aumentar as frequências, a partir de 0 (primeira entrada) e, em seguida, 2 Pi/T (onde T é o comprimento da amostra), até o último exemplo 2*Pi*N /T (onde N é o número de amostras)

existem outras convenções, onde a transformação é retornado para o-Pi * N /T frequência de cima para Pi * N / T, e o 0 componente de frequência é no meio da matriz

espero que isso ajude

Para obter a magnitude de bin k, você precisa calcular sqrt(re * re + mi * mi), wheer re, mi são o real e o imaginário componentes da FFT saída para a bandeja k.

Para a sua FFT re[k] = a[2*k] e im[k] = a[2*k+1].Portanto, para calcular o espectro de potência:

for k in 0 to N/2 - 1
  spectrum[k] = sqrt(sqr(a[2*k]) + sqr(a[2*k+1]))
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top