mikrocontroller.net

Forum: Compiler & IDEs AD Wandlung Verstaendnisfrage


Autor: Michael Kuehn (michael1104)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>> 1

ist eine andere Schreibweise für  / 2

  ( i + j ) / 2

berechnet den Mittelwert aus i und j

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Pingelig (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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"

Autor: hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Mirko Keuner (mkeuner)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Mirko: War schneller

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: hans (Gast)
Datum:

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

eine langsamme Angleichung

gruß hans

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Warum ist das so???

Autor: Prost (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du sprichst vom Bier, du sprichst in meiner Sprache

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Du sprichst vom Bier, du sprichst in meiner Sprache
  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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.