2013-06-12 86 views
3

我正在使用DAQ來採樣正弦曲線的電壓。我將樣本存儲在一個列表中,然後對該列表進行FFT。我的問題是我只想完成正弦波的完整週期的FFT,所以我想找到值非常接近零的列表的索引值,以便我可以將其他值更改爲零。在Python中查找數組中出現特定值的索引值

舉例來說,如果我有一個非常粗略的正弦波採樣爲:

[-3, -2, -1, 0, 1, 2, 3, 4, 3, 2, 1, 0, -1, -2, -3, 4, -3, -2, -1, 0, 1, 2] 

我將要檢測的零(真每隔零),這樣我就可以使數組:

[ 0, 0, 0, 0, 1, 2, 3, 4, 3, 2, 1, 0, -1, -2, -3, -4, -3, -2, -1, 0, 0, 0] 

另一件事是,由於有噪聲,我的採樣頻率不是無限大,我不會得到完全爲零的值。因此,我需要查找範圍內的值(如範圍(-0.1,0.1))。

我看着numpy庫和numpy.where()看起來像它可能是正確的工具,但我遇到問題實施它。我是一個EE,沒有什麼編程經驗,所以任何幫助都非常感謝!

+0

你的例子不清楚。所以,你想在一定的寬容範圍內找到零。 Byt在你的例子中左邊的負數和右邊的正數出現了什麼情況? – kirelagin

+2

@kirelagin「我的問題是我只想採取完整的正弦波週期的FFT」。他希望將(包括)第一個接近零值的所有東西都歸零,並且將最後接近零值的所有東西都歸零(包括)。特別是,他只能找到第一個接近零值和最後一個接近零的值。 – Patashu

+0

@Patashu是的,這是正確的。這絕對是解釋我正在努力完成的更好的方式。 –

回答

3
>>> l = np.array([-3, -2, -1, 0, 1, 2, 3, 4, 3, 2, 1, 0, -1, -2, -3, 4, -3, -2, -1, 0, 1, 2]) 
>>> epsilon = 1 
>>> inds = np.argwhere(np.abs(l) < epsilon) # indices of 「almost zero」 items 
>>> left = inds[0] # index of the first 「almost zero」 value 
>>> right = inds[-1] # -//- last 
>>> l[:left + 1] = 0 # zero out everything to the left and including the first 「almost zero」 
>>> l[right:] = 0 # -//- last 
>>> l 
    > 
array([ 0, 0, 0, 0, 1, 2, 3, 4, 3, 2, 1, 0, -1, -2, -3, 4, -3, 
    -2, -1, 0, 0, 0]) 
0

你的回答是非常有益kirelagin,但我不得不在這裏你設置的值0。我不是很Python中經歷了部分問題,但在我看來,你不能填充一個數組像你可以在某些語言中使用等號。相反,我結束了做這樣的事情:

epsilon = 1 
    length = len(l) 
    inds = np.argwhere(np.abs(l)<epsilon) 
    left = inds[0] 
    right = inds[-1] 
    del l[:left] 
    del l[right-left+1:] 
    for x in range (0,left): 
     l.insert(x,0) 
    endzeros = length - right -1 
    for x in range (0, endzeros): 
     l.append(0) 

插入函數添加的0到數組的開頭,並追加補充的0到數組的結尾。這個解決方案對我來說工作得非常好,儘管我確信有一種更好的方法可以用一個我不知道的值替換數組中的值。