1

我正在测量并行端口上生成的信号有多稳定。

我们从示波器生成的 CSV 文件中导入了 numpy 数组。以下输出是显示问题的剥离变体:

import numpy as np
data = np.array([0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0])

t = np.array([0.    ,0.0005, 0.001 ,0.0015,
     0.002 ,0.0025, 0.003 ,0.0035,
     0.004 ,0.0045, 0.005 ,0.0055,
     0.006 ,0.0065, 0.007 ,0.0075,
     0.008 ])

绘制时看起来像这样。 在此处输入图像描述

我正在寻找最干净的方法来获得冲动的持久时间作为列表中的值。

在写完这篇文章之后,我将尝试自己从头开始实施解决方案,我希望的是获得持久时间的首选方式,也许有一个我不知道的 numpy 函数?

4

4 回答 4

1

假设输入信号被去抖动,你可以循环遍历数组。

high_times = []

low_high = 0

for i in xrange(len(t) - 1):
    if data[i] == 0 and data[i+1] == 1:
        low_high = i
    elif data[i] == 1 and data[i+1] == 0:
        high_times.append(t[i] - t[low_high])

high_times是每个脉冲信号高电平所用时间的列表。

于 2012-10-30T11:11:34.577 回答
1

假设data是一个0's 和1's 的 int 数组:

1.)0这定义了从最后一个到最后一个脉冲的持续时间1

import numpy as np

idx = t[np.abs(np.diff(data)) == 1]
lasting_times = idx[1::2] - idx[::2]

2.)如果您更喜欢将持续时间定义为从第一个1到最后一个1

diff = np.diff(data)
lasting_times = t[diff == -1] - t[1:][diff == 1]

注意:无论如何,您必须处理数据的结尾,即这些解决方案假定data0...

于 2012-10-30T12:04:26.480 回答
0

假设您的数据列表仅包含 1 和 0:

print [(m.start(),m.end()) for m in re.finditer('1+', '0000111100001111')]

输出

 [(4, 8), (12, 16)]
于 2012-10-30T11:17:17.600 回答
0

使用 itertools 模块中的 groupby 可以很容易地做到这一点。

from itertools import groupby
#union of the point with duration of the point
val_dt = zip(data[:-1],t[:-1]-t[1:])
#groupby to unite similar values
steps = [ (g[0],sum( h[1] for h in g[1])) for g in groupby(val_dt,lambda s:s[0])]
print steps
#[(0, -0.002), (1, -0.002), (0, -0.002), (1, -0.002)]

从内存管理的角度来看,这种方法并不完美,但它确实有效。

于 2012-10-30T16:54:48.253 回答