2014-03-04 61 views
0
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個值。但是,這只是......不同手冊FFT不給我相同的結果,FFT

錯誤^^驗證碼:http://www.upload.ee/image/3922681/Ex5problem.png

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

回答

2

有幾個問題:

  1. 您正在爲curve_abs2的元素分配複雜的值,因此它應該被聲明爲複雜的,例如curve_abs2 = np.empty_like(curve, dtype=np.complex128)。 (我會建議使用的名稱,比方說,中curve_fft代替curve_abs2

  2. 在蟒蛇,range(low, high)給人的序列[low, low + 1, ..., high - 2, high - 1],所以不是range(0, N - 1),您必須使用range(0, N)(這可以簡化爲range(N),如果你想)。

  3. 您的公式中缺少2的因子。你可以通過使用z = 2j來解決這個問題。

  4. 在內循環中求和的表達式中,您將curve編入curve[i],但這應該是curve[k]

  5. 此外,在該表達式,則不需要選自K減去1,因爲k循環範圍從0到N - 1

  6. 由於kN是整數,並且您正在使用Python 2.7 ,表達式(k-1)/N中的分數將是整數除法,所有k將得到0。要解決這個問題和之前的問題,您可以將該術語更改爲k/float(N)

如果你解決這些問題,在第一雙循環結束時,陣列curve_abs2(現在的複雜陣列)應匹配的np.fft.fft(curve)結果。它不會完全一樣,但差異應該很小。

你可以完全消除使用numpy的矢量計算方法,雙環,但這是另外一個問題的話題。

+0

工作很好,謝謝! :) – user3027316