Forum: Digitale Signalverarbeitung / DSP / Machine Learning Ableitungs Algrythmus für uC


von RL (Gast)


Lesenswert?

Hallo Zusammen


Ich will  mein Signal (vom ADC des UC) mathematisch ableiten. ich 
benötige ich die 1" und 2" Ableitung sprich Wendepunkte und Nullstellen

vom Eingangssignal ( int 0-65000 ) Frequenz ist 0.01-2 Hz

Gibt es da Libs oder gute Beispile im Web.. leider noch nichts 
gefunden..

Gruß

RL

von peter (Gast)


Lesenswert?

Ableitung? Also Differenz zweier aufeinanderfolgender Werte?
Huch, das war ja schon die Antwort :-)
Viele Grüße
Peter

von afsd (Gast)


Lesenswert?

Zwischenfrage: Hast du dir schon Gedanken dazu gemacht wie verrauscht 
die Signale sind? Und tastet du mit 0.01-2Hz ab oder machst du ein 
Oversampling bzw. kannst du öfters Abtasten und eine Regression 
durchführen?

Differenzieren ist ansich super einfach wenn man zwei oder drei Werte 
hat die tatsächlich den realen Wert wiederspiegeln, sobald aber ein 
Rauschen reinkommt geht die eigentliche Arbeit erst los!

http://www.cbcity.de/differenzieren-verrauschter-signale-matlab-filter-differential-euler-cauchy-mittelwert-savitzky-golay

von dadada (Gast)


Lesenswert?


von marixstorm (Gast)


Lesenswert?

>>Algrythmus

Vielleich lieber gleich auch eine Rechtschreibkorrektur?

von A. S. (rava)


Lesenswert?

es ist auch recht relevant, ob du das Signal aufgenommen hast und die 
Ableitung offline bildest oder ob du zu jedem Zeitpunkt die momentanen 
Ableitungen deines Signals brauchst. Sprich: Wie viel Verzögerung ist 
erlaubt?

Falls es noch im selben Zyklus sein soll, wählt man oft die
> Differenz zweier aufeinanderfolgender Werte
Mathematisch ist das allerdings eine Approximation einer nicht 
realisierbaren Operation.

: Bearbeitet durch User
von RL (Gast)


Lesenswert?

Ich hab kurzerhand ein Code selber geschreiben

Ich lade jeweil 3 Werte vom Bewegungssensor in den Buffer und prüfe die 
Steigung:

Die Funktion gibt dann zurück ob der Schrittmotor vorwärts oder 
rückwerts soll...



// The prevous funktion read MM x values from the Gyro and Stores always 
3 Values of X movement in the buffer der_buf_1 [1]  and buf_1 [2] and 
der_buf_1 [1]  and der_buf_1 [3]
// This function analys the senors input data to dected the change 
points and filter out noise events
// the funktion give back if the next stepp with next_stepp variable
// with the global variable accel_step_var you can scale the 
acceleration of thsi function ( int values)

int derive_sensor ()



{


  if (   (der_buf_1 [1] == der_buf_1 [2]) && (der_buf_1 [1]== der_buf_1 
[3]) && (der_buf_1 [2]== der_buf_1 [3]) ) / --- = 0;
        {

         next_step= current_step;
         println("O Point");
        }

        else if ((der_buf_1 [1] > der_buf_1 [2]) && (der_buf_1 [2] 
>der_buf_1 [3])) //  \\\ = -2;
        {
         println("Down move Anti clockwise");

         next_step = current_step -2 *(accel_step_var);  // its a 1/3 
Ramp so the Multiplicator is bigger "-2" to make a greater accel
               if (next_step < 0)                        // just to be 
save the next step is not outrange
               {
               next_step = 0;
               }
        }

        else if ((der_buf_1 [1] < der_buf_1 [2]) && (der_buf_1 [2] < 
der_buf_1 [3]))//  ///  = +2
        {
           println("move Up clockwise");

            next_step = current_step + 2 *(accel_step_var);// its a 1/3 
Ramp so the Multiplicator is bigger "+2" to make a greater accel
               if (next_step > max_step)
               {
                 next_step = max_step;
               }
        }

        else if ((der_buf_1 [1] > der_buf_1 [2]) && (der_buf_1 [2] == 
der_buf_1 [3])) //    \__ = -1
        {
           println("move Up Anti clockwise low accel");

            next_step = current_step - 1 *(accel_step_var);//its a 1/2 
Ramp so the Multiplicator is just "-1"
               if (next_step > max_step)
               {
                 next_step = 0;
               }
        }


         else if ((der_buf_1 [1] == der_buf_1 [2]) && (der_buf_1 [2] < 
der_buf_1 [3])) //  --/  = +1
        {
           println("move Up clockwise low accel");

            next_step = current_step + 1 *(accel_step_var);//its a 1/2 
Ramp so the Multiplicator is just "+1"
               if (next_step > max_step)
               {
                 next_step = max_step;
               }
        }


          else if ((der_buf_1 [1] < der_buf_1 [2]) && (der_buf_1 [2] == 
der_buf_1 [3]))//    /-- = +1
        {
           println("move Up clockwise low accel");

            next_step = current_step + 1 *(accel_step_var);//its a 1/2 
Ramp so the Multiplicator is just "+1"
               if (next_step > max_step)
               {
                 next_step = max_step;
               }
        }



          else if ((der_buf_1 [1] == der_buf_1 [2]) && (der_buf_1 [2] > 
der_buf_1 [3])) // --\ = -1
        {
           println("move Up clockwise low accel");

            next_step = current_step - 1 *(accel_step_var);//its a 1/2 
Ramp so the Multiplicator is just "+1"
               if (next_step > max_step)
               {
                 next_step = max_step;
               }
        }

        else                                         // actuall her eis 
filtering out if buf [2] is the biggest -> noise filter
        {                                            // - = 0;

         next_step= current_step;
         println("filtering");

        }



       /// Savety check to provide outrange variables
        if (next_step > max_step)
               {
                 next_step = max_step;
               }

         if (next_step < 0)
               {
                 next_step = 0;
               }

return next_step;                                // returns Next stepp 
for the stepper ( from 0-> max_steps
}

von RL (Gast)


Lesenswert?

oh Sorry das Sensor Werte sidn circa im 0.1-2 Hz Breich die Samplingrate 
der Werte sind alle 10 ms also 0.01 HZ

Gruß

RL

von Christoph db1uq K. (christoph_kessler)


Lesenswert?

Es gibt Berechnungswege für Digitalfilter (FIR und IIR) als 
"Differentiator"
z.B im "Handbook for DSP" ISBN 9780471619956 Kapitel "Special filters"
auf Seiten 931-940, bei Amazon look-inside leider nicht einsehbar

Da wird der Frequenz- und Phasengang des idealen Differenzieres 
angenähert.

Der Matlab-Befehl "remez" kennt den Zusatz 
"B=REMEZ(N,F,M,'differentiator'), für GNU Octave gibt es auch eine 
Zusatzlibrary, die das kann:

(http://www.mikrocontroller.net/articles/Hilbert-Transformator_%28Phasenschieber%29_mit_ATmega#Der_Hilbert-Transformator.2C_ein_Breitband-90_Grad-Phasenschieber
danke dem Wiki-Mitstreiter der diese Info eingetragen hat ->)

http://octave.sourceforge.net/signal/function/remez.html

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.