在 Python 中通过 FFT 和 IFFT 对高斯函数求导

计算科学 Python 麻木的 傅里叶变换
2021-12-23 07:13:41

我在使用 NumPy 库中的 FFT 和 IFFT 计算高斯函数的导数时遇到问题。我使用的事实是

ddxf(x)=12πikeikxF(f(x))(k)dk,
在哪里F(f(x))(k)=12πf(x)eikxdx.
我的代码:

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。在项目的下一部分中,该衍生产品对我至关重要。我将不胜感激任何提示和帮助。

2个回答

在您的 Ifft 函数中,您取的是实部的绝对值。只取实数而不做绝对值。

这是甚至 N的正确工作 Matlab 代码

sigma=3/2;mean=0;N=128;L=20;
dx=L/N;
x=linspace(-L/2,L/2-dx,N);
f=(pi.^(-1/4).*sigma.^(-1/2).*exp(-(x-mean).^2./(2*sigma^2)));
k(1:N/2)=1i/L*2*pi*(0:N/2-1);k(N/2+2:N)=1i/L*2*pi*(-N/2+1:-1);k(N/2+1)=0;
fhat=fft(f);
fhatx=k.*fhat;
fx=ifft(fhatx);
plot(x,f,x,fx);

在此处输入图像描述