kann jemand mir diese C codestück überprüfen ?

#784499
Lesenswert?

Hallo,
kannst du bitte in meinem untenstehenden schauen , ob es so gut laufen 
wird ?
 Für Gegenvorschlag , oder korrektur werde ich mich freuen

eine ungefilterte temperatur bekomme ich von einem sensor ständig, und 
möchte es filtern

-->Eingangswert begrenzen
-->Temperatur mittelwert der erste sekunke möchte ich frieren
--> und dann alle 5 sekunden temperaturmittelwert berechnen und 
vergleichen mit anfangstemp(der ersten sekunde) wenn 1 ° höher und fzg 
geschw über 20 kmh will ich anfangstemp  um 1 grad erhöhen
wenn um mindestens 1° kleiner reduziere ich es um 1° sonst behalte ich 
die alte anfangstemp.

freue mich auf schnelle antwort.

Grüß





//sampling time 100 msec
// aussen_temp eingangssignal temperatur
u8 k = 0;
u8 l = 0;
si16 temp_start = 0;
si8 temp_old = 0;
si16 temp_middle = 0;
si16 temp_middle_5s = 0;
si8 temp_array1[10];  //  werte für das erste sekunde
si8 temp_array2[50];  // werte für 5 sekunden (50 * 100 msec loop)
u8 temp_cnt1 = 0;
u8 temp_cnt2 = 0;
bool_T counter_valid = TRUE;
si8  aussen_temp_filt = 0;



//sampling time 100 msec
{
// eingangsdaten begrenzen
   if(aussen_temp  < -10)
   {
     aussen_temp = -10;
   }
   if(aussen_temp > 40)
   {
     aussen_temp = 40;
   }
// Calculation of temperature middle value at start , just for the first 
second.
   if((temp_cnt1 < 11)&&(counter_valid))
   {
      for(k=1; k<11; k++)
      {
         temp_array1[k] = aussen_temp;
         temp_start = (temp_start + temp_array1[k])/k;
      }
      temp_cnt1++;
   }
   else
   {
      counter_valid = FALSE;
   }

// Calculation of temperature middle value for every five second 
(continuously)
   if( temp_cnt2 < 50)
   {
      for( l=0; l<50; l++)
      {
         temp_array2[l] = aussen_temp;
         temp_array2[l + 1] = temp_array2[l];

         temp_middle = temp_middle + temp_array2[l];
      }
      temp_cnt2++;
   }
   else
   {
      temp_middle_5s = temp_middle/50;
      temp_cnt2 = 0;
   }

//increasing - decreasing of the temperature ( filtered)
   if(temp_middle_5s >(temp_start + 1))
   {
      if(geschw_kmh > 20)
      {
        temp_start = temp_start + 1;
      }
   }
   else if (temp_middle_5s <(temp_start - 1))
   {
      temp_start = temp_start + 1;
   }
   else
   {
      temp_start = temp_start;
   }

 aussen_temp_filt = temp_start;
}
#784506
Lesenswert?

> freue mich auf schnelle antwort.

Morgen Abgabetermin an der Uni?

Das Ding würde bei mir schon wegen Formalien durchfallen. Zu viele 
Magic-Numbers im eigentlichen Quelltext:
1
temp_cnt1 < 11)&&(counter_valid))
2
   {
3
      for(k=1; k<11;
etc.
Gemisch aus deutsch-englischen Variablennamen (Bsp.: temp_middle, aber 
aussen_temp oder geschw_kmh) und Kommentaren
1
// werte für 5 sekunden
2
/*** Calculation of temperature middle value

Wenn schon Kommentare in Deutsch, dann wenigstens in anständiger Groß- 
und Kleinschreibung ("Werte" und "Sekunden", nicht "werte" und 
"sekunden"). Insgesamt sieht der Quelltext so aus, als ob von irgendwo 
kopiert und dann "verbessert" wurde.

Wie gesagt, schon deshalb könntest du bei mir damit wieder gehen.

Dann kämen in der nächsten Runde die Programmierfehler. temp_array1 und 
temp_array2 laufen über. Damit Note 5.0, tschüss.
Persönliche Seite #784515
Lesenswert?

Ralph Ralph wrote:
> Danke für dein antwort Stefan
>
> es geht eigentlich um die tatsächlichen kodierung
> Funktionsname ist im moment nicht sehr wichtig
>
> Kannst du bitte drin schauen mir bescheid sagen ?

Worin?

Ich sehe keine verbesserte Version von dir.

Wichtig:
Auch die Fehler und Unschönheiten verbessern, die Hannes Jaeger gefunden 
hat!
#784525
Lesenswert?

Ich kann sie korrigieren, werde das aber nicht. Das ist deine Arbeit die 
du vermutlich morgen abgeben musst, gell?

Ich weiß auch, das sich hier schon ein Trottel finden wird, der das 
mach. Doch ich mache es nicht.

Warum ich das nicht mache? Schon mal mit unfähigen Leuten arbeiten 
müssen? Es ist kein Spaß mit Leuten arbeiten zu müssen, die zwar auf dem 
Papier irgendwas können (z.B. C Programmieren) aber die ihren Schein nur 
deshalb bekommen haben, weil andere ihre Programme geschrieben haben. Da 
darf man  deren Arbeit zusätzlich machen und mit Überstunden deren 
Fehler ausbessern.

Unsere Branche ist voll von Leuten, die da nicht rein gehören (HTML 
"Programmierer"), aber alle Papiere haben, dass sie angeblich 
programmieren können. Irgendwann reicht es einem da.
Persönliche Seite #784562
Lesenswert?

Wenn du die Dateiendung .c abschneidest, kann der Compiler nichts damit 
anfangen. Also solltest du das hier auch nicht machen.

OK. Das ist also fast das Original. Fast, weil die Includedatei mit den 
Typedefs für u8, si8, bool_T und si16 noch fehlt.

> kannst du mir bitte erklären wieso laufen temp_array1 und temp_array2?

Wieviele Elemente haben temp_array1 und temp_array2 laut Definition und 
wie werden Elemente in Arrays in C indiziert?
1
si8 temp_array1[10];  //  data for the first second
2
si8 temp_array2[50];  //  data for 5 seconds (50 * 100 msec loop)

Und welche Elemente werden hier angesprochen, wenn k = 10 ist oder l = 
49 ist?
1
      for(k=1; k<11; k++)
2
      {
3
         temp_array1[k] = outer_temp;
4
                     ^
5
         temp_start = (temp_start + temp_array1[k])/k;
6
                                                ^
7

8
      for( l=0; l<50; l++)
9
      {
10
         temp_array2[l + 1] = temp_array2[l];
11
                     ^^^^^
Angehängte Dateien:
#784585
Lesenswert?

Hallo

für includes ist alles klar, woanders behandelt...

temp_array1 soll 10 elemente haben ( 1 sekunde lang a 100msec. sampling)
temp_array2 soll 50 elemente haben ( 5 sekunde lang a 100msec. sampling)


hier wollte ich eigentlich Mittelwert berechnen und verhindern dass ich 
durch 0 dividiere(erste Durchlauf.....)
      for(k=1; k<11; k++)
      {
         temp_array1[k] = outer_temp;
                     ^
         temp_start = (temp_start + temp_array1[k])/k;
      }
ist das richtig?
      for(k=0; k<10; k++)
      {
         temp_array1[k] = outer_temp;
                     ^
         if(k!=0) temp_start = (temp_start + temp_array1[k])/k;
      }


                                                ^
ja, hier stimmt auch nicht...
      for( l=0; l<50; l++)
      {
         temp_array2[l + 1] = temp_array2[l];
      }

ist das richtig jetzt?
      for( l=0; l<49; l++)
      {
         temp_array2[l + 1] = temp_array2[l];
      }

Mfg.
Persönliche Seite #784619
Lesenswert?

Ralph Ralph wrote:

> hier wollte ich eigentlich Mittelwert berechnen und verhindern dass ich
> durch 0 dividiere(erste Durchlauf.....)
> ...
> ist das richtig?
>       for(k=0; k<10; k++)
>       {
>          temp_array1[k] = outer_temp;
>                      ^
>          if(k!=0) temp_start = (temp_start + temp_array1[k])/k;
>       }

Formal ja, um die Division durch 0 zu umgehen.

Von der Rechenvorschrift aus nicht. Du beziehst ein Element 
(temp_array1[0]) nicht in die Mittelwertbildung ein. Du gewichtest also 
temp_start stärker und den aktuellen Messwert outer_temp schwächer als 
vorher.

Ich würde das so machen:
1
      for(k=0; k<10; k++)
2
      {
3
         temp_array1[k] = outer_temp;
4
         temp_start = (temp_start + temp_array1[k])/(k+1);
5
      }

> ist das richtig jetzt?
>       for( l=0; l<49; l++)
>       {
>          temp_array2[l + 1] = temp_array2[l];
>       }

Formal findet in diesen Zeilen kein Arrayüberlauf mehr statt. Für dein 
Programm fehlen ein paar Codezeilen.

Selbst mit den vorher vorhandenen Zeilen und Korrektur der 
Variablennamen, kann ich die Rechenvorschrift dahinter nicht sehen.

Wann wird temp_middle zurückgesetzt? Es kann ja nicht sinnvoll sein, 
dass temp_middle endlos aufaddiert wird.

Welchen Wert hat temp_middle_5s in den ersten 5s und ist das sinnvoll?

Ich vermute, dass du bei den Variablendefinitionen globale Variablen mit 
lokalen Variablen der Funktion temp_filter() gemischt hast.
#784649
Lesenswert?

Hi,
danke für den ersten Vorschlag
klar verstanden...

für das zweites teil will ich eigentlich alle 5 sekunden ein Wert 
berechnen und für die letzte phase in temp_middle_5s schreiben und durch 
50 dividieren.
meine interne Berechnung muss ich dann zurücksetzen, damit ich für die 
nächste 5 s eine neue mittelwert berechne... das zurücksetzen von 
temp_middle  hat gefehlt

wäre es so ok ?
   if( temp_cnt2 < 50)
   {
      for( l=0; l<50; l++)
      {
         temp_array2[l] = aussen_temp;
         temp_array2[l + 1] = temp_array2[l];

         temp_middle = temp_middle + temp_array2[l];
      }
      temp_cnt2++;
   }
   else
   {
      temp_middle_5s = temp_middle/50;
      temp_cnt2 = 0;
      temp_middle = 0;//neue zeile
   }
#784774
Lesenswert?

Hi Stefan,

ich habe noch einem besseren vorschlag
mit werte für temp_middle_5s bei t < 5s
und reset von temp_middle

bitte schau es mal und melde dich


   /*** Calculation of temperature middle value for every five 
second.***/
   if( A2OUT_temp_cnt2 < 50)
   {
      for( l=0; l<49; l++)
      {
         temp_array2[l] = A2OUT_aussen_temp;
         temp_array2[l + 1] = temp_array2[l];

         temp_middle = (temp_middle + temp_array2[l]);
      }
      if(erste_five_min)// value for the first 5 sec.
      {
         temp_middle_5s = temp_start;
      }
      A2OUT_temp_cnt2++;
   }
   else
   {
      temp_middle_5s = temp_middle/50;
      A2OUT_temp_cnt2 = 0;
      erste_five_min = FALSE;
      temp_middle = 0; // zurücksetzen nach 5 sec.
   }
Persönliche Seite #784824
Lesenswert?

Erstmal Sorry!

Der Code mit temp_start ist nicht OK. Ich hatte mich nur an deiner 
Umgehung von Div/0 orientiert und was formal besseres formuliert. Er ist 
aber nicht richtig, um einen Mittelwert zu bilden.

Der neue Code gefällt mir nicht.

Ich befürchte, die Codebearbeitung artet in Fummelei aus, ohne dass die 
Aufgabenstellung durchdacht ist. Ein Anzeichen dafür ist immer, wenn 
mehr und mehr Spezialvariablen und if-Abfragen in den Code einfliessen.

Ich verstehe nicht, welchen Mittelwert du berechnen willst und warum du 
Arrays verwendest.

Angenommen du hast diese Temperaturen

10 11 12 10 11 15

und wenn man man grundsätzlich ein Arithmetisches Mittel 
(http://de.wikipedia.org/wiki/Mittelwert) nimmt, gibt es verschiedene 
Varianten:

Variante 1:
 - Initialisierung des alten Mittelwerts mit 0
 - Neuer Mittelwert = (Alter Mittelwert + Messwert)/2
(0+10/2)  (5+11)/2 (8+12)/2     (10+10)/2    (10+11)/2     (10,5+15)/2
M=5       8         10          10           10,5          12,75

Variante 2:
 - Initialisierung des alten Mittelwerts mit erstem Messwert
 - Neuer Mittelwert = (Alter Mittelwert + Messwert)/2
(10+10)/2 (10+11/2) (10,5+12)/2 (11,25+10)/2 (10,625+11)/2 
(10,8125+15)/2
M=10      10,5      11,25       10,625       10,8125       12,91

Variante 3:
 - Initialisierung des Mittelwerts unwichtig
 - Mittelwert = (Summe Messwerte)/(Anzahl Messwerte)
 - Beispiel
(10+11+12+10+11+15)/6
M=11,5

Variante 3 ist stur der Mittelwert aus den 6 Messungen. Die zeitliche 
Folge wird nicht berücksichtigt. Jede andere Reihenfolge mit den 
gleichen 6 Zahlen ergäbe den gleichen Mittelwert.

Variante 1 und 2 berücksichtigen die zeitliche Abfolge. Variante 1 
nähert sich allerdings ganz langsam und erst bei genug Messungen dem 
Mittelwert, weil die 0 aus der Initialisierung lange das Ergebnis 
beeinflusst.

Bsp. umgekehrte Messfolge bei Variante 2
15 11 10 12 11 10
(15+11/2) (13+10)/2 (11,5+12)/2 (11,75+11)/2 (11,375+10)/2
M=13      11,5      11,75       11,375       10,6875

Arrays können ins Spiel kommen, wenn du mehr als einen Messwert 
gleichzeitig in die Mittelwertberechnung einbeziehen willst 
(http://de.wikipedia.org/wiki/Gleitender_Mittelwert)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren