мнимая часть БПФ Numpy не соответствует аналитическому выражению - PullRequest
0 голосов
/ 12 июня 2019

Я бы хотел использовать непостоянное БПФ (DFT) в качестве дискретизации непрерывного преобразования Фурье (CFT).

Все идет хорошо, когда ожидаемый CFT является реальным (например, гауссиан с центром в ноль) благодаря этому сообщению

Так что я попробовал с сдвинутым гауссианом, который ожидал, что CFT имеет обадействительная и мнимая часть: gaussian ft

, которую я проверил по следующей ссылке https://www.wolframalpha.com/input/?i=Fourier+transform+calculator&assumption=%7B%22F%22,+%22FourierTransformCalculator%22,+%22transformfunction%22%7D+-%3E%22e%5E(-(x-5.0)%5E2)%22&assumption=%7B%22F%22,+%22FourierTransformCalculator%22,+%22variable1%22%7D+-%3E%22x%22&assumption=%7B%22F%22,+%22FourierTransformCalculator%22,+%22variable2%22%7D+-%3E%22k%22

Результаты ниже показывают, что мнимая часть каким-то образом перевернута fft result

Вотмой код:

import matplotlib.pyplot as plt
import numpy as np

x0= 5.0 
steps = 0.01
xLeft=0.0

x = np.arange(xLeft, 205.0,steps)

g = np.exp( -(x-x0)**2 )

leng = len(g)

gft = np.fft.fft(g) #compute FFT

k = np.fft.fftfreq(leng)*2*np.pi/steps #generate independent variable  set in for FFT 

gft*=steps*np.exp(-complex(0,1)*k*(xLeft))/(np.sqrt(2*np.pi)) #scale FFT and multiply by phase factor (form previous answer) 

igft = np.imag(gft)
rgft = np.real(gft)

true_fft = np.exp(-0.25*k**2+5.0j*k)/np.sqrt(2) #analytic expression for FFT
itrue_fft = np.imag(true_fft)
rtrue_fft = np.real(true_fft)

plt.plot(k, rgft, linewidth=3, label="real part")
plt.plot(k, igft, linewidth=3, label="imag part")
plt.plot(k, rtrue_fft, 'o', ms=2, label="analytic real")
plt.plot(k, itrue_fft, 'o', ms=2, label="analytic imag")
plt.legend()
plt.show()

...