Welchen Filter für ADC Messung

Gast #6804209
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
}
Gast #6804217
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
Gast #6804658
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.
Gast #6804684
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.
Gast #6804960
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
Gast #6805027
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.
#6805057
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.
Gast #6805095
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

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