手动fft没有给我与fft相同的结果

时间:2014-03-04 12:58:18

标签: python python-2.7 numpy fft

import numpy as np
import matplotlib.pyplot as pp

curve = np.genfromtxt('C:\Users\latel\Desktop\kool\Neuro\prax2\data\curve.csv',dtype =     'float', delimiter = ',')
curve_abs2 = np.empty_like(curve)
z = 1j
N = len(curve)
for i in range(0,N-1):
    curve_abs2[i] =0
    for k in range(0,N-1):
        curve_abs2[i] += (curve[i]*np.exp((-1)*z*(np.pi)*i*((k-1)/N)))

for i in range(0,N):
    curve_abs2[i] = abs(curve_abs2[i])/(2*len(curve_abs2))

#curve_abs = (np.abs(np.fft.fft(curve)))
#pp.plot(curve_abs)
pp.plot(curve_abs2)
pp.show()

#背后的代码给了我3个值。但这只是......不同

错误^^此代码:http://www.upload.ee/image/3922681/Ex5problem.png

正确使用numpy.fft.fft():http://www.upload.ee/image/3922682/Ex5numpyformulas.png

1 个答案:

答案 0 :(得分:2)

有几个问题:

  1. 您正在为curve_abs2的元素分配复杂值,因此应将其声明为复杂的,例如curve_abs2 = np.empty_like(curve, dtype=np.complex128)。 (我建议使用名称,比如curve_fft而不是curve_abs2。)

  2. 在python中,range(low, high)提供序列[low, low + 1, ..., high - 2, high - 1],因此您必须使用range(0, N - 1)而不是range(0, N),而range(N)可以简化为z = 2j如果你愿意的话。)

  3. 您的公式中缺少2因子。您可以使用curve

  4. 解决此问题
  5. 在内部循环中求和的表达式中,您将curve[i]编入索引curve[k],但这应该是k

  6. 同样在该表达式中,您不需要从k中减去1,因为k循环的范围是0到N - 1。

  7. 因为N(k-1)/N是整数而你使用的是Python 2.7,所以表达式k中的除法将是整数除法,并且你将获得0 k / float(N)。要解决此问题和上一个问题,您可以将该字词更改为curve_abs2

  8. 如果你解决了这些问题,当第一个双循环结束时,数组np.fft.fft(curve)(现在是一个复杂的数组)应该与{{1}}的结果匹配。它不会完全相同,但差异应该非常小。

    你可以使用numpy矢量化计算完全消除这个双循环,但这是另一个问题的主题。