Осциллографический триггер Python с нарастающим / падающим фронтом - PullRequest
0 голосов
/ 16 мая 2018

Я пытаюсь обнаружить нарастающий и / или падающий фронт в векторном элементе на основе значения триггера. Это похоже на то, как работает запуск осциллографа.

Вектор 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? Или, может быть, в какой-то другой библиотеке?

Спасибо.

1 Ответ

0 голосов
/ 16 мая 2018

Мы могли бы нарезать 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])
...