为什么numpy的fft和fft2对于1D阵列不相等?

时间:2016-12-02 09:30:04

标签: python-3.x numpy

有人可以解释为什么将numpy的fft和fft2应用到同一个1D阵列会产生不同的结果吗?

 x = np.linspace(0, 2*np.pi, 10)
 x = np.reshape(x, (10, 1))
 x = np.sin(x)
 f1 = np.fft.fft(x)
 f2 = np.fft.fft2(x)
 np.equal(f1,f2)

理论上,f1应该等于f2。

1 个答案:

答案 0 :(得分:1)

回答重写(对不起,第一个有点短):

不同之处在于,fft采用其他输入参数而不是fft2(二维傅立叶变换(FT))。

如果您在示例中print(f1),您可以很好地看到,所有值大致为0.这会让您怀疑,因为您傅里叶变换了窦。

发生的事情是,fft例程得到了输入参数列表而不是数组,因此它为每个条目(1个元素)执行了FT。这对应于一个常数函数,为此,数学告诉我们:FT(const1)= const1。这四个原因你得到的输出与fft中的输入相同。您正确使用的fft2例程。

下面您会在修改后的版本中找到示例,其中说明了这一点:

import numpy as np
import copy
x1 = np.linspace(0, 2*np.pi, 10)
x2 = np.reshape(x1, (10, 1))
x1 = np.sin(x1)
x2 = np.sin(x2)
f1 = np.fft.fft(x1)
f2 = np.fft.fft2(x2)

print('input arrays for fft and fft2:')
print(x1)
print(x2)
print('your old output of fft, which is exactly equal to the input x2')
print(np.fft.fft(x2))
print('Now we compare our results:')
for ii in range(0,len(x1)):
    print('f1:',f1[ii],'\tf2:',f2[ii,0])
print('and see, they agree')

<强>输出:

input arrays for fft and fft2:

[  0.00000000e+00   6.42787610e-01   9.84807753e-01   8.66025404e-01

   3.42020143e-01  -3.42020143e-01  -8.66025404e-01  -9.84807753e-01

  -6.42787610e-01  -2.44929360e-16]

[[  0.00000000e+00]

 [  6.42787610e-01]

 [  9.84807753e-01]

 [  8.66025404e-01]

 [  3.42020143e-01]

 [ -3.42020143e-01]

 [ -8.66025404e-01]

 [ -9.84807753e-01]

 [ -6.42787610e-01]

 [ -2.44929360e-16]]

your old output of fft, which is exactly equal to the input x2

[[  0.00000000e+00+0.j]

 [  6.42787610e-01+0.j]

 [  9.84807753e-01+0.j]

 [  8.66025404e-01+0.j]

 [  3.42020143e-01+0.j]

 [ -3.42020143e-01+0.j]

 [ -8.66025404e-01+0.j]

 [ -9.84807753e-01+0.j]

 [ -6.42787610e-01+0.j]

 [ -2.44929360e-16+0.j]]

Now we compare our results:

f1: (-1.11022302463e-16+0j)     f2: (-1.11022302463e-16+0j)

f1: (1.42837120544-4.39607454395j)  f2: (1.42837120544-4.39607454395j)

f1: (-0.485917547994+0.668808127899j)   f2: (-0.485917547994+0.668808127899j)

f1: (-0.391335729991+0.284322050566j)   f2: (-0.391335729991+0.284322050566j)

f1: (-0.36913281032+0.119938520599j)    f2: (-0.36913281032+0.119938520599j)

f1: (-0.363970234266+1.55431223448e-15j)    f2: (-0.363970234266+1.55431223448e-15j)

f1: (-0.36913281032-0.119938520599j)    f2: (-0.36913281032-0.119938520599j)

f1: (-0.391335729991-0.284322050566j)   f2: (-0.391335729991-0.284322050566j)

f1: (-0.485917547994-0.668808127899j)   f2: (-0.485917547994-0.668808127899j)

f1: (1.42837120544+4.39607454395j)  f2: (1.42837120544+4.39607454395j)

and see, they agree

有关fft2的一些示例,您可以找到here