@Stephan und Kai:
ich verwende eine ähnliche, aber bessere Methode:
Aver = Aver + ADC - (Aver >> x);
Das hat zur Folge, dass Aver auf den 2^x-fachen Wert von ADC ansteigt.
Entweder ich rechne gleich mit Aver weiter, oder teile ihn durch 2^x
(und runde) in dem Augenblick, in dem ich ihn brauche (was in der Regel
seltener als die Abtastrate ist).
Wenn ADC 16 Bit hat, bleibt nichts anderes als für Aver 24 oder 32 bit
zu verwenden.
Oder wie Wolfgang schrieb, kannst Du es auch so machen:
Aver = Aver + (ADC >> y) - (Aver >> x);
Aver ist dann im Bereich ADC * (2^(x-y))
Bei z.B. x = y = 2 reichen dann auch für Aver 16 Bit aus.
Da war ich auch schonmal versucht, sowas zu schreiben, um einen Shift zu
sparen:
Aver = Aver + ((ADC - Aver) >> x);
Aber der Effekt ist nicht wie erwünscht, Aver ist dann immer einen Tick
zu klein.
Eine andere Methode wäre ein echter Digitalfilter (Tiefpass FIR oder
IIR) ala Bessel, Butterworth, Tschebyscheff....
Der reagiert schnell auf Änderungen und filtert trotzdem gut.
Ansonsten empfehle ich immer, die Ursache zu suchen und weniger an den
Symptomen zu doktern:
Vermutlich hast Du eine Gnd-Schleife oder ähnliches, also ein
Analog-Problem. Auch die digitalen Signale (SDA und SCL) können die
Wandlung beeinflussen. Da würde ich mal jeweils auf der Treiberseite
einen Dämpfungswiderstand (10-82 Ohm) einfügen.
Welche Sprache?
Um welche Signale handelt es sich?
Welche Wandler verwendest Du?
Habe mit der ADS125x-Familie (24 Bit Delta-Sigma) sehr gute Erfahrung
gemacht (mit erhöhtem externen Aufwand 18 echte Bits bei 100 Hz).