Спектральная плотность мощности от Jtransforms DoubleFFT 1D

я использую jtransforms java library для выполнения анализа данного набора данных.

пример данных выглядит следующим образом:

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

я использую функцию DoubleFFT_1D в jTransforms. Вывод данных выглядит следующим образом:

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

у меня возникли проблемы интерпретации результатов. Я понимаю, что первый элемент в выходном массиве-это сумма 10 входов (10952). Это

другие элементы выходного массива, которые я не понимаю. В конечном счете, я хочу построить спектральную плотность мощности входных данных на графике и найти суммы между 0 и .5 Гц.

в документации для функций jTransform указано (где a-набор данных):

public void realForward(double[] a) вычисляет 1D вперед DFT реального оставляя данные в результате . Физическая структура данных это так:

если n даже тогда

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

если N нечетно, то

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]

этот метод вычисляет только половину элементов реального преобразования. Другая половина удовлетворяет условию симметрии. Если вы хотите полный реальное преобразование вперед, используйте realForwardFull. Чтобы вернуть исходные данные, используйте realInverse на выходе этого метода.

параметры: a - данные для преобразования

теперь, используя методы выше: (поскольку длина моего массива данных равна 10, методы " N четные используется)

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

Итак, некоторые вопросы: Этот вывод выглядит правильно? Мне кажется, что Re[0] не должно быть 10952, что является суммой всех элементов в исходном массиве.

кажется, что выход должен быть слегка скорректирован: (я ошибаюсь?)

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

теперь, используя следующий метод, размещенный в форуме:

чтобы получить величину bin k, вам нужно рассчитать sqrt(re * re + im * im), где re, im-реальные и мнимые компоненты в БПФ выход для bin k.

для вашего конкретного БПФ re[k] = a[2*k] and im[k] = a[2*k+1]. Поэтому для расчета спектра мощности:

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

таким образом:

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

некоторые вопросы. Эти данные выглядят правильно? Я на правильном пути? Будут ли эти данные спектра тогда строить что-то вроде этого:

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

я далеко? Моя цель-создать гистограмму спектральной плотности мощности от 0 до .5Гц

3 ответов


Я думаю, вам нужно интерпретировать выходные данные следующим образом:

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]
величины:
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

[Извините, что есть два отдельных ответа от меня сейчас - я думаю, что два связанных вопроса слились, пока я работал над новым ответом]


каждая запись в преобразовании представляет (комплексную) величину частоты в выборке.

плотность мощности на заданной частоте - это только величина комплексной амплитуды преобразования на этой частоте. величина комплексного числа вычисляется из его компонентов, и у вас не должно быть проблем с получением этого

каждый столбец представляет амплитуды для увеличения частот, начиная с 0 (первая запись), затем 2 Pi /T (где T длина вашего образца), до последнего образца 2 * Pi*N /T (где N-количество образцов)

существуют другие соглашения, в которых преобразование возвращается для частоты-Pi * N /T до Pi * N / T, а компонент частоты 0 находится в середине массива

надеюсь, что это помогает


чтобы получить величину bin k, вам нужно рассчитать sqrt (re * re + im * im), wheer re, im-реальные и мнимые компоненты в выходе FFT для bin k.

для вашего конкретного БПФ re[k] = a[2*k] и im[k] = a[2*k+1]. Поэтому для расчета спектра мощности:

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