Python中的离散傅立叶变换

时间:2017-10-27 15:50:08

标签: python fft

我需要在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})。所以最后我采用1j k y的逆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]

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

1 个答案:

答案 0 :(得分:1)

如果逆FFT要产生结果,则操纵频谱必须保持这种埃尔米特对称性。因此,频域中的导数算子被定义在频谱的下半部分上,并且频谱的上半部分由对称性构成。请注意,对于偶数大小的频谱,精确Command npm.cmd install nativescript-template-ng-tutorial@4.4.0 --silent --save-exact --save failed with exit code 1的值必须是其自身的对称性,因此必须具有0的虚部。以下说明如何构造此微分运算符:

N/2

您可以在频域中使用此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] 的累计错误。