Python 上升/下降沿示波器式触发

问题描述 投票:0回答:3

我正在尝试根据触发值检测 numpy 向量中的上升沿和/或下降沿。这有点像示波器触发的工作原理。

numpy 向量包含浮点值。触发器本身是一个浮点值。我希望它能像这样工作:

import numpy as np
data = np.array([-1, -0.5, 0, 0.5, 1, 1.5, 2])
trigger = rising_edge(data, 0.3)
print(trigger)

[3]

换句话说,它的工作方式类似于

np.where
,返回一个包含条件为真的位置的向量。

我知道我可以简单地迭代向量并得到相同的结果(这就是我正在做的),但正如你可以想象的那样,它并不理想。 numpy 中是否内置了一些可以使用优化的 C 代码来完成此操作的功能?或者也许在其他图书馆?

谢谢你。

python numpy edge-detection
3个回答
11
投票

我们可以对

one-off
进行切片,并与触发器进行比较以判断是否小于和大于,就像这样 -

In [41]: data = np.array([-1, -0.5, 0, 0.5, 1, 1.5, 2, 0, 0.5])

In [43]: trigger_val = 0.3

In [44]: np.flatnonzero((data[:-1] < trigger_val) & (data[1:] > trigger_val))+1
Out[44]: array([3, 8])

如果您还想包含相等性,即

<=
>=
,只需将其添加到比较中即可。

要包含上升沿和下降沿,请以另一种方式添加比较 -

In [75]: data = np.array([-1, -0.5, 0, 0.5, 1, 1.5, 2, 0.5, 0])

In [76]: trigger_val = 0.3

In [77]: mask1 = (data[:-1] < trigger_val) & (data[1:] > trigger_val)

In [78]: mask2 = (data[:-1] > trigger_val) & (data[1:] < trigger_val)

In [79]: np.flatnonzero(mask1 | mask2)+1
Out[79]: array([3, 8])

6
投票

所以我刚刚观看有关卷积的最新 3Blue1Brown 视频时,我意识到了一种新的方法:

def rising_edge(data, thresh):
    sign = data >= thresh
    pos = np.where(np.convolve(sign, [1, -1]) == 1)
    return pos

因此,获取数据大于或等于阈值的所有位置,用

[1, -1]
对其进行卷积,然后找到卷积在上升沿返回 1 的位置。想要下降沿吗?而是寻找 -1。

非常整洁,如果我自己这么说的话。而且速度快了大约 5-10%。


0
投票

我在使用 microPython 为 Raspberry Pi Pico 编程时的方法是:我不断读取信号的状态(高或低)并存储起来供以后使用。当“稍后”到来时,我再次读取并比较旧信号和当前信号。

如果旧信号为高电平而电流为低电平,我知道我有一个下降沿。同样的方式,如果旧信号为低电平而电流为高电平,我知道我有一个上升沿。

这是我的看法:如何使用 Python 区分信号的下降沿?

© www.soinside.com 2019 - 2024. All rights reserved.