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
答案 0 :(得分:2)
有几个问题:
您正在为curve_abs2
的元素分配复杂值,因此应将其声明为复杂的,例如curve_abs2 = np.empty_like(curve, dtype=np.complex128)
。 (我建议使用名称,比如curve_fft
而不是curve_abs2
。)
在python中,range(low, high)
提供序列[low, low + 1, ..., high - 2, high - 1]
,因此您必须使用range(0, N - 1)
而不是range(0, N)
,而range(N)
可以简化为z = 2j
如果你愿意的话。)
您的公式中缺少2因子。您可以使用curve
。
在内部循环中求和的表达式中,您将curve[i]
编入索引curve[k]
,但这应该是k
。
同样在该表达式中,您不需要从k中减去1,因为k
循环的范围是0到N - 1。
因为N
和(k-1)/N
是整数而你使用的是Python 2.7,所以表达式k
中的除法将是整数除法,并且你将获得0 k / float(N)
。要解决此问题和上一个问题,您可以将该字词更改为curve_abs2
。
如果你解决了这些问题,当第一个双循环结束时,数组np.fft.fft(curve)
(现在是一个复杂的数组)应该与{{1}}的结果匹配。它不会完全相同,但差异应该非常小。
你可以使用numpy矢量化计算完全消除这个双循环,但这是另一个问题的主题。