Dla progów N występuje poziom N + 1. przejazdy stwierdzono za pomocą następujących czynności:
- iterację wszystkich próbkach, a następnie wartości progowych
- Sprawdź aktualny poziom i próbki do przejścia przez porównanie produktów kombinacji wartości bezwzględne, np : abs (y1) * y0! = Y1 * abs (y0).
- Jeśli doszło do przekroczenia poziomu, wartość x przecięcia znajduje się za pomocą równania liniowego.
- Polaryzacja nachylenia informuje, czy przejście pochodziło z poziomu poniżej lub powyżej, wskazując aktualny poziom.
Następujące funkcje realizuje się powyżej
def quantizer(time,voltage,thresholds):
x0=time[0]; y0=voltage[0];
l0 = 0
for level,thresh in enumerate(thresholds):
l0 = level if y0>thresh else l0
xings=[tuple([x0,l0])]
for x1,y1 in zip(time[1:],voltage[1:]):
xings_i=[]
dy=y1-y0
dx=x1-x0
dy_dx = dy/dx
for level,thresh in enumerate(thresholds):
y1s=y1-thresh
y0s=y0-thresh
if dy!=0:
if abs(y1s)*y0s!=y1s*abs(y0s):
xings_i.append(tuple([x0-y0s/dy_dx,level+1*(dy_dx>0)]))
xings_i.sort(key=lambda tup: tup[0])
xings+=xings_i
x0=x1
y0=y1
return xings
następujące komponenty były stosowane do testowania funkcji:
time = [ 0, 1, 2, 3, 4 ]
voltage = [-2.0,-1.2, 2.0, 1.1,-4.0]
thresholds = [-0.25,0.3]
Poziomy powrotu tej funkcji są podpisane i rozpocząć od zera więc wynik funkcji jest przesunięty w dół o jeden:
def main():
for t,level in quantizer(time,voltage,thresholds):
print(str(round(t,2)) + "\t" + str(level-1))
Wyniki wyglądają następująco:
0 -1
1.3 0
1.47 1
3.16 0
3.26 -1
Wygląda na to, że rozwiązanie jest już uporządkowane; wystarczy, że przekręcisz skrzynie, by kodować bezpośrednio. Czy masz jakiś inny problem z ustaleniem progu? –
Już znasz zachowanie, które chcesz, więc możesz po prostu napisać funkcję, która implementuje to zachowanie i mapuje je na twoje dane? – user3030010
Wspominam, że nie jestem pewien, jak to zrobić, aby policzyć wszystkie pozycje w śladzie, w których próg jest spełniony, a nie tylko pierwszy przypadek, który 'np.interp()' zwraca – 8765674