3

正弦波の電圧をサンプリングするために DAQ を使用しています。サンプルをリストに保存してから、そのリストの FFT を取得しています。私の問題は、正弦波の完全な周期の FFT だけを取りたいということです。そのため、値がゼロに非常に近いリストのインデックス値を見つけて、他の値をゼロに変更できるようにしたいと考えています。

たとえば、非常に粗い正弦波を次のようにサンプリングしたとします。

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

配列を作成できるように、ゼロ (実際には 1 つおきのゼロ) を検出したいと思います。

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

もう 1 つは、ノイズがあり、サンプリング周波数が無限に大きくないため、正確にゼロの値が得られないことです。したがって、range(-0.1,0.1) などの範囲で値を探す必要があります。

numpy ライブラリを調べたところ、numpy.where() は適切なツールのように見えましたが、実装に問題があります。私は EE であり、プログラミングの経験はほとんどありません。

4

2 に答える 2

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])
于 2013-06-13T00:12:08.260 に答える
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)

insert 関数は配列の先頭に 0 を追加し、append は配列の末尾に 0 を追加します。このソリューションは、配列内の値を私が知らない別の値に置き換えるはるかにエレガントな方法があると確信していますが、私にとっては完全にうまく機能します。

于 2013-06-13T19:00:30.930 に答える