Forum: Compiler & IDEs AD Wandlung Verstaendnisfrage


von Michael K. (michael1104)


Lesenswert?

Hi,

ich habe eine Frage zu den folgenden Zeilen:

for (i=0;i<4;i++)
{
    analog_int[i] = ( analog_int[i] + analog_input[i] ) >> 1 ;

}

analog_input ist der AD Wert, analog_int sind die internen Werte.

Was passiert in der for Schleife?


Vielen Dank schonmal

von Karl H. (kbuchegg)


Lesenswert?

>> 1

ist eine andere Schreibweise für  / 2

  ( i + j ) / 2

berechnet den Mittelwert aus i und j

von Gast (Gast)


Lesenswert?

Hi,

nicht viel :-)

Der Wert in analog_int[i] wird addiert und dann mit einem shift durch 2 
dividiert.

Der Wert in analog_int[i] wird sich nicht ändern.

von Karl H. (kbuchegg)


Lesenswert?

Lies dir auch mal den Thread durch

Beitrag "Kleine NewBee Frage - Rechenoperation ">>=1" gleich "/2"?"

und dann ersetzt du das >> 1 ganz flugs durch / 2

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

> analog_int[i] = ( analog_int[i] + analog_input[i] ) >> 1 ;
Das ist eine Filterfunktion (ähnlich einem RC-Glied).
Der gespeicherte Wert wird mit dem neu dazugekommenen gemittelt.

von Pingelig (Gast)


Lesenswert?

>> analog_int[i] = ( analog_int[i] + analog_input[i] ) >> 1 ;

>Das ist eine Filterfunktion (ähnlich einem RC-Glied).
>Der gespeicherte Wert wird mit dem neu dazugekommenen gemittelt.

Sollte es.. Macht es aber nicht. Da für alle Zugriffe auf das Array [i] 
verwnedet wurde. Normaler weise sollte da  in der Berechnung ein [i-1] 
verwendet werden.

Obiges Bsp. macht absolut keinen Sinn, ein Compiler darf das sogar "Weg 
optimieren"

von hans (Gast)


Lesenswert?

@Pingelig: Woher weist du das????

Es können 4 Kanäle sein (i=0 bis 3). Mit der Schleife werden alle
vier internen Messwerte (analog_int[]) mit dem aktuellen Messwert
(analog_input[]) verrechnet. D.H. wie ben geschrieben eine
Art Filter über Mittelwert.

Dein i-1 ist also Schrott, zumal 0-1 = -1 auserhalb des Arrays liegt!

gruß hans

von Mirko K. (mkeuner)


Lesenswert?

Pingelig wrote:
>>> analog_int[i] = ( analog_int[i] + analog_input[i] ) >> 1 ;
> Sollte es.. Macht es aber nicht. Da für alle Zugriffe auf das Array [i]
> verwnedet wurde. Normaler weise sollte da  in der Berechnung ein [i-1]
> verwendet werden.

Wenn ich nicht irgendeinen Tippfehler uebersehe, dann ist das in C sehr 
wohl ein funktionierendes AR-Filter (IIR-Filter) ersten Grades.

Genau genommen sind es 4 separate AR-Filter, fuer 4 separate 
Eingangssignale. Und hier liegt wahrscheinlich der Kern, warum 
"Pingelig" etwas anderes darunter versteht. i ist nicht die Zeit, 
sondern ein Index ueber unterschiedliche Groessen.

von hans (Gast)


Lesenswert?

@Mirko: War schneller

von Michael (Gast)


Lesenswert?

Aber welcher Wert ist in analog_int[i] gespeichert, wenn der Anfangs =0 
ist.
Beim ersten Schleifendurchlauf, ist der 0, beim zweiten dann = AD wert 
oder?

von hans (Gast)


Lesenswert?

Nein. 1 -> 0
      2 -> wert * 1/2
      3 -> wert * 3/4

eine langsamme Angleichung

gruß hans

von Michael (Gast)


Lesenswert?

Warum ist das so???

von Prost (Gast)


Lesenswert?

Du hast einen Eimer und ein Glas Bier. Du kippst das Bier in den Eimer 
und kippst die Häfte weg => halbes Bier
Danach kippst du ein neues Glas rein und kippst aus dem Eimer die Hälfte 
weg => 3/4 Bier etc. Der einziger Unterschied bei deiner Operation: Das 
Glas muss nicht immer gleich Gross sein ;-) Finde ich jetzt nicht so 
schwer

von Michael (Gast)


Lesenswert?

Du sprichst vom Bier, du sprichst in meiner Sprache

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

> Du sprichst vom Bier, du sprichst in meiner Sprache
1
  eimer = (eimer + bier)/2;
So besser?

                         Eimer +  Bier   ==> :2
Nach dem 1. Durchlauf:    0    +   1     ==>  1/2
Nach dem 2. Durchlauf:    1/2  +   1     ==>  3/4
Nach dem 3. Durchlauf:    3/4  +   1     ==>  7/8
Nach dem 4. Durchlauf:    7/8  +   1     ==>  15/16
Nach dem 5. Durchlauf:   15/16 +   1     ==>  31/32

Und jetzt sieht es jeder:  Das ist eine e-Funktion.

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.