Welchen Filter für ADC Messung

Gast
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
> 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
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
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.
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 (-;
Gast
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".
Gast
> 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
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.
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
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 5 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.