Я бы хотел использовать непостоянное БПФ (DFT) в качестве дискретизации непрерывного преобразования Фурье (CFT).
Все идет хорошо, когда ожидаемый CFT является реальным (например, гауссиан с центром в ноль) благодаря этому сообщению
Так что я попробовал с сдвинутым гауссианом, который ожидал, что CFT имеет обадействительная и мнимая часть:
, которую я проверил по следующей ссылке 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
Результаты ниже показывают, что мнимая часть каким-то образом перевернута
Вотмой код:
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()