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?
Es geht nur um schnelle Strom/Spannungsmessung kein Audio oder so
"Ein Tiefpassfilter Gleitender Mittelwert" Gibt es da einen speziellen Namen, wonach ich suchen kann. Also sowas wie FIR, PIR Bessel etc
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 | }
|
> 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
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.
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.
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 (-;
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".
> 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
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.
total = total + current - val; val = total / 4; Halt die Variablen ändern, sonst gehts kaum einfacher:)
> 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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.