Forum: Mikrocontroller und Digitale Elektronik Welchen Filter für ADC Messung


von Peter tr. (Gast)


Lesenswert?

Welcher digitale Filter ist am besten geeignet für ADC Messungen.
Und einfach realisierbar für weniger geübte Programmierer?
Wie geht man am besten vor?
Mehrere Werte im Array speichern und dann filtern?
Direkt immer zwei Werte messen und Filtern?
etc?

von EAF (Gast)


Lesenswert?

Ein Tiefpassfilter
Gleitender Mittelwert

von Peter tr. (Gast)


Lesenswert?

Es geht nur um schnelle Strom/Spannungsmessung kein Audio oder so

von Peter tr. (Gast)


Lesenswert?

"Ein Tiefpassfilter
Gleitender Mittelwert"

Gibt es da einen speziellen Namen, wonach ich suchen kann.
Also sowas wie FIR, PIR Bessel etc

von EAF (Gast)


Lesenswert?

Peter tr. schrieb:
> Gibt es da einen speziellen Namen, wonach ich suchen kann.

Ja!
z.B. "Tiefpass" oder "Gleitender Mittelwert"
!!Grrr!!

Ein Beispiel aus meiner Wühlkiste:
1
    template<typename DatenType> 
2
    class TiefpassFilter
3
    {
4
      private:
5
        const double factor;
6
        double mittelwert;
7
        
8
      public:
9
         TiefpassFilter(const double factor):factor(factor),mittelwert(0){}
10
         
11
         void setInitial(DatenType value)
12
         {
13
            mittelwert = value;
14
         }
15
         
16
         DatenType doValue(DatenType value) // neuen Wert verarbeiten
17
         {
18
            mittelwert *= 1.0 - factor;
19
            mittelwert += factor * value;
20
            return  mittelwert;
21
         }
22
         
23
         DatenType operator= (DatenType value)
24
         {
25
            return doValue(value);       
26
         }
27
         
28
         DatenType operator() (DatenType value)
29
         {
30
            return doValue(value);       
31
         }
32
         
33
         DatenType operator() () const
34
         {
35
            return mittelwert;       
36
         }
37
    
38
         operator DatenType() const
39
         {
40
           return mittelwert;
41
         }  
42
    };
43
44
45
// -------------------------------------------------------------------
46
47
48
49
// 1.0/11.0 entspricht in etwa einem Array mit 11 Zellen für die Berechnung des Mittelwertes
50
TiefpassFilter<uint16_t> filter {1.0/11.0}; 
51
52
53
void setup()
54
{
55
  Serial.begin(9600);
56
  filter.setInitial(analogRead(A0));
57
}
58
59
void loop()
60
{
61
  uint16_t value = analogRead(A0);
62
63
  Serial.print(value);
64
  Serial.print("  ");
65
  Serial.println(filter(value));
66
  delay(200);
67
}

von Olaf (Gast)


Lesenswert?

> Welcher digitale Filter ist am besten geeignet für ADC Messungen.

Garkeiner. Du brauchst keinen digitalen Filter nach einem ADC fuer
irgendeine Messung. Vielleicht brauchst du einen digitalen Filter
fuer eine ganz spezielle Anwendung, aber da haengt das halt von
der Anwendung hab.

Was du allerdings brauchst ist ein analoger Filter vor dem ADC!

Olaf

von Kuno (Gast)


Lesenswert?

Tatsache ist:
Was du dir ohne passende (zwangsweise analoge) Vorfilterung an Fehlern 
(Pseudofrequenzen etc.) eingefangen hast, bekommst du digital nicht
ordentlich rausgefiltert. Auch bei "kein Audio"! Es sei denn, du hast
SEHR, SEHR VIEL Zeit, auf den gesuchten Mittelwert zu warten.

Willst du Änderungen trotz Störungen und Rauschen zeitnah erfassen, oder 
gar dagegen ansteuern, so ist eine digitale Tiefpass-Filterung angesagt, 
wobei das übliche Änderungs-Verhalten noch nicht herausgefiltert werden 
sollte.
Der gleitende Mittelwert über z.B. 16 Messwerte ist ein guter (einfach 
zu programmierender) Ansatz. Eventuell muss die Erfassungsrate erhöht, 
und/oder die Messauflösung verringert werden, um bei einfacher 
Programmierung noch taugliche Ergebnisse zu erhalten.

Standard-Rezepte gibt es dafür nicht.

von Wühlhase (Gast)


Lesenswert?

Olaf schrieb:
> Was du allerdings brauchst ist ein analoger Filter vor dem ADC!

So siehts aus, den Vorfilter kann dir ein digitaler Filter schon aus 
Prinzip nicht ersetzen. Der gemeine Nyquist halt.

von Wolfgang (Gast)


Lesenswert?

Wühlhase schrieb:
> So siehts aus, den Vorfilter kann dir ein digitaler Filter schon aus
> Prinzip nicht ersetzen. Der gemeine Nyquist halt.

Das kommt drauf an, welchem Zweck das Filter dienen soll.
Ausreichend schnelle Abtastung und Dezimierung der Datenrate hinter dem 
ADC kann durchaus sinnvoll sein, um z.B. das Rauschen von Messwerten vor 
der Weiterverarbeitung zu reduzieren.

von Gustl B. (-gb-)


Lesenswert?

Für ein wunderschön glattes Signal kann man ganz einfach das 
Eingangssignal durch eine Konstante ersetzen. Da rauscht dann garantiert 
nix und es braucht im Gegensatz zu FIR deutlich weniger Rechenleistung.

Alles Gute, alles Liebe (-;

von jo (Gast)


Lesenswert?

Peter tr. schrieb:
> "Ein Tiefpassfilter
> Gleitender Mittelwert"
>
> Gibt es da einen speziellen Namen, wonach ich suchen kann.
> Also sowas wie FIR, PIR Bessel etc

Stichwort: Antialiasing bzw. Antialiasing Filter

Das muss allerdings - wie schon gesagt - "analog".

von Olaf (Gast)


Lesenswert?

> So siehts aus, den Vorfilter kann dir ein digitaler Filter schon aus
> Prinzip nicht ersetzen. Der gemeine Nyquist halt.

Mir sagte mal ein Prof wenn er jemals einen Studenten in der muendlichen
Pruefung nach der Diplomarbeit findet der das nicht weiss, er wird
den selbst dann noch durchfallen lassen. :-D

Olaf

von HildeK (Gast)


Lesenswert?

Fast alles richtig und sinnvoll bisher.
Unklar bleibt jedoch, ob er ein Aliasing-Problem hat (dann analog vor 
dem ADC) oder ob er schwankende Messwerte beruhigen will. Das geht auch 
digital.
Mir erscheint Letzteres in der Fragestellung plausibler:
Peter tr. schrieb:
> Mehrere Werte im Array speichern und dann filtern?
> Direkt immer zwei Werte messen und Filtern?

Es hängt von der Art der Störung ab, die du entfernen willst. Einfaches 
Wackeln der letzte(n) Stellen beruhige ich gelegentlich mit Zweifach- 
oder Vierfachmessungen und teile das Ergebnis anschließend durch 2 oder 
4.

Will man einzelne Ausreißer entfernen, so bietet sich eher eine 
Medianfilterung an. Werte speichern im Array, sortieren und den 
mittleren Wert nehmen.

Zur Beruhigung sich langsam ändernder Eingangssignale ist auch der schon 
genannte 'gleitende Mittelwert' sinnvoll.

Ansonsten wären die Suchbegriffe 'digitales Filter', FIR oder IIR.

von Christoph db1uq K. (christoph_kessler)


Lesenswert?

In der "SDR-Academy" der diesjährigen HamRadio wurde ein Filter 
beschrieben, das ich noch nicht kannte.
"Hogenauer filter" besser als "CIC-Filter" bekannt
https://de.wikipedia.org/wiki/Cascaded-Integrator-Comb-Filter
das soll sich speziell für CPLD/FPGA eignen, weil es keine 
Multiplizierer braucht. Das könnte einen Teil des Anti-Aliasing Filters 
bilden. Nachteil ist die sehr eingeschränkt wählbare Charakteristik.

von Franz (Gast)


Lesenswert?

total = total + current - val;
  val = total / 4;

Halt die Variablen ändern, sonst gehts kaum einfacher:)

von Olaf (Gast)


Lesenswert?

> Mir erscheint Letzteres in der Fragestellung plausibler:

Das ist aber irgendwie wieder raten an Hamstergekroese. .-)

> Will man einzelne Ausreißer entfernen, so bietet sich eher eine
> Medianfilterung an.

https://de.wikipedia.org/wiki/Ausrei%C3%9Fertest_nach_Grubbs

Ausreisser sind keine Messdaten. Ein Filter verschmiert dann die 
Energie. Da ist erkennen und rauswerfen besser.

Olaf

von HildeK (Gast)


Lesenswert?

Olaf schrieb:
> Ausreisser sind keine Messdaten. Ein Filter verschmiert dann die
> Energie. Da ist erkennen und rauswerfen besser.
Auch wenn man es Filter nennt: ein Medianfilter versucht auch, den 
'Ausreißer' zu erkennen und raus zu werfen.

von Wolfgang (Gast)


Lesenswert?

Bleibt also nach wie vor die Frage an den TO, was mit dem Filter 
erreicht werden soll.

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.