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
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
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...
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.
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
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
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.
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.
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.
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.
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
Nanu, ist meine Problemstellung ernsthaft so exotisch, daß es keine Standardlösung gibt?
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
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.
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.
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
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.
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.
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
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?
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
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.
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
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
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.
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...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.