Forum: Mikrocontroller und Digitale Elektronik Programmfehler? -- Min-Maxima Suche und zeitlicher Abstand


von Großes F. (112)


Angehängte Dateien:

Lesenswert?

Hallo,

ich habe ein Problem bei der Ermittlung vom zeitlichen Abstand zweier 
Hoch- und Tiefpunkte in einem Kurvenverlauf.

Ich weiss, dass die Hoch- und Tiefpunkte jeweils maximal 10 
Messzeitpunkte auseinander liegen und habe daher ein Programm 
geschrieben, welches ein Fenster von 10 Messzeitpunkten über die 
Teilmenge meiner Messpunkte hinüberschiebt und Ort und Betrag der 
maximalen und minimalen Punkte aufzeichnet. Die Differenz beider Werte 
wird lokal ermittelt und wenn sie größer ist als die global ermittelten 
Werte, wird stets der Ort von globalem Minimum oder Maximum sowie der 
wert erneuert.
Das Fenster beginnt kurz nach dem Beginn einer einer Datenmenge (200 
Stück, beginn bei 50) und soll 25 Messzeitpunkte weit verschoben werden, 
d.h. der maximale zeitliche Abstand kann 35 Datenpunkte betragen 
(Fenster von 10 Werten und dieses wird 25 werte weit geschoben).

Anschließend wird der Abstand beider Minima und der Abstand beider 
Maxima errechnet. Zeitlich liegen zwei Messpunkte jeweils 22,7 
Millisekunden auseinander. Der Abstand wird also ermittelt und 1 Minute 
= 600000us wird durch dieses Produkt geteilt, so dass eine Frequenz 
errechnet wird.

Das Problem ist, dass der Wert, den ich dabei erhalte auf einen 
zeitlichen Abstand von ~65-70 Datenpunkten schließen lässt und ich beim 
besten Willen nicht sehe, wo der Fehler ist.
Ich meine, der Abstand kann maximal 35 werden, weil das zweite 
Maxima-Minima Paar doch erst dort beginnt ermittelt zu werden, wo das 
erste gefunden wurde.


Mehr Augen sehen mehr, Wo habe ich einen Fehler gemacht?

mfg und schonmal vielen Dank

von ... (Gast)


Lesenswert?

Hier testest du auch auf Gleichheit
if(scan<=lok_Min_1)

hier jedoch nicht
if(scan<lok_Min_2)

aber das wird wahrscheinlich nicht der Fehler sein.

von Großes F. (112)


Lesenswert?

achja,
Puls_IR ist uint16_t.


Kann diese Zeile
> Puls_IR = (600000/ (Delta_T * 227));

aufgrund des 600000er Wertes die Probleme bewirken?

von Krapao (Gast)


Lesenswert?

Bereits (Delta_T * 227) läuft über, wenn uint16_t Delta_T > 288 ist.

Teste mal:
Puls_IR = (uint16_t)(600000UL / ((uint32_t)Delta_T * 227));

von Großes F. (112)


Lesenswert?

hm ich werde die Änderung einbringen, aber ehrlich gesagt kann ich nicht 
erkennen, wie Delta_T überhaupt einen Wert größer als 35 bekommen 
sollte...

Das zweite Maximum sollte doch höchstens 25 + Fensterlänge = 35 vom 
ersten entfernt sein...

von Krapao (Gast)


Lesenswert?

Kann sein, ich habe auf Grund der Frage nach dem Ausdruck formal den 
Ausdruck bewertet aber die Programmlogik nicht nachvollzogen.

von Großes Fragezeichen (Gast)


Lesenswert?

...und was sagst du zu der Programmlogik?

logisch oder nicht logisch?


nur mal am Rande aus Verzweiflung gefragt: Kann es sein, dass ein 
Mikrocontroller trotz Klammersetzung die Punkt-Vor-Strich Regeln nicht 
beherrscht?

von Christian F. (cmf) Benutzerseite


Lesenswert?

> nur mal am Rande aus Verzweiflung gefragt: Kann es sein, dass ein
> Mikrocontroller trotz Klammersetzung die Punkt-Vor-Strich Regeln nicht
> beherrscht?

Doch das tut er :)

von Krapao (Gast)


Lesenswert?

> ...und was sagst du zu der Programmlogik?
> logisch oder nicht logisch?

Es ist heute abend für mich zu spät so eine komplexe Frage noch 
anzupacken. Lieber den Sonntag noch ruhig ausklingen lassen.

Komplex weil man komplett theoretisch an die Sache rangehen muss, also 
ob die Beschreibung eine gültige Logik enthält, dann ob die korrekt in 
Programmcode umgesetzt wurde.

Der pragmatische Weg mit Testdaten und lauffähigem Programm debuggen, 
scheidet ja mangels Testdaten und lauffähigem Programm aus.

Was beim oberflächlichen Blick auffällt ist, dass du nacheinander auf 
zwei Arrays arbeitest: Pletyrot bei der ersten Teilsuche und 
Pletyinfra bei der zweiten Teilsuche und davon steht nix in der 
Beschreibung. Auch dass die Arrays nicht komplett (also keine PLETYLANGE 
Elemente lang) durchsucht werden.

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.