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
Ableitung? Also Differenz zweier aufeinanderfolgender Werte? Huch, das war ja schon die Antwort :-) Viele Grüße Peter
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
afsd schrieb: > http://www.cbcity.de/differenzieren-verrauschter-signale-matlab-filter-differential-euler-cauchy-mittelwert-savitzky-golay Super link!
>>Algrythmus
Vielleich lieber gleich auch eine Rechtschreibkorrektur?
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
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
}
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.