【问题标题】:Discrete Fourier Transform in PythonPython中的离散傅里叶变换
【发布时间】:2017-10-27 15:50:08
【问题描述】:

我需要在 Python 中使用离散傅里叶变换 (DFT)(和逆 DFT),我得到的结果有点奇怪,所以我尝试了一个小例子,但我不确定我是否理解错误(如果是数学或编码)。这是我的小版本代码:

from __future__ import division
import numpy as np
from pylab import *

pi = np.pi

def f(x):
    return sin(x)

theta = np.arange(0,2*pi,2*pi/4)
k = np.arange(0,4,1)

x = f(theta)
y = np.fft.fft(x)

derivative = np.fft.ifft(1j*k*y) 
print(derivative)

所以我要做的是在 0 到 2pi 之间的 4 个不同点对 sin 进行采样,并用这些数字创建一个向量 x。然后我取 x 的 DFT 得到 y。我想要的是在选定的点上得到 sin 的导数,所以要做到这一点,我将 y 乘以 k(波数,在这种情况下为 0、1、2、3)和我的虚数 1j(这是因为在傅里叶和中,我对每个术语都有一些形式为 e^{ikx})。所以最后我取 1jky 的逆 DFT,我应该得到 sin 的导数。但我得到的是这个。

[ -1.00000000e+00 -6.12323400e-17j  -6.12323400e-17 +2.00000000e+00j
   1.00000000e+00 +1.83697020e-16j   6.12323400e-17 -2.00000000e+00j]

当我应该得到这个时

[1,0,-1,0]

忽略舍入错误。有人可以告诉我我做错了什么吗?谢谢!

【问题讨论】:

    标签: python fft


    【解决方案1】:

    如果逆 FFT 要产生结果,频谱的操作必须保持这种 Hermitian 对称性。因此,频域中的导数算子被定义在频谱的下半部分,而频谱的上半部分则由对称构成。请注意,对于偶数大小的频谱,恰好在N/2 处的值必须是其自身的对称性,因此必须有一个虚部为 0。下面说明如何构造这个导数算子:

    N = len(y)
    if N%2:
      derivative_operator = np.concatenate((np.arange(0,N/2,1),[0],np.arange(-N/2+1,0,1)))*1j
    else:
      derivative_operator = np.concatenate((np.arange(0,N/2,1),np.arange(-N//2+1,0,1)))*1j
    

    您将在频域中使用此derivative_operator,如下所示:

    derivative = np.fft.ifft(derivative_operator*y)
    

    在您的示例案例中,您应该得到以下结果

    [  1.00000000e+00+0.j   6.12323400e-17+0.j  
      -1.00000000e+00+0.j  -6.12323400e-17+0.j]
    

    这在您预期的[1,0,-1,0] 的舍入误差范围内。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-09-30
      • 1970-01-01
      • 1970-01-01
      • 2011-07-09
      • 1970-01-01
      • 1970-01-01
      • 2017-04-19
      • 1970-01-01
      相关资源
      最近更新 更多