Densidade Espectral de potência de jTransforms DoubleFFT_1D
-
14-11-2019 - |
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
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]))