我在使用 NumPy 库中的 FFT 和 IFFT 计算高斯函数的导数时遇到问题。我使用的事实是
在哪里.
我的代码:
import numpy as np
import scipy as sci
import matplotlib.pyplot as plt
def Gauss(x, mean, sigma):
#GAUSS FUNCTION WITH ITS NORMALIZATION FACTOR
return sci.pi**(-1/4) * sigma**(-1/2) * np.exp(-(x - mean)**2 / (2 * sigma**2))
def Fft(f):
#THAT dx AND np.sqrt(2*sci.pi) ARE SOME NORMALIZATION FACTORS
return np.fft.fftshift(np.abs(np.fft.fft( f ) * dx / np.sqrt(2*sci.pi)))
def Ifft(fftf):
#THAT dx AND np.sqrt(2*sci.pi) ARE SOME NORMALIZATION FACTORS
return np.abs(np.fft.fftshift(np.fft.ifft( fftf )).real) / dx * np.sqrt(2 * sci.pi)
def d_Gauss(x, sigma):
#FINAL DIFFERENCE, LATER DENOTED AS EXACT DERIVATIVE
return (Gauss(x+dx, 0, sigma)-Gauss(x, 0, sigma))/dx
x = np.linspace(-20, 20, 2**12)
dx = np.abs(x[1] - x[0])
freq_x = np.fft.fftshift(np.fft.fftfreq(np.shape(x)[0])) / dx * 2 * sci.pi
dk = np.abs(freq_x[0]-freq_x[1])
sigma = 3/2
mean = 0
#COMPUTING EXACT GAUSS DERIVATIVE AND IT'S APPROXIMATION VIA FFT AND IFFT
d_gauss_exact = d_Gauss(x, sigma)
d_gauss = Gauss(x,mean,sigma)
d_gauss = Fft(d_gauss)
d_gauss = 1j*freq_x*d_gauss
d_gauss = Ifft(d_gauss)
#PLOTTING
plt.figure('Gauss der.')
plt.plot(x, d_gauss, 'b--', label='Gauss der. fft')
plt.plot(x, d_gauss_exact,'r-', label='Exact Gauss der.')
plt.xlim(-10,10)
plt.xlabel(r'$x$')
plt.ylabel(r'$\frac{d}{dx}g(x)$')
plt.legend()
plt.show()
我得到的是:
该代码适用于高斯函数、调制脉冲和洛伦兹函数的 FFT。在项目的下一部分中,该衍生产品对我至关重要。我将不胜感激任何提示和帮助。

