Numerische Ableitung von Echtzeitwerten



  • Hallo,

    ich zeichne Sensordaten auf und möchte in Echtzeit für jeden Zeitschritt eine möglichst präzise Ableitung haben. Mein Problem ist, dass ich keine Werte aus der Zukunft kenne, sondern nur aus der Vergangenheit. Was ist da die beste Methode?



  • Also möchtest du die Steigung zwischen zwei Datenpunkten haben?

    Sonst schau mal hier: https://de.wikipedia.org/wiki/Numerische_Differentiation

    P.S. Ich weiß nicht was die beste Methode für dich ist 😉



  • Plotos schrieb:

    Hallo,

    ich zeichne Sensordaten auf und möchte in Echtzeit für jeden Zeitschritt eine möglichst präzise Ableitung haben. Mein Problem ist, dass ich keine Werte aus der Zukunft kenne, sondern nur aus der Vergangenheit. Was ist da die beste Methode?

    y_n-y_(n-1)/delta_t wäre in dem Fall wohl das naheliegendste. Mathematisch gesehen nähert sich der Wert immer mehr der tatsächlichen Steigung an, wenn man delta_t gegen 0 gehen lässt. Ob das genau genug ist, hängt von deiner Aufgabe ab, genauso, ob du an delta_t schrauben kannst oder nicht.

    Zwecks in die Zukunft schauen: eingeschränkt ist das schon möglich, kommt halt aufs Signal drauf an. Oft sind zwei benachbarte Funktionswerte stark korreliert, sodass der nächste Wert nicht zufällig ist. Man kann z.B. Recurrent Neural Networks dafür verwenden.



  • Plotos schrieb:

    ich zeichne Sensordaten auf und möchte in Echtzeit für jeden Zeitschritt eine möglichst präzise Ableitung haben. Mein Problem ist, dass ich keine Werte aus der Zukunft kenne, sondern nur aus der Vergangenheit. Was ist da die beste Methode?

    Ich würde versuchen, die Koeffizienten eines FIR Filters zu bestimmen, damit das Filter genau das macht, was Du willst. Sei s_n der zuletzt vom Sensor gemessene Wert, s_{n-1} der davor, u.s.w. Dann berechnest Du die gewünschte Ableitung "a_n" so:

    a_n=_i=0p1snicia\_n = \sum\_{i=0}^{p-1} s_{n-i} * c_i

    wobei p die Zahl der FIR-Koeffizienten ci sind. Das ist ein lineares Filter. Die optimale Wahl von p und der ci hängt u.a. von der Statistik Deiner Signale ab. Man kann hier berücksichtigen, wie die Spektren deines Nutzsignal und des Messrauschens aussehen.

    Für die Berechnung solcher Filterkoeffizienten gibt es mehrere Ansätze.

    Wenn man zum Beispiel ein einfaches lineares physikalisches Modell für das Signal hat, könnte man einen Kalman-Filter benutzen. Das habe ich auf der Arbeit auch schon gemacht, um anhand von vergangenen Positionsmessungen zu schätzen, wo sich etwas hinbewegen wird. Da steckt ja quasi auch eine Ableitung drin (die Geschwindigkeit oder sogar vielleicht noch die Beschleunigung, je nach Bewegungsmodell).

    Wenn Du die Information darüber, was das für Signale sind, in Form von Spektren hast, könnte man sich einen entsprechenden Wiener-Filter bauen.

    Dann gibt es noch die Savitzky-Golay-Filter. Da könntest Du mit verschiedenen Parametern rumspielen, um den Filter zu finden, der dir am besten passt. Bei dieser Art von Filter kann man auch noch mit Gewichtsfunktionen spielen.

    Beispiel-Matlab-Code für SG-Filter, die nur Daten aus der Vergangenheit nutzen:

    p = 5;    % Zahl der Koeffizienten
    w = 0.1;  % Gewicht des ältesten Messwertes auf den Polynom-Fit
    k = 2;    % Polynom-Ordnung
    d = 1;    % Ableitung (0=gar nicht, 1=erste, u.s.w., höchstens k)
    
    if k+1>p
        error('k+1 <= p !!!');
    end;
    if d>k
        error('d <= k !!!');
    end;
    
    x = (-p+1:0)';
    w = exp(log(w)/(p-1)^2*x.^2);  % Gewichtung per Gauss-Fenster
    M = vander(x);
    M = M(:,end-k:end).*repmat(w,1,k+1);
    [U,S,V] = svd(M,0);
    P = V*inv(S)*U'*diag(w);
    c = fliplr(P(end-d,:)) * factorial(d)
    
       1.141907  -0.999935  -0.351638   0.135452   0.074213
    

    Dieser Filter kann eine Parabel perkeft ableiten und macht darüber hinaus auch noch ein bisschen Rauschunterdrückung bei höheren Frequenzen. Vielleicht passt Dir das ja.