高斯离散傅里叶变换幅度不正确

计算科学 傅立叶分析
2021-12-04 20:19:22

我试图理解为什么高斯的 FFT(用 numpy 计算)的幅度与其解析解不同。

} 但是,如果我用 numpy 中的 FFT 函数计算它,那么得到的高斯幅度不是 1?F{eπt2}=eπf2

我已经做了以下事情:

  • 我确实将 fft 结果除以样本数(归一化)。
  • 我什至尝试移动高斯,以便它的第一个样本是它的高度。这纠正了正弦行为,并去除了虚数部分,但不会改善幅度结果(与未偏移情况的绝对值相同)。但是,无论如何我都会采用绝对值。

这是代码:

def test_gauss_1D(self,a,f_c,delta_f):
   delta_t = 1.0/(2.0*f_c)
   N = int(np.ceil(1/(delta_f*delta_t)))+1
   if (N % 2) == 0:
      N = N + 1

   t = np.linspace(-(N-1)/2*delta_t,(N-1)/2*delta_t,N)
   f = np.linspace(-1/(2*delta_t),1/(2*delta_t),N)

   x_t = np.exp(-np.pi*t**2)

   #x_t = np.roll(x_t,-1*(N-1)/2)

   #x_t = 1/(np.sqrt(2*np.pi)*a)*np.exp(-t**2/(2*a**2))

   #print "std = ", 1/(4*a**2*np.pi**2)
   #print "ampl =", np.sqrt(2*np.pi)*a

   plt.plot(t,x_t)
   plt.show()

   #x_f = np.fft.fft(x_t)/N
   #print "N = ",N
   x_f = np.fft.fft(x_t)/N

   x_f = np.roll(x_f,1*(N-1)/2)

   plt.plot(f,np.absolute(f))
   plt.show()

以下是图片:

傅里叶变换之前 傅里叶变换后

如您所见,第二张图像中的幅度不正确(应该是一个)。

为什么是这样?

2个回答

归一化需要包括采样频率。将你的 x_f 乘以 delta_t,你应该已经准备好了。

我认为您使用了不正确的归一化:1/N 的因子是应用变换和逆变换的结果。因此,对于前向归一化,您需要 1/(sqrt(N))。当我使用这种规范化运行您的代码时,我看到 sqrt(2) 的峰值,因此正确的规范化是 1/(sqrt(2*N))。

我怀疑二的最后一个因素来自 N 的确切定义,以及正负频率是否应该计算两次。无论如何,我似乎无法在 numpy 文档页面上找到它:http: //docs.scipy.org/doc/numpy/reference/routines.fft.html