JavaScript Funktion in Python umwandeln

Python in C/C++ embedden, C-Module, ctypes, Cython, SWIG, SIP etc sind hier richtig.
Antworten
DoGro
User
Beiträge: 15
Registriert: Montag 23. Mai 2022, 07:18

Guten Tag,

vielleicht ist jemand hier, der mir helfen kann.

ich möchte für den MX30102 die Herzrate errechnen.
Dafür habe ich die Werte aufgenommen und erhalte einen gewissen Offset, den ich mithilfe des IIR-Filters eliminieren möchte.

http://sam-koblenski.blogspot.co.uk/201 ... c-and.html

Diesen JS - Code würde ich gerne umschreiben:

Code: Alles auswählen

#x: Messwert
#w: aufsummierte Zwischenwerte ???

function dcRemoval(x, w, alpha) {
  var w_n = x + alpha*w;
  return { w: w_n, y: w_n - w };
}
prev = dcRemoval(signal, prev.w, 0.9);

Code: Alles auswählen

def dcRemoval(x, w, alpha=0.9):
    w_n = x + alpha*w
    y = w_n - w
    return y
    
#Hauptprogramm
ir_result = datenspeicherung(iR_daten)
for messwert, i in enumerate(ir_result):
    print(dcRemoval(messwert, i))
Genau an der stelle Scheitere ich dann, da ich nicht genau weiß, wie ich diese prev.w umsetzen kann.

So bekomme ich den wandernden Offset leider nicht weg.
Werte vorher:
  • 99943
    117401
    117363
    117337
    117308
    117291
    117279
    117262
    117238
    117218
    117209
Nachher:
  • -9994.305
    -11739.1
    -11734.3
    -11730.7
    -11726.8
    -11724.1
    -11721.91
    -11719.2
    -11715.8
    -11712.8

Mit den beiden Formeln:
w(t) = x(t) + α·w(t-1)
y(t) = w(t) - w(t-1)

War mein Ansatz eine rekursive Funktion:

Code: Alles auswählen

#Entfernen des Offsets der Werte mithilfe des Filters IIR
def dcRemoval(x, w=0, alpha=0.9):
    if w == 1:
        return 1
    else:
        w = x + alpha * dcRemoval(w-1)
    return w - (w-1)
     
Leider ist natürlich die Rekursionstiefe beschränkt.
"RuntimeError: maximum recursion depth exceeded"

Ich habe ca. 250 Messdaten.

Hoffe auf einen Denkanstoß.
Dankeschön
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

prev.w ist einfach nur der vorherige Wert w, das geht aus dem Blogpost doch klar hervor:

"""
The function needs to return both the output value and the intermediate value w so that it can be provided to the next function call.
"""

Der Returnwert ist ein Objekt (in Python dict, oder eine Data-Class, wenn du willst), und .w ist nur der Wert der Berechnung zuvor. Die Filterfunktion ist ja ein IIR, sprich die kann einfach immer ueber die aktuellen Samples laufen. Rekursion ist da natuerlich nicht das Mittel der Wahl, eine einfach for-Schleife reicht.

Alles was bleibt ist ein Anfangswert-Problem. Da kann man 0 oder den ersten Wert der Samplereihe benutzen.
Benutzeravatar
sparrow
User
Beiträge: 4361
Registriert: Freitag 17. April 2009, 10:28

@DoGro: Ohne zu wissen, wie die Struktur der Eingangsdaten aussieht: Es könnte in Pyhton auch sinvoll sein, der Funktion ein iterierbares Objekt zu übergebnen und einen Generator zurück zu geben.
Sirius3
User
Beiträge: 18051
Registriert: Sonntag 21. Oktober 2012, 17:20

Du berechnest ein aktuelles w aus einem vorherigen w:

Code: Alles auswählen

def remove_dc(signal, previous_w, alpha):
    current_w = signal + alpha * previous_w
    filtered_signal = current_w - previous_w
    return current_w, filtered_signal

alpha = 0.9
current_w = ir_result[0] / (1 - alpha)
for messwert in ir_result[1:]:
    previous_w = current_w
    current_w, filtered_signal = remove_dc(messwert, previous_w, alpha)
    print(filtered_signal, current_w)
Benutzeravatar
__blackjack__
User
Beiträge: 13533
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@DoGro: ``for messwert, i in enumerate(ir_result):`` ist auch falsch, denn hier ist `messwert` eine fortlaufende Zahl und `i` der jeweilige Wert aus `ir_result`.

Code: Alles auswählen

- (void)countSheep {
    unsigned int sheep = 0;
    while ( ! [self isAsleep]) { ++sheep; }
}
DoGro
User
Beiträge: 15
Registriert: Montag 23. Mai 2022, 07:18

Hallo,

ja Entschuldigung.
ir_Daten ist der Sensor, dieser liefert dann Werte in nA wieder. Diese werden dann in Listenform als ir_result gespeichert.
Der Inhalt von ir_result sind die geposteten "Daten vorher".
__blackjack__ hat geschrieben: Donnerstag 8. Juni 2023, 09:25 @DoGro: ``for messwert, i in enumerate(ir_result):`` ist auch falsch, denn hier ist `messwert` eine fortlaufende Zahl und `i` der jeweilige Wert aus `ir_result`.
Danke __blckjack__ da ist mir wohl ein riesiger Flüchtigkeitsfehler unterlaufen. :oops:

Vielen Dank euch allen dieser Part ist wohl der Schlüssel für mich gewesen:
'previous_w = current_w'
Antworten