Подтвердить что ты не робот

Спектральная плотность мощности от jTransforms DoubleFFT_1D

Я использую java-библиотеку Jtransforms для выполнения анализа по заданному набору данных.

Пример данных следующий:

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 и 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 - реальные и мнимые компоненты в выходе FFT для bin k.

Для вашего конкретного FFT 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 до 0,5 Гц

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

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

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

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

Ответ 3

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

Для вашего конкретного FFT 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]))