In numpy, vorrei rilevare i punti dai quali il segnale attraversa (essendo stato precedentemente) al di sotto di una certa soglia, per essere sopra una certa altra soglia. Questo è per cose come debouncing, o accurati zero crossing in presenza di rumore, eccCome trovare zero incroci con isteresi?
Ti piace questa:
import numpy
# set up little test problem
N = 1000
values = numpy.sin(numpy.linspace(0, 20, N))
values += 0.4 * numpy.random.random(N) - 0.2
v_high = 0.3
v_low = -0.3
# find transitions from below v_low to above v_high
transitions = numpy.zeros_like(values, dtype=numpy.bool)
state = "high"
for i in range(N):
if values[i] > v_high:
# previous state was low, this is a low-to-high transition
if state == "low":
transitions[i] = True
state = "high"
if values[i] < v_low:
state = "low"
vorrei un modo per fare questo senza loop sopra la matrice esplicitamente: ma io non posso pensare in alcun modo, dal momento che ogni valore di stato dipende dallo stato precedente. È possibile fare a meno del ciclo?
è possibile convertire che 'funzione hyst' a C? Grazie. – SpaceDog
@SpaceDog Si potrebbe, ma se si utilizza C è probabilmente meglio scrivere un semplice ciclo simile a quello che era nella domanda originale. Il trucco nella mia risposta è più veloce in Python, dal momento che usa un codice numerico vettoriale, invece di un lento loop Python. Il codice vettoriale deve passare più volte sui dati, mentre un semplice ciclo in C può fare tutto in un unico passaggio. –
L'ho chiesto perché sto cercando di capire cosa fa la tua funzione, quindi posso scrivere un codice in C ... – SpaceDog