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]

我想检测零(实际上每隔一个零),以便我可以制作数组:

[ 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,几乎没有编程经验,因此非常感谢任何帮助!

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 回答