Forum: Mikrocontroller und Digitale Elektronik Schwellwert automatisch berechnen


von Walter T. (nicolas)


Lesenswert?

Hallo zusammen,
ich habe ein Digitalsignal, das aus einzelnen Pulsen besteht, das ich 
analog abtaste. Der Unterschied zwischen Low-Pegel und ein High-Pegel 
ist immer mit ausreichend Abstand erkennbar, allerdings ist der 
Absolutwert im vornherein unklar und ändert sich zeitlich auch mitunter 
(allerdings sehr langsam) aufgrund eines Temperatureffekts. Das Signal 
ist auch nicht besonders sauber, es ist also im weitesten Sinne noch 
eine Entprellung notwendig. Allerdings sind die Impulse sehr langsam 
(min. 0.2 Sekunden lang, so daß dieser Teil nicht weiter schwer ist). Am 
Ende soll eine zuverlässige Impulszählung stehen.

Davor steht eine zuverlässige Methode, zwischen High- und Low-Werten zu 
klassieren. Am Anfang darf es ruhig einige Fehlbeurteilungen geben, aber 
nach ca. 10 Impulsen sollte die Unterscheidung zuverlässig sein.

Mein erste Gedanke wäre es gewesen, einen Schwellwert zu definieren, 
indem ich das Eingangssignal mit einem Tiefpaß  extrem niedriger 
Grenzfrequenz filtere. In diesem Anwendungsfall ist das allerdings nicht 
sinnvoll, da bei einem Impulssignal der so berechnete Schwellwert sehr 
dicht am Low-Pegel wäre.

Mein zweiter Gedanke wäre es gewesen, den Signalpegel in 16 Klassen 
aufzuteilen, jeden gemessenen Pegel zu zählen und den Mittelpunkt der 
zwei Klassen mit den größten Häufungen als Schwellwert zu betrachten. 
Dabei müßten natürlich "alte" Werte vergessen werden, ähnlich wie beim 
gleitenden Mittelwertfilter.

Und mein dritter Gedanke war: Das Ganze müßte doch eigentlich ein 
Standardproblem sein, für das es Standardlösungen  gibt.

Kennt jemand die Standardlösung für eine solche Problemklasse 
(Rückgewinnung eines Digitalsignals aus einer analogen Abtastung) und 
kann mir Stichwörter, Rezepte oder Formeln nennen?

Viele Grüße
W.T

von Peter D. (peda)


Lesenswert?

Dein Fehler ist, nur einen Schwellwert zu nehmen.
Digitalsignale haben immer 2 Schwellen, U_high_min und U_low_max. Alles 
dazwischen ist undefiniert.
0V .. U_low_max = Low
U_high_min .. VCC = High

von Alexxx (Gast)


Lesenswert?

Auch wenn's wieder unerwünscht ist:
Die intelligenter Vorgehensweise ist die, gleich dafür zu sorgen, dass 
das Signal sauber ist!
Woher kommt denn dein analoges "Digital-"signal / was produziert so 
einen Schrott?
Hier sollte man ansetzen...

von Walter T. (nicolas)


Lesenswert?

Peter D. schrieb:
> Dein Fehler ist, nur einen Schwellwert zu nehmen.

Das stimmt. Bei der Beschreibung meiner Problemstellung habe ich die 
Breite der Hysterese ausgelassen.

Ob die Darstellung "Schwellwert + Hysteresebreite" oder "Unterer + 
oberer Schwellwert" sinnvoller ist, lasse ich mal offen - vielleicht 
ergibt sich das noch im Laufe der Diskussion.

Zentral ist für mich erst einmal die Frage, ob es hier überhaupt 
sinnvoll ist, das Rad mal wieder neu zu erfinden oder ob es nicht einen 
fertigen "Meier-Müller-Wang-Hopper-Algorithmus" gibt, den es nur noch zu 
finden und zu implementieren gilt.

von Georg (Gast)


Lesenswert?

Walter T. schrieb:
> ob es nicht einen
> fertigen "Meier-Müller-Wang-Hopper-Algorithmus" gibt

Wieso hast du nicht in Erwägung gezogen, Minimum und Maximum zu 
bestimmen und die Mitte dazwischen als Schwellwert zu nehmen? Zu 
kompliziert?

Georg

von Joe (Gast)


Lesenswert?

Da bestimmt man den maximalen Wert des Signals und den minimalen Wert 
des Signals.
Daraus bildet man einen Mittelwert = Schwellwert

Dieser Wert wird dann mit dem vorherigen Schwellwert verrechnet, z.B.

(neuer)Schwellwert = 0.9*(alter)Schwellwert + 0.1*Mittelwert

von Walter T. (nicolas)


Lesenswert?

Alexxx schrieb:
> [...]
> Woher kommt denn dein analoges "Digital-"signal / was produziert so
> einen Schrott?

Der Umschalter an einem Scheibenwischermotor an einem 50m langen 
ungeschirmten Kabel, der direkt unter einer großen Kurzwellenantenne 
angebracht ist.

> Die intelligenter Vorgehensweise ist die, gleich dafür zu sorgen, dass
> das Signal sauber ist!

Im Verhältnis zu ein paar Zeilen Quelltext in einem µC, der sich 
ansonsten zu Tode langweilt, ist das eher ein unverhältnismäßiger 
Schaltungsaufwand. Die Schutzbeschaltung ist so schon aufwendig genug. 
Für Signale im mehrere-hundert-Millisekundenbereich ist eine digitale 
Aufbereitung deutlich weniger aufwendig.

> Auch wenn's wieder unerwünscht ist:

Deswegen: Ja, leider paßt das hier nicht.

von Walter T. (nicolas)


Lesenswert?

Georg schrieb:
> Wieso hast du nicht in Erwägung gezogen, Minimum und Maximum zu
> bestimmen und die Mitte dazwischen als Schwellwert zu nehmen? Zu
> kompliziert?

Zu ungenau. Minimum und Maximum werden mit Sicherheit Leitungsstörungen 
sein. Damit gibt es keinen Grund anzunehmen, daß der Mittelwert irgendwo 
zwischen den beiden Pegeln des Nutzsignals liegt.

von Peter D. (peda)


Lesenswert?

Walter T. schrieb:
> Der Umschalter an einem Scheibenwischermotor an einem 50m langen
> ungeschirmten Kabel, der direkt unter einer großen Kurzwellenantenne
> angebracht ist.

Das sind doch mehrere MHz. Da reicht ein Tiefpaß oder ein Sperrkreis.

von Amateur (Gast)


Lesenswert?

Dein Problem sollte sich, so die Ursache nicht beseitigt werden kann, 
mit Filtern verschiedener Zeitkonstante, lösen lassen.

Ein Filter, in dem das Grundsignal, z.B. gleichgerichtet und über einen 
schwach belasteten Kondensator, als Basisreferenz, dem Eingangssignal 
folgen soll.
Ein zweiter Filter, sozusagen ein Quicky, der an die Pulse angepasst 
ist, mit natürlich kürzerer Zeitkonstante.
Die Differenz sollte die "Nutzimpulse" hervortreten lassen.

Am besten wird aber die Ursachenbekämpfung sein.

von Walter T. (nicolas)


Angehängte Dateien:

Lesenswert?

Ungefähr wie auf dem Bild kann man sich das Signal vorstellen, Zeitskala 
wären Millisekunden. Nicht wahnsinnig wild, aber genug, um sich bei der 
Auswertung ein paar Gedanken zu machen.

: Bearbeitet durch User
von Walter T. (nicolas)


Lesenswert?

Nanu, ist meine Problemstellung ernsthaft so exotisch, daß es keine 
Standardlösung gibt?

von Maxx (Gast)


Lesenswert?

In Software:

Gleitende Mittelwerte über wenige Samples und vielen Samples 
gegeneinander vergleichen. => Software-Bandpass.
Evtl. noch ein Threshold/Hysterese drauf.

In Hardware:
Bandpass Filter drauf. Evtl Schmidt Trigger folgen lassen

von Walter T. (nicolas)


Lesenswert?

Nanu, ist meine Problemstellung ernsthaft so exotisch, daß es keine 
Standardlösung gibt?

Maxx schrieb:
> Gleitende Mittelwerte über wenige Samples und vielen Samples
> gegeneinander vergleichen. => Software-Bandpass.

Wie schon oben erwähnt, ist ein gleitender Mittelwert eher ungünstig, da 
das Signal einen riesigen Gleichanteil hat.

von Maxx (Gast)


Lesenswert?

Walter T. schrieb:
> Wie schon oben erwähnt, ist ein gleitender Mittelwert eher ungünstig, da
> das Signal einen riesigen Gleichanteil hat.

Nein, nicht einer! Zwei: Der DC Anteil wird in beiden gleichermaßen 
einbezogen werden und in der Differenz herausfallen.

von Georg (Gast)


Lesenswert?

Walter T. schrieb:
> Nanu, ist meine Problemstellung ernsthaft so exotisch, daß es keine
> Standardlösung gibt?

Du willst sie nur nicht zur Kenntnis nehmen.

Walter T. schrieb:
> Zu ungenau. Minimum und Maximum werden mit Sicherheit Leitungsstörungen
> sein.

Störungen herausfiltern musst du in jedem Fall, egal welchen 
Rechenalgorithmus du anschliessend anwendest.

Es ist offensichtlich hoffnungslos, dir irgendetwas zu raten. Hier gibt 
es genug Leute, für die dein Problem keines ist, aber du willst ja nicht 
hören. Sinnlos sich weiter zu beteiligen. Troll?

Georg

von Günter Lenz (Gast)


Lesenswert?

Du nimmst zwei Tiefpässe (RC-Glieder), einen
mit einer ganz langen Zeitkonstante und
einen mit einer kürzeren Zeitkonstante.
Mit den Ausgängen dieser beiden Tiefpässe
gehst du dann auf einen Differentialverstärker,
den man mit Operationsverstärker bauen kann.
Der liefert dir dann deinen Zählimpuls.

von Walter T. (nicolas)


Lesenswert?

Georg schrieb:
> Du willst sie nur nicht zur Kenntnis nehmen.

Die einzige Lösung für die Fragestellung, die ich hier bislang gelesen 
habe ist die, digitale Tiefpaßfilter zu implementieren - wobei noch 
offen bleibt, ob das die Standardlösung ist. Ausprobieren werde ich es 
auf jeden Fall.

Georg schrieb:
> Störungen herausfiltern musst du in jedem Fall, egal welchen
> Rechenalgorithmus du anschliessend anwendest.

Wieso "anschließend"? Ich suche einen Algorithmus, der mir die Störungen 
ausfiltert.

Georg schrieb:
> Hier gibt
> es genug Leute, für die dein Problem keines ist,

Das stimmt. Für viele Anwendungen ist es sinnvoller, eine analoge 
Filterung vorzuschalten. Für diesen Fall sieht das allerdings anders 
aus. Hardware- und Softwareaufwand sind für gewöhnlich gegeneinander 
austauschbar. Und bei Signalen mit großer Zeitkonstante betreibe ich den 
Aufwand eben lieber im Digitalen.

von Dietrich L. (dietrichl)


Lesenswert?

Walter T. schrieb:
> Das stimmt. Für viele Anwendungen ist es sinnvoller, eine analoge
> Filterung vorzuschalten. Für diesen Fall sieht das allerdings anders
> aus. Hardware- und Softwareaufwand sind für gewöhnlich gegeneinander
> austauschbar. Und bei Signalen mit großer Zeitkonstante betreibe ich den
> Aufwand eben lieber im Digitalen.

In Deinem Fall ist es sinnvoll beides zu tun:
Ein Analogfilter (Tiefpass) für den hochfrequenten Teil, denn dann 
kannst Du den Spannungsverlauf mit einer vernünftigen (d.h. entsprechend 
niedrigen) Abtastrate mit dem A/D-Wandler abtasten, ohne dass da noch 
große Ausreißer (Spikes) dabei sind.
Dann kommt die Ermittlung des niedrigen und des hohen Pegels. Daraus 
ergibt sich die Schwelle in der Mitte dazwischen.

Gruß Dietrich

von Walter T. (nicolas)


Lesenswert?

Dietrich L. schrieb:
> Dann kommt die Ermittlung des niedrigen und des hohen Pegels.

Womit wir wieder beim Anfang wären - denn das war meine ursprüngliche 
Frage.

Der niedrige und der hohe Pegel sind die Analogwerte, die mit 
(gleitender) maximaler Häufigkeit auftreten. Womit ich erst einmal die 
Analogwerte in einer großen Tabelle klassieren müßte. Oder wie 
identifiziert man diese Werte üblicherweise?

von Dietrich L. (dietrichl)


Lesenswert?

Walter T. schrieb:
> Womit ich erst einmal die
> Analogwerte in einer großen Tabelle klassieren müßte.

Wenn das "HF"-Filter gut genug ist, reicht es doch aus, wenn man den 
niedrigsten und den höchsten Wert aus der Tabelle nimmt. Die Tabelle ist 
organisiert als FIFO und so lang, dass alle Abtastwerte einer Periode 
hineinpassen.

Ob es eine bessere Methode gibt als bei jedem neuen Wert die ganze 
Tabelle zu durchsuchen (Zeitproblem?), kann ich Dir nicht sagen. Und das 
geht natürlich auch nicht, wenn die Impulse längere Zeit fehlen können 
(FIFO-Länge).

Und da siehst Du auch: zu Deiner eigentlichen Frage "Gibt es da eine 
Standardlösung" kann ich Dir leider nichts sagen ;-(

Gruß Dietrich

von Paul (Gast)


Lesenswert?

Vorschlag in Hardware: Spitzenwertdetektor mit anschließendem Hochpass 
zur Abtrennung des Gleichanteils. 1 OPV, 1 Diode, 2 R, 2 C. Quasi 
Amplitudendemodulation. Kommt mir zumindest sofort in den Kopf, wenn ich 
dein angehangenes Bild sehe.

von Thomas E. (picalic)


Lesenswert?

Walter T. schrieb:
> Das stimmt. Für viele Anwendungen ist es sinnvoller, eine analoge
> Filterung vorzuschalten. Für diesen Fall sieht das allerdings anders
> aus. Hardware- und Softwareaufwand sind für gewöhnlich gegeneinander
> austauschbar. Und bei Signalen mit großer Zeitkonstante betreibe ich den
> Aufwand eben lieber im Digitalen.

Ich habe den Eindruck, daß Du da etwas falsche Vorstellungen hast und 
gewisses Grundlagenwissen fehlt. Mit Filterei in Software kannst Du kein 
vorgeschaltetes Hardware-Filter ersetzen! Bevor Du nämlich irgend etwas 
sinnvolles per Software-Filterei aus einem verrauschten Signal berechnen 
kannst, musst Du dafür sorgen, daß bei der AD-Wandlung das 
"Nyquist-Shannon-Abtasttheorem" nicht verletzt wird, d.h. im Klartext, 
Du musst das Signal erstmal durch ein Tiefpassfilter (in Hardware!) 
schicken, das keine Frequenzen oberhalb der halben Abtastfrequenz des 
AD-Wandlers durchlässt.
Dieses Filter kannst Du nicht durch "digitale" Filterung NACH der 
AD-Wandlung ersetzen!

: Bearbeitet durch User
von Walter T. (nicolas)


Lesenswert?

Thomas E. schrieb:
> Dieses Filter kannst Du nicht durch "digitale" Filterung NACH der
> AD-Wandlung ersetzen!

Schau Dir mal die Zeitskala des Nutzsignals an. Wir reden hier von zig 
Millisekunden. Das hat überhaupt nichts mit dem Anti-Aliasing-Filter vor 
der Abtastung zu tun, das natürlich ebenfalls existiert, aber eher für 
eine Grenzfrequenz von ein paar KHz ausgelegt ist.

Dietrich L. schrieb:
> Wenn das "HF"-Filter gut genug ist, reicht es doch aus, wenn man den
> niedrigsten und den höchsten Wert aus der Tabelle nimmt.

Paul schrieb:
> Spitzenwertdetektor mit anschließendem Hochpass
> zur Abtrennung des Gleichanteils.

Ich nehme an, wenn ich das selbst entwickeln muß, wird es auf genau das 
hinauslaufen: digitales Tiefpaß-Filter mit nachgeschalteten zwei 
Spitzenwert-Detektoren für Low- und High-Pegel. Das sollte ja nicht 
allzu schwierig sein. Im Prinzip sollte es ausreichen, die DGLs einer 
realen Schaltung zu diskretisieren. Da es nur einen integrierenden und 
keinen differenzierenden Anteil gibt, sind da ja wenig Überraschungen zu 
erwarten.

Danke für die Diskussion!
W.T.

: Bearbeitet durch User
von Wolfgang (Gast)


Lesenswert?

Walter T. schrieb:
> Nanu, ist meine Problemstellung ernsthaft so exotisch, daß es keine
> Standardlösung gibt?

So sauber wie Signal und Störungen im Frequenzbereich getrennt sind, 
sehe ich überhaupt kein Problem. Der Rauschabstand reicht doch fast so 
schon für eine Erkennung aus.

Sehen die Pulse immer so aus? Lade doch mal ein typisches Signal als 
Zeitserie hoch. Mit dem Bild kann doch kein Mensch rechnen.

von Thomas E. (picalic)


Lesenswert?

Walter T. schrieb:
> das natürlich ebenfalls existiert, aber eher für
> eine Grenzfrequenz von ein paar KHz ausgelegt ist.

Wenn aber Dein Nutzsignal im Frequenzbereich < 10 Hz angesiedelt ist, 
warum legst Du den Tiefpass dann auf die hundertfache Frequenz aus? Mit 
einem auf die Frequenz des Nutzsignals angepassten Tiefpass sähe das 
Eingangssignal schon viel besser aus...

von Walter T. (nicolas)


Lesenswert?

Walter T. schrieb:
> Im Prinzip sollte es ausreichen, die DGLs einer
> realen Schaltung zu diskretisieren. Da es nur einen integrierenden und
> keinen differenzierenden Anteil gibt, sind da ja wenig Überraschungen zu
> erwarten.

Und unter der Dusche ist es mir eingefallen. Ein diskreter 
Spitzenwertdetektor mit linearem Abfall sieht ja einfach so aus:
1
p: Abfallparameter
2
u_p: oberer Spitzenwert
3
u_m: unterer Spitzenwert
4
5
u_p(n+1) = max(ad_in(n+1),u_p(n)-p);
6
wenn (u_p(n+1)<u_min) u_p(n+1) = u_min;
7
8
u_m(n+1) = min(ad_in(n+1),u_m(n)+p);
9
wenn (u_m(n+1)>u_max) u_m(n+1) = u_max;

Für einen exponnentiellen Abfall dann eben so:
1
p: Abfallparameter (0<p<1)
2
u_p: oberer Spitzenwert
3
u_m: unterer Spitzenwert
4
5
u_p(n+1) = max(ad_in(n+1),u_p(n)*p);
6
7
u_m(n+1) = min(ad_in(n+1),(u_max-u_m(n))*p);

Da langweilt sich der µC immer noch zu Tode.

Thomas E. schrieb:
> Wenn aber Dein Nutzsignal im Frequenzbereich < 10 Hz angesiedelt ist,
> warum legst Du den Tiefpass dann auf die hundertfache Frequenz aus? Mit
> einem auf die Frequenz des Nutzsignals angepassten Tiefpass sähe das
> Eingangssignal schon viel besser aus...

Will ich die Quellimpedanz für den A/D-Wandler niedrig halten und nehme 
ein R-C-Glied mit 1kOhm, brauche ich ca. 15µF. OK, die gibt es noch in 
vernünftiger Bauform und mit halbwegs definierten Werten - aber das 
recht temperatur- und altersabhängig. Für 10kHz sieht das alles viel 
gemütlicher aus.

Wolfgang schrieb:
> Sehen die Pulse immer so aus? Lade doch mal ein typisches Signal als
> Zeitserie hoch. Mit dem Bild kann doch kein Mensch rechnen.

Ich habe keine realen Meßwerte, sondern nur das Bild auf dem Oszilloskop 
mit GnuPlot nachempfunden.

Wolfgang schrieb:
> So sauber wie Signal und Störungen im Frequenzbereich getrennt sind,
> sehe ich überhaupt kein Problem. Der Rauschabstand reicht doch fast so
> schon für eine Erkennung aus.

In real ist der Signal-Rauschabstand sogar noch ein Stück besser. Ein 
Problem sollte das also in keinem Fall machen. Ich war nur nach der 
Suche nach dem passenden Algorithmus.

: Bearbeitet durch User
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.