Forum: Digitale Signalverarbeitung / DSP / Machine Learning einfaches Filter für Arduino


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Franki (Gast)


Lesenswert?

Für die Dezimation eines AD-Wandlers (8Bit) wird ein CIC2 vorgeschlagen. 
Ich möchte den selber schreiben, statt was zurecht zu frickeln und weis 
auch noch wie das ungefähr ging. Allerdings habe ich eine kleine 
Erinnerungslücke:

Muss man bei den Integratoren auch mit einem Dezimationsfaktor abtasten, 
oder kann ich die Durchlaufen lassen?

Ich rechne momentan mit jedem neuen Wert (Valid = 1) Folgendes:

Wert1 := Wert1 + Input;
Wert2 := Wert2 + Wert1;

Dann gibt es zwei Counter, die jeweils bis 31 zählen und die aktuellen 
Werte merken, die Differenzen bilden und weiterpuschen. Es wird also mit 
32x32 dezimiert.

Macht es einen Unterschied, ob man das eingangsseitig noch abtastet? Wie 
verhält sich das dann mit den Überläufen?

Der anschlossene Wandler kommt mit 8 Bit. Wie müsste man das gestalten, 
damit es mit den automatischen Überläufen klappt?

von Harald W. (wilhelms)


Lesenswert?

Franki schrieb:

> Für die Dezimation eines AD-Wandlers (8Bit)

Und warum soll der bestraft werden?
https://de.wikipedia.org/wiki/Dezimation

von Grummler (Gast)


Lesenswert?

Harald W. schrieb:

> Franki schrieb:
>
>> Für die Dezimation eines AD-Wandlers (8Bit)
>
> Und warum soll der bestraft werden?
> https://de.wikipedia.org/wiki/Dezimation

"Dreistöckiger Hausbesitzer".

Dezimiert wird hoffentlich nicht der AD-Wandler, sondern
der Datenstrom, den liefert. Und strenggenommen wird er
auch nicht dezimiert, sondern reduziert...

von Dergute W. (derguteweka)


Lesenswert?

Moin,

Franki schrieb:
> Ich möchte den selber schreiben, statt was zurecht zu frickeln
Was ist da der Unterschied?

> Muss man bei den Integratoren auch mit einem Dezimationsfaktor abtasten,
> oder kann ich die Durchlaufen lassen?

Die Dezimation oder auch die Interpolation erfolgt immer zwischen dem 
Haufen Integratoren und dem Haufen Differenzierer.
Also laeuft der eine Haufen mit dem Eingangstakt, der andere Haufen mit 
dem Ausgangstakt. Dazwischen passiert "die Magie" der 
Samplerateveraenderung.

Gruss
WK

von Franki (Gast)


Lesenswert?

Harald W. schrieb:
> Franki schrieb:
>> Für die Dezimation eines AD-Wandlers (8Bit)
> Und warum soll der bestraft werden?
> https://de.wikipedia.org/wiki/Dezimation
Sehr lustig

Grummler schrieb:
> Dezimiert wird hoffentlich nicht der AD-Wandler, sondern
> der Datenstrom, den liefert.
Doch, ich möchte den Datenstrom unbehandelt lassen und nur dem Wandler 
eins aufs Dach geben.

Mann, sind das hier dämliche Antworten

von Franki (Gast)


Lesenswert?

Dergute W. schrieb:
> Die Dezimation oder auch die Interpolation erfolgt immer zwischen dem
> Haufen Integratoren und dem Haufen Differenzierer.
> Also laeuft der eine Haufen mit dem Eingangstakt, der andere Haufen mit
> dem Ausgangstakt

Das mit den Takten ist in Software ja virtuell: In den beiden 
angedachten Versionen (getaktetes und ungetaktetes Integrieren) wäre so 
oder immer ein update der Struktur mit dem Eingangssignal präsent.

Dergute W. schrieb:
> Dazwischen passiert "die Magie" der
> Samplerateveraenderung.
Das muss ich ja schon irgendwie machen und tut nicht von alleine. Dass 
ich am Ausgang, also des zweiten Differenzieres mit der dann geringeren 
Rate auslese, ist schon klar. Nur damit das Differenzieren richtig 
funktioniert, muss ja immer auch mit einem Bruchteil des Taktes - JE 
STUFE - abgetastet werden.

Es sind ja 2 Stufen und die zweite läuft mit 1/N langsamer, also mit 
1/(N*N).

Ich entnehme aber deiner Antwort, dass die Integratoren vorne nicht 
getaktet werden sondern mit jedem neuen Wert aufintegrieren (?)

von Dergute W. (derguteweka)


Lesenswert?

Moin,

Wie ich schon schrub: Beim normalen CIC gibts genau 1, i.w. eine Stelle, 
an der sich der Takt aendert, eben zwischen dem Haufen mit den 
Integrierern und dem Haufen mit den Differenzierern. Nicht zwischen 
Differenzierern und nicht zwischen Integrierern.

Gruss
WK

von chris_ (Gast)


Lesenswert?


von Franki (Gast)


Lesenswert?

chris_ schrieb:
> Beitrag "CIC-Filter für Halbierung der Abtastrate"
das war der erste thread, den ich beim suchen gefunden hatte, aber dort 
steht auch nichts konkretes zur implementierung.

von Cyblord -. (cyblord)


Lesenswert?

Franki schrieb:
>> https://de.wikipedia.org/wiki/Dezimation
> Sehr lustig

Glaube ich nicht.

von Franki (Gast)


Lesenswert?

Dergute W. schrieb:
> Wie ich schon schrub: Beim normalen CIC gibts genau 1, i.w. eine Stelle,
> an der sich der Takt aendert

Wenn aber doch die Differenzierer mit sagen wir dem halben Takt 
betrieben werden, dann taktet die erste Stufe mit 1/2 und die zweite 
effektiv mit 1/4, oder?

von Dergute W. (derguteweka)


Lesenswert?

Moin,

Ist jetzt nicht gross getestet, aber so ungefaehr koennte ein CIC 2. 
Kajuete mit 32facher dezimation ausschauen:
1
#include <stdio.h>
2
3
#define N (32)
4
void output(int o) {
5
    printf("%d\n",o);
6
}
7
8
void cic(int input) {
9
static int deccount;
10
static int integral1, integral2;
11
static int diff1, old1;
12
static int diff2, old2;
13
    integral1 += input;
14
    integral2 += integral1;
15
    if (++deccount >= N) {
16
        deccount = 0;
17
        diff1 = integral2 - old2;
18
        diff2 = diff1 - old1;
19
        old2 = integral2;
20
        old1 = diff1;
21
        output(diff2);
22
    }
23
}
24
25
int main() {
26
    int i;
27
    int input;
28
    for (i=0;i<1000;i++) {
29
        input = 0;
30
        if ((i>=0) && (i<256)) input = 1;
31
        cic(input);
32
    }
33
}
Die Integrierer laufen mit jedem Aufruf der cic() funktion, die 
Differenzierer und die Ausgangssampleweiterverarbeitung eben nur bei 
jedem Nten.

Gruss
WK

von Franki (Gast)


Lesenswert?

Ja, so dachte ich das auch, nur hatte ich irgendwie ein Problem mit 
vorzustellen, wie sich die Differenzen verhalten. Ich dachte eigentlich 
immer, dass sich der Dezimationsfaktor in jeder Stufe abbildet.

von N00b (Gast)


Lesenswert?

Wäre es für einen Unwissenden aber Interessieren möglich dass ihr 
erklärt worum es hier geht?

Ich kenne Filter grob nur als Signalfilter mit dem Verständnis dass je 
nach Auslegung unterschiedliche Frequenzen unterschiedlich gedämpft 
werden können.

Wo erkenne ich hier das Filter?
Was soll warum Dezimiert werden?

von Dergute W. (derguteweka)


Lesenswert?


von Franki (Gast)


Lesenswert?

N00b schrieb:
> Wo erkenne ich hier das Filter?
Das Filter besteht in der Aufaddition von Werten mit einer langsameren 
Abtastung. Einstufig betrachtet wäre das z.B. eine Summe über 10 Werte 
mit Abtastung 1/10.

> Was soll warum Dezimiert werden?
Um aus einem Wandler mehr rauszuholen. Der liefert sehr schnell wenige 
Bits und der Filter liefert dann langsamer mehr Bits. Hier eine 
Temperatur.

von N00b (Gast)


Lesenswert?

@Franki

Heiß dies dann also beispielsweise konkret:
* Der ADC liefert einen mit x1 Bit aufgelösten Wert alle y1 Sekunden
* mit Filter erhält man einen mit x2 aufgelösten Wert alle y2 Sekunden
* dabei dann x2 > x1 auf Kosten von y2 > y1
* also Genauigkeit auf Kosten von Zeit

?

von Franki (Gast)


Lesenswert?

N00b schrieb:
> * also Genauigkeit auf Kosten von Zeit
... wenn man das so darstellen möchte, ja.
Ich brauche ja keine Temperaturwerte mit 10kHz.
Ein Bruchteil reicht.

Ich hab das Filter jetzt nebenbei erwähnt, am Laufen. Was ich noch nicht 
durch habe, ist das richtige Dimensionieren der Integer-Rundung und des 
Überlaufs. Bei manchen Konstelleationen gibt es komische Werte und die 
(automatische ?) Berichtigung der Werte durch die Differenzierer scheint 
nicht richtig zu arbeiten.

von W.S. (Gast)


Lesenswert?

N00b schrieb:
> Wäre es für einen Unwissenden aber Interessieren möglich dass ihr
> erklärt worum es hier geht?

Im Prinzip geht es um einen gleitenden Mittelwert. Der gleicht das 
Wackeln der einzelnen Input-Werte aus und liefert dadurch (in geringem 
Maße) etwas mehr an Auflösung, allerdings zu Lasten der Bandbreite.

Eine Stufe (z.B. von 0 auf 100), die im Eingangssignal von einer 
Wandlung auf die nächste kommt, verteilt sich dabei auf mehrere (bis 
viele) Ausgangswerte. Aber diese künstlich erzeugte Rampe braucht 
eigentlich keiner, weswegen man sie auch weglassen kann und nur jeden 
x-ten Wert wieder herausgeben kann. Das ist eine Reduzierung der 
Samplerate.

Rein theoretisch würde man einen gleitenden Mittelwert etwa so machen, 
daß man die Input-Samples in einen Speicher stopft, wobei das neueste 
Sample an den Anfang kommt, alle Samples deshalb eins nach hinten rücken 
und das älteste Sample ins Nirwana fällt. Und dann die Summe bilden und 
durch die Anzahl Samples teilen. Ist umständlich.

Hogenauers Idee war, die Input-Samples einfach aufzuaddieren, wodurch 
der o.g. Speicher überflüssig wird. Dann wird von Zeit zu Zeit der Stand 
der Summe hergenommen, der vorherige Stand (den man sich gemerkt hat) 
abgezogen und der Rest muß dann bloß noch durch die enthaltene Anzahl 
von Samples geteilt werden. Diese Anzahl Samples seit dem letzten 
'Angucken' entspricht dann der Reduzierung der Samplerate.

Natürlich läuft ein Summierer irgendwann über. Also muß man das 
berücksichtigen beim 'Angucken' und die Variable, die die Summe 
aufnimmt, muß ausreichend viele Bit breit sein, um das sicher erkennen 
zu können.

Nochwas: Hier wird oft und gern von Integratoren geredet. Nun, 
Integrieren ist etwas dezent anderes. Hier haben wir es mit Summierung 
zu tun. Ein Gleiches gibt es zu den 'Differenzierern' zu sagen. Es ist 
hier nur die Differenz zur vorherigigen Summe gemeint und nicht die 
Steilheit des Anstieges im Signal. Aber Integratoren klingen 
'mathematischer' als bloße Summierer. Das hebt.

W.S.

von c-hater (Gast)


Lesenswert?

W.S. schrieb:

> Rein theoretisch würde man einen gleitenden Mittelwert etwa so machen,
> daß man die Input-Samples in einen Speicher stopft, wobei das neueste
> Sample an den Anfang kommt, alle Samples deshalb eins nach hinten rücken
> und das älteste Sample ins Nirwana fällt. Und dann die Summe bilden und
> durch die Anzahl Samples teilen. Ist umständlich.

Nicht wirklich umständlich. Man muss nicht "nach hinten rücken", das 
geht weitaus intelligenter zu lösen.
Einzig die Tatsache, dass man Speicher benötigt entsprechend der Anzahl 
der Samples, über die der Mittelwert gebildet werden soll, ist unschön.

> Nochwas: Hier wird oft und gern von Integratoren geredet. Nun,
> Integrieren ist etwas dezent anderes. Hier haben wir es mit Summierung
> zu tun.

Integration ist bei der Verarbeitung diskreter Werte nunmal nix anderes 
als als Summenbildung.

> Ein Gleiches gibt es zu den 'Differenzierern' zu sagen.

Hier gilt das analoge. Bei der Verarbeitung diskreter Werte ist 
Differenzieren tatsächlich nur: Bildung von Differenzen.

von W.S. (Gast)


Lesenswert?

c-hater schrieb:
> Nicht wirklich umständlich. Man muss nicht "nach hinten rücken", das
> geht weitaus intelligenter zu lösen.

Jeder normale Elektroniker weiß das und kann das. Und hier ging es nur 
darum, das Prinzip zu erläutern. Aber das geschilderte Verfahren ist 
tatsächlich umständlich.

W.S.

von Franki (Gast)


Lesenswert?

c-hater schrieb:
> Integration ist bei der Verarbeitung diskreter Werte nunmal nix anderes
> als als Summenbildung.
weswegen der Herr Hogenauer und der Rest der Welt sie auch so nennt. :-)

W.S. schrieb:
> Hogenauers Idee war, die Input-Samples einfach aufzuaddieren, wodurch
> der o.g. Speicher überflüssig wird. Dann wird von Zeit zu Zeit der Stand
> der Summe hergenommen, der vorherige Stand (den man sich gemerkt hat)
> abgezogen und der Rest muß dann bloß noch durch die enthaltene Anzahl
> von Samples geteilt werden.
Die Idee war glaube ich schon Jahrzehnte älter. Hogenauers Idee war 
eigentlich das normale Filterverhalten nämlich Integration und 
Differenziation zu trennen und alle INTs und alles DIFs 
zusammenzufassen.

Und der weitere Punkt ist das mit den Überläufen, die sich angeblich 
automatisch lösen. Das habe ich leider auch nicht mehr im Kopf, worauf 
man da aufpassen muss.

Was ich nebenbei gesagt sehe ist, dass die Integratoren alle mehr und 
mehr weglaufen, also der eine immer überwiegend positiv ist, wodurch die 
Folgestufe immer steiler wird und früher überläuft und es (scheinbar) 
trotzdem funktioniert.

Das Komische ist, dass meine Eingangswerte voll +/- sind also 
symmetrisch.

von Gerold (Gast)


Lesenswert?

c-hater
>> Nochwas: Hier wird oft und gern von Integratoren geredet. Nun,
>> Integrieren ist etwas dezent anderes. Hier haben wir es mit Summierung
>> zu tun.

>Integration ist bei der Verarbeitung diskreter Werte nunmal nix anderes
>als als Summenbildung.

In deiner Welt als Anfänger der Signalverarbeitung wahrscheinlich schon. 
Wenn du dich weiterbilden willst, liest mal ein paar Artikel zu 
digitalen Integrationsverfahren.

von Jürgen S. (engineer) Benutzerseite


Lesenswert?

Gerold schrieb:
> Artikel zu digitalen Integrationsverfahren.
Denen ist aber durchaus allen gemein, dass es irgendwo eine 
Summenbildung gibt. Sei es explizit durch Akkumulation oder implizit 
durch Nutzung einer Gleichung, die Ergebnis einer mathematischen 
Integration ist.

Im vorliegenden Fall werden durch die Summation alle eingehenden Daten 
mit 1.0 gewichtet, daher sieht das so "einfach" aus - es ist aber in der 
Tat eine vollständige diskrete Integration.

c-hater schrieb:
> Bei der Verarbeitung diskreter Werte ist
> Differenzieren tatsächlich nur: Bildung von Differenzen.
... man muss sich hier und auch bei der Integration halt nur immer 
bewusst machen, dass es der Differenzenquotient ist, der gebildet- und 
gfs. aufintegriert wird und nicht der "richtige" Differentialquotient. 
Mithin vergessen Viele bei der diskreten Integration das Restglied, das 
man nicht immer vernachlässigen kann und im Einzelfall auch nicht 
sollte.

von Gerold (Gast)


Lesenswert?

>Gerold schrieb:
>> Artikel zu digitalen Integrationsverfahren.
>Denen ist aber durchaus allen gemein, dass es irgendwo eine
>Summenbildung gibt. Sei es explizit durch Akkumulation oder implizit
>durch Nutzung einer Gleichung, die Ergebnis einer mathematischen
>Integration ist.

Ich denke, dass die Verwendung eines Näherungspolynoms oder die 
Verwendung eines schrittweisen Näherungsverfahrens zu Integration nicht 
einfach als "Summierung" bezeichnet werden kann.

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.