Ableitungs Algrythmus für uC

Gast #3345852
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
Gast
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
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.
Gast
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
}
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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 13 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.