БПФ: не такие же границы, как в примере - PullRequest
0 голосов
/ 02 мая 2018

Мне нужно переделать БПФ примера для тренинга, и я застрял в проблеме: у меня успешно получается та же форма, когда я строю ее БПФ, но границы отличаются от примера.

Вот функция, которую я должен построить и сделать БПФ: formula

Ожидается, что функция имеет частоту среза 2 Гц (0,5 секунды).
(Если вы не поняли: это означает, что при 0,5 секунде (и 2 Гц для БПФ) функция равна 0)

Слева показана функция, относящаяся ко времени, справа - преобразование Фурье.
Это пример. Простая красная линия, это функция, над которой я работаю :

plot of the example

Вот что я получаю:

plot of my work

Как видите, границы моего графика БПФ сильно отличаются от примера. У меня есть коэффициент 10² на графике .

Как вы думаете, проблема в том, как я использую БПФ? Говорят, что функция нормализована, как вы думаете, разница в этом?

Это код, который я написал:

npas      = 32768                                # steps for discretization
t         = np.linspace(0,200,npas)              # time discretized (array of npas elements, from 0 to 200)     
f         = np.fft.fftfreq(t.size, d=1.0/npas)   # frequency (for Fourier Transform)  d = sample spacing (inverse of the sampling rate)
swh       = np.zeros(npas)                       # initialization of the array swh (the function we use)
tau0      = 1.0/20

# creation of the function and it's Fourier transform
swh      = (1/tau0)*np.exp(-t/tau0)*(1 + t/tau0 + (t**2)/(2*tau0**2) + (t**3)/(3*tau0**3) - 0.490*t**4/tau0**4) - np.exp(-t/tau0)*(1/tau0 + t/tau0**2 + t**2/tau0**3 - 0.490*(4*t**3)/tau0**4)
swh_f    = np.fft.fft(swh)                       # Fourier transform of swh

##### Plot #####

plt.figure(1)
plt.subplot(1,2,1)
plt.title("Time Function")
plt.plot(t, swh, 'r'  ,  linewidth=1, label = "SWH B = 0.490")             # plot of swh, function of t
plt.legend(loc = 1, prop={'size': 7})                                      # legend position
plt.xlim(0,1.5)

plt.subplot(1,2,2)
plt.title("Frequency Function")
plt.plot(f[0:f.size//2], abs(swh_f[0:npas//2]), 'r'  ,  linewidth=1)       # plot of the Fourier transform, function of f (frequency)
plt.xscale('log')
plt.yscale('log')

plt.show()

Спасибо за внимание!

1 Ответ

0 голосов
/ 02 мая 2018

Вы можете использовать опцию «норма» в вашем БПФ:

swh_f = np.fft.fft(swh, norm = "ortho")

Более подробную информацию о реализации FFT в NumPy можно найти здесь: https://docs.scipy.org/doc/numpy/reference/routines.fft.html#module-numpy.fft

...