Я использую 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 Гц