Учитывая частоту дискретизации FSample
и размер блока преобразования N
, вы можете рассчитать разрешение по частоте deltaF
, интервал выборки deltaT
и общее время захвата capT
, используя отношения:
deltaT = 1/FSample = capT/N
deltaF = 1/capT = FSample/N
Помните также, что FFT возвращает значение от 0
до FSample
или эквивалентно -FSample/2
до FSample/2
.На вашем графике вы уже отбрасываете часть -FSample/2
до 0
.NumPy включает вспомогательную функцию для расчета всего этого за вас: fftfreq .
Для ваших значений deltaT = 1 hour
и N = 576
вы получаете deltaF = 0.001736 cycles/hour = 0.04167 cycles/day
, от -0.5 cycles/hour
до 0.5 cycles/hour
.Так что, если у вас есть пик величины, скажем, в ячейке 48 (и ячейке 528), который соответствует частотной составляющей в 48*deltaF = 0.0833 cycles/hour = 2 cycles/day.
В общем, вы должны применить оконную функцию к вашим данным во временной области перед вычислением БПФ, чтобы уменьшить спектральную утечку .Окно Ханна почти никогда не является плохим выбором.Вы также можете использовать функцию rfft
, чтобы пропустить часть -FSample/2, 0
вывода.Итак, ваш код будет:
ft = np.fft.rfft(signal*np.hanning(len(signal)))
mgft = abs(ft)
xVals = np.fft.fftfreq(len(signal), d=1.0) # in hours, or d=1.0/24 in days
plot(xVals[:len(mgft)], mgft)