我需要在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]
忽略舍入错误。有人能告诉我我做错了什么吗?谢谢!
答案 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]
的累计错误。