Hallo,
ich taste mit einem ADC eine Gaußkurve sehr oft ab. Das ist dann
natürlich etwas vertauscht, daher will ich da einen Gauß reinfitten. Ich
habe keine Ahnung wie sowas geht und bitte um eine kurze Abschätzung des
Aufwands.
Es würde mir auch reichen den Algorithmus zu kennen un den dann mit VHDL
umzusetzen. Gibt es sowas irgendwo fertig oder einfach verständlich?
Vielen Dank!
Das kann sein. Ich kenne mich da nicht so aus, ich würde nur gerne etwas
ritten damit das Rauschen minimiert wird. In Python gibt es schöne
Funktionen aber ich brauche das in schnell im FPGA. Sonst müsste ich die
Sampledaten wegschreiben und das später mit dem PC rechnen was aber
langsam ist.
Ist es schwer die Methode mit den kleinsten Quadraten in VHDL zu
beschreiben? Was muss ich da an Stolperstellen erwarten?
Du meinst die Formel da? Hm ...
Würde man Rauschen durch ein digitales Tiefpassfilter wegbekommen, also
auch den Fehler durch Rauschen minimieren?
Das Signal ist eine abgetasteten Gauß-Glocke. Die Fläche darunter ist
der interessante Wert aber die ist ungenau weil das Signal leicht
rauscht.
Also wenn du eine Gausskurve anfitten willst,
warum schätzt du nicht einfach die char. Parameter?
Dazu einfach Mittelwert und Varianz, lässt sich
prima in VHDL giessen. Für die Varianz brauchst
du ggf noch eine MUL-Unit.
Varianz ist ja die Breite und Mittelwert die Position. Für die Fläche
unter der Kurve brauche ich aber doch die Höhe. Also mit der Varianz
kann ich den Gauß in der Horizontalen strecken, aber das bräuchte ich
auch für die Vertikale. Oder hab ich was falsch verstanden?
Nein, ausser den beiden Schätzwerten brauchst
du nichst weiter. Beide Werte definieren
ein und dieselbe Kurve eindeutig. Schau dir
einfach mal die Formel für die Gausskurve an.
@ Sigi: Was meinst du mit Mittelwert? Den Median? Gibt es sowas wenn es
sich nur um Abtastwerte handelt die nach zeitlichem Auftreten aber nicht
nach Häufigkeit sortiert sind?
Nein das soll nicht kontinuierlich geschehen sondern je Impuls mit
Gaußform habe ich rund 2000 Samples.
OK das ist wie auch die Varianz einfach zu bestimmen. Vielleicht bin ich
ja blind ich finde nämlich keine Funktionsgleichung in der man nicht
dieses mü also den Median braucht.
"Mü" ist der Mittelwert.
Genauer: in der Mathematik ist "mü" der Erwartungswert. Der Mittelwert
einer Stichprobe konvergiert mit steigender Anzahl an
Stichprobenelementen gegen den Erwartungswert.
Ok, Mittelwert ist alle Samples aufsummieren und durch die Anzahl
teilen, das ist einfach. Varianz ist auch einfach.
Wenn ich dann also mü und Sigma habe, wie komme ich auf die Fläche? Ist
das auch einfach machbar im FPGA? Zur Not kann ich diese kleinen Daten
dann zum PC schicken und das dort rechnen.
Mit Fläche meinst du wohl das Integral?
Falls ja: Summiere doch einfach alle Werte auf
und multipliziere mit einen entspr. Skalierungsfaktor.
Btw. Wenn das eine Gausskurve ist (d.h. Dichtefunktion),
dann ist das Integral doch 1. Stell doch am Besten mal
einen Satz Daten hier rein, als Textfile. Dann kann man
sich ein besseres Bild machen.
Gustl B. schrieb:> Wenn ich dann also mü und Sigma habe, wie komme ich auf die Fläche? Ist> das auch einfach machbar im FPGA?
Klar geht das auch im FPGA- habe ich auch schon gemacht. Die Frage ist
nur, ob es nötig ist. Bei meiner damaligen APP war es nötig, weil die
Schlussfolgerungen, die aus der Lage der Kurve geschlossen wurden, auch
in der Elektronik zu Reaktionen führen mussten. Bei Dir scheint mir das
aber nicht der Fall. Die Kurve selber zu plotten ist extern natürlich
einfacher - schau mal in den Bronstein oder ein entsprechendes Buch.
Für das Integral gilt:
integral exp(-A*x^2) = 0.5*sqrt(Pi/A)
(Latex scheint hier nicht richtig zu funktionieren)
Du musst also A berechnen. Das ist lediglich die Standardabweichung mit
einem Faktor multipliziert.
Du musst die Kurve nicht fitten, diese sollte sich automatisch aus den
Messwerten ergeben (mit Mittelwert und Standardabweichung) und damit
auch das Integral.
Gefittet wird eine solche Kurve meistens dann, wenn man weiss, dass die
Realdaten einer Normalverteilung entsprechen, aber Messfehler
rausgenommen werden sollen. Daher fließen in diesem Fall meist noch
Gewichtungen ein.
Vielen Dank!
Also ich taste sehr viele so Gauß Kurven ab, berechne deren Fläche
(derzeit durch Aufsummieren aller Samples) und diese Flächenwerte werden
dann zu einem Spektrum. Also in x-Richtung der Flächenwert und in
y-Richtung die Anzahl der abgetasteten Kurven die diesen Wert haben.
Ich möchte vom einfachem Aufsummieren weg weil das Signal nicht ganz
sauber ist. Das mit mü und sigma berechnen scheint mir da schon besser
aber auch nicht perfekt, denn:
Irgendwo muss ich ja einen Anfang und ein Ende der Kurve definieren.
Dazu setze ich etwas über 0-Volt eine Schwelle, wird diese nach oben
überschritten wird aufsummiert bis das Signal wieder drunter fällt.
Aber was ist wenn die Nulllinie selber leicht schwankt, also das
Rauschen eine sehr niedrige Frequenz hat? Dann ist der Gauß mal minimal
weiter oben, mal minimal weiter unten. Bilde ich den Mittelwert mü durch
aufsummieren der Samples, dann bekomme ich einen Fehler. Ich weiß nicht
so recht wie ich das umgehen kann. Man könnte kontinuierlich die
Nulllinie angucken und so einen dynamischen Untergrund annehmen. Richtig
fitten ist wohl die optimale Lösung aber schwer machbar.
Hallo nochmal, also irgendwie ist das mit mu und sigma seltsam und ich
weiß auch gar nicht ob ich das so machen darf weil das was ich habe eben
nichts stochastisches ist.
ich habe also jetzt ein Beispiel:
7, 40, 129, 233, 241, 141, 47, 9
das sind die 8 Samplewerte die mit der Zeit, also in gleichen
Zeitabständen aufgenommen wurden.
Würde ich da jetzt mit mu und sigma rechnen komme ich auf Folgendes:
mu als Mittelwert = 847 / 8 = 105.875
die varianz ist dann die aus
(7-105.875)^2+(40-105.875)^2+(129-105.875)^2+(233-105.875)^2+(241-105.87
5)^2+(141-105.875)^2+(47-105.875)^2+(9-105.875)^2 geteilt durch 8 =
63154.875 / 8 = 7894.36
Die erwartete Fläche sollte irgendwo in der Größenordnung von 847 (=
Summe aller Einzelwerte) liegen. Wie bekomme ich aus mu und sigma diese
Fläche?
Vielen Dank!
Gustl B. schrieb:> und ich> weiß auch gar nicht ob ich das so machen darf
Nein, darf man leider nicht. Viele der Tips basierten auf einem
Missverständnis. Die Tippgeber gingen davon aus, dass du schwankende
Messwerte hast und die Gaußverteilung der Messwerte bestimmen willst.
Tatsächlich hast du Messwerte, deren Zeitverlauf eine Gaußkurve
darstellen (und die darüber hinaus etwas um die Gaußkurve herum
schwanken). Wenn du mit diesen Messwerten eine Varianz berechnest,
bekommst du etwas, das mit dem "Effektivwert" der Gaußkurve verwandt
ist, aber nicht die - eigentlich gewünschte - Breite der Kurve.
Zu deinem ursprünglichen Anliegen: Aufsummieren kann ein FPGA
hervorragend, einen Least-Square-Fit darin abzubilden wäre einigermaßen
aufwändig. Wenn ich es machen müsste, würde ich wahrscheinlich eher
einen Controller im FPGA den Fit durchführen lassen.
Ich glaube aber auch, dass der Fit dir kein besseres Ergebnis liefern
kann als das Aufsummieren. Wenn die Abweichungen von deiner Gaußkurve im
Mittel=0 sind, dann sollte die Summe über die einzelnen Messwerte das
Rauschen bestmöglich unterdrücken. Ein Fit kann das nicht besser.
Der einzige Vorteil des Fits ist aus meiner Sicht, dass du einen
zuverlässigeren Zahlenwert für den Untergrund bekommst (den Untergrund
summierst du bei deiner bisherigen Auswertung einfach mit).
Ich würde an deiner Stelle beim Aufsummieren bleiben und versuchen, den
Untergrund genauer zu bestimmen. Du könntest z.B. ständig den Untergrund
aufintegrieren. Und wenn du sicher bist, dass während der letzten
Untergrundmessung kein Gaußpuls auftrat, kannst du das Ergebnis als
aktuellen Untergrundwert übernehmen und beim Aufsummieren von den
Messwerten abzuiehen.
Danke! Sehr gut! Genau das habe ich vermutet. Aber ich sehe noch einen
Vorteil beim Fit:
Der ADC rauscht vermutlich nicht gleichverteilt. Ich habe mal ein Bild
angehängt, da sind viele Signalformen so wie sie aus dem ADC kommen
überlagert. Ja, ist kein guter ADC, aber auch teurere Modelle erzeugen
da horizontale Linien. Ein Hersteller der das professionell macht sagte
dass die genau wegen solchen ADC-unschönheiten einen Gauß fitten.
Was ich auch machen könnte (aber vielleicht nicht will^^) ist die
Messdaten so zu skalieren dass man Stochastik anwenden kann. Also mu = 0
setzen und so dass das mittig um die 0 herum ist die Glocke.
Das mit dem Untergrund ist gar nicht so einfach, also wenn das Rauschen
auf dem Untergrund sehr niederfrequent im Vergleich zum Gauß ist dann
funktioniert es wenn ich vor dem Gauß den Untergrund mittele und das
dann von jedem Gauß-Sample abziehe. Vielleicht auch noch dahinter
mitteln und irgendwie ein Dreieck abziehen ...
Ist das Rauschen sehr hochfrequent im Vergleich zum Gauß mittelt es sich
sowieso weg.
Schlimm ist Rauschen ähnlicher Frequenz. Der Gauß ist so 10 - 20 us
lang, das sind dann 50 - 100 kHz. Wenn ich mir das Signal angucke im
Oszi mit FFT ist da halt auch was ...
Gustl B. schrieb:> Der ADC rauscht vermutlich nicht gleichverteilt.
Kann schon sein. Aber wenn das Rauschen sich asymmetrisch auf die
Messkurve auswirkt, dann verfälscht es doch den Fit genau so wie die
bisherige Integration.
Gut dass du mal eine Messung zeigst, das hätte viele Missverständnisse
vermieden. Deine Kurve ist übrigens ohnehin kein (symmetrischer) Gauß,
weil die ansteigende Flanke deutlich steiler ist als die abfallende.
Sieht mir eher nach einem Effekt deines Verstärkers aus als nach
Digitalisierungs-Artefakten.
Du kannst ja mal eine der Kurven in den PC laden und dort mit
Standardwerkzeugen fitten. Dann siehst du, ob sich der Aufwand eines
Fits im FPGA lohnen kann. Wenn ich die Kurven so sehe, glaube ich nicht
daran.
Danke Dir!
Ja, was mache ich dann um das zu verbessern? Irgendwelche schöne Ideen?
Also, mit nur Aufsummieren ist mein Ergebnis schon einigermaßen gut,
aber ich will natürlich mehr.
Jedenfalls hab ich jetzt mal im FPGA mit Dividierern gespielt^^ und
hoffentlich was gelernt.
Genau, das wäre die Alternative die Messdaten zum PC schicken und da
dann fitten, aber dann ist die Datenmenge deutlich größer, das wird
schwer für mich. Kann man da sonst was mit machen mit der mittleren
quadratischen Abweichung vom Durchschnittswert? Also irgendwie die Kurve
charakterisieren in einem Wert der das besser macht als die Summe der
Samplewerte?
Gustl B. schrieb:> Ja, was mache ich dann um das zu verbessern? Irgendwelche schöne Ideen?
Wo kommt denn dein Signal her? Irgendwelche Leuchtpulse von streuenden
Partikeln oder so was? Dann würde ich mal den Fotoverstärker anschauen,
ob er nicht schneller sein müsste. Oder jedweden sonstigen
Vorverstärker, der vor dem ADC kommt. Ist dann wahrscheinlch eher ein
Thema für "Analogtechnik" als für "FPGA und VHDL".
Gustl B. schrieb:> Wenn ich mir das Signal angucke im> Oszi mit FFT ist da halt auch was ...
na dann zeig uns doch das auch mal...
Gustl B. schrieb:> Das mit dem Untergrund ist gar nicht so einfach, also wenn das Rauschen> auf dem Untergrund sehr niederfrequent im Vergleich zum Gauß ist dann> funktioniert es wenn ich vor dem Gauß den Untergrund mittele und das> dann von jedem Gauß-Sample abziehe. Vielleicht auch noch dahinter> mitteln und irgendwie ein Dreieck abziehen .
So hatte ich das gemeint. Wobei ich die Untergrundsmessung nach dem Gauß
eher vorsichtig angehen würde, weil du ordentliche Überschwinger nach
unten hast - das kann das Korrektursignal eher verschlechtern als
verbessern.
Gustl B. schrieb:> Genau, das wäre die Alternative die Messdaten zum PC schicken und da> dann fitten,
Mein Vorschlag wäre, das nur mal exemplarisch für einige wenige Pulse
durchzuspielen. Damit man sieht, ob die Fitterei überhaupt was bringen
kann.
Ist wohl vielleicht wirklich ne Analogsache.
FFT kann ich gerade nicht anhängen weil da dauernd Messungen laufen. Der
Detektor ist so ein Germanium Detektor der radioaktiven Zerfall misst,
die Fläche ist also proportional zur Zerfallsenergie.
Mit Analogtechnik kenne ich mich leider noch weniger aus. Jetzt hab ich
am FPGA-Board einen ADC angeschlossen. Der ADC braucht auch analoge
Masse und Vref. Was vielleicht ganz gut wäre wäre wenn das mit der
Nullinie mitschwingt falls die schwingt. Nur weiß ich nicht so recht wie
ich Vref und die digitale Spannungsversorgung bauen soll. Bisher mache
ich das mit einem LDO der aus +5 V die +3,3 V generiert. Wenn man sich
das dann anguckt hat man aber auch Rauschen im zweistelligen mV-Bereich.
Nicht hoch aber gibt es ist halt da, ist ja auch Digitaltechnik da die
mit Leiterbahnen sendet und so.
Gustl B. schrieb:> Der> Detektor ist so ein Germanium Detektor der radioaktiven Zerfall misst,> die Fläche ist also proportional zur Zerfallsenergie.
Soll sich dann überhaupt eine symmetrische Gaußkurve als Form ergeben?
Gabs da nicht irgendwas mit einer Abhängigkeit vom Ort der
Wechselwirkung und den unterschiedlich langen Driftzeiten der
Ladungsträger?
Ach, ich weiß nicht mehr, ist schon zu lange her, dass ich mich mit
sowas einigermaßen auskannte...
Ja da gibt es was ... kenne mich da aber auch nicht sooo aus. Das macht
mein Vater aber eben mit Technik aus den 80ern die ich jetzt mal durch
Moderneres ersetzen möchte für das man auch Ersatzteile bekommt und so.
Also wenn der Detektor größer ist dauert es länger bis alle Ladungen
rausgesaugt wurden, aber eigentlich sollte das der shaping-amplifier
schon gaußförmig machen wenn man dem genug Zeit lässt.
> Das Signal ist eine abgetasteten Gauß-Glocke. Die Fläche darunter ist> der interessante Wert aber die ist ungenau weil das Signal leicht> rauscht.
Eine Gaußkurve ist unendlich breit. Mathematisch gesehen.
Du mußt eine Schwelle definieren.
Beim Überschreiten der Schwelle immer fleißig addieren bis die Schelle
wieder unterschritten wird.
Eine Gaußkurve wird gern mit einer Parabel gefittet. Die Parabel hat
fast den gleichen Verlauf in dem Bereich mit den höheren Werten.
Dann gibt es noch andere Tricks.
Die Erste Ableitung bilden. Dan bekommst du die beiden Punkte der größen
Steigung. Diese stehen auch in einer wichtigen Beziehung.
Klar mache ich ne Triggerschwelle. Das mit dem Ableiten ist so ne Sache,
hab ich schon gemach im FPGA, macht man es zweimal bekommt man
eigentlich was hybsches bei dem man dann die Fläche unter dem mittleren
Teil nehmen könnte. Hab aber keine Ahnung in wieweit sich das Signal das
ich vermessen will dadurch verbessert oder verschlechtert gegenüber
einfachem Aufsummieren.
Gustl B. schrieb:> Der> Detektor ist so ein Germanium Detektor der radioaktiven Zerfall misst,> die Fläche ist also proportional zur Zerfallsenergie.
Die Pulshöhe ist auch proportional zur Energie, ist aber leichter zu
ermitteln. Dadurch, das Dein Untergrund sehr gut aussieht, sollte das
gut gehen.
Hast Du verschiedene Proben da, um Deinen Detektor anhand der
Enegielinien zu kalibrieren?
Duke
Hallo, ja die Höhe kann man auch verwenden aber wie macht man das? Das
Sample mit dem größten Wert? Dann hat man aber wieder eher mehr
Rauschen.
Klar haben wir Standardproben um das alles zu kalibrieren.
Gustl B. schrieb:> Klar mache ich ne Triggerschwelle. Das mit dem Ableiten ist so ne Sache,> hab ich schon gemach im FPGA, macht man es zweimal bekommt man> eigentlich was hybsches bei dem man dann die Fläche unter dem mittleren> Teil nehmen könnte.
Aufsummieren ist ein Tiefpass. Leider hast du das Problem bei kleinen
Werten die Grenzen für den Beginn und das Ende der Summierung zu finden.
Du hast nicht die Probleme an dem Hügel sondern rechts und links.
Deshalb war mein Tipp die Ableitungen zu bilden um die Grenzen zufinden.
Du kannst die zweite Ableitung bilden (Laplace). Die Nulldurchgänge
detektieren und diese als Trigger für die Summierung des
Eingangssignals.
Dann hast du über die Halbwertsbreite integriert.
Um das Rauschen zu entfernen kannst du ein moving average filter nehmen.
Du kannst z.b. mit delay und shift operator einfach über drei Werte
mitteln.
0,25a+0,5b+0,25c
0,25 ist zweimal nach rechts geschoben
0,5 einmal nach rechts geschoben
a aktueller Wert
b Wert a^-1 (a durch ein Delay gatter geschoben)
c Wert b^-1 (b durch eine Delay gatter geschoben)
Hallo, in einem älteren Thread hatte ich das mal versucht, also zweimal
abgeleitet wie hier im Bild:
Beitrag "Re: Peakfläche über leicht verrauschter Nullinie bestimmen."
Ich habe das aber nie mit Messdaten gemacht, würdest Du im abgeleiteten
Signal aufsummieren oder im Originalsignal?
Um den Hochpunkt zu bestimmen, könntest du die höchsten 3 Punkte nehmen,
und eine Parabel damit berechnen.
Also: f(x)= dx^2 +ex + f die drei Punkte einsetzen und damit d,e und f
berechnen.
Das lässt sich sehr einfach in die Form:
f(x)= a(b-x)^2 + c überführen.
Sollte deutlich besser sein als nur den höchsten Punkt zu nehmen und du
musst dich nicht mit kleinsten Fehlern beschäftigen, da es nicht
überbestimmt ist.
Gustl B. schrieb:> Ich habe das aber nie mit Messdaten gemacht, würdest Du im abgeleiteten> Signal aufsummieren oder im Originalsignal?
???
Die Ableiterei soll doch dabei helfen, saubere Pulsgrenzen zu
definieren. Summieren musst du im Originalsignal. Wenn du die Ableitung
aufsummierst (was nichts anderes ist als die diskrete Form des
Aufintegrierens), dann kannst du das Ergebnis auch ganz Rechnung
vorhersagen.
Gerald G. schrieb:> Um den Hochpunkt zu bestimmen, könntest du die höchsten 3 Punkte nehmen,
Aber nur, wenn er das Rauschen vorher vollständig losgeworden ist. Wenn
er bei den aktuellen Kurven eine Parabel durch die drei höchsten Punkte
bestimmt, bekommt er Hausnummern als Ergebnis.
Achim S. schrieb:> Wenn er bei den aktuellen Kurven eine Parabel durch die drei höchsten> Punkte bestimmt, bekommt er Hausnummern als Ergebnis.
Das ist wohl wahr. Wobei, wenn ich mir das hochfrequente Rauschen so
anschaue, sollte sich das bei der Menge an Samples raus mitteln.
Ich würde mal die Daten nehmen, in ein Datenbearbeitungsprogramm füttern
welches das Integral einer interpolierten Kurve berechnet, und mit dem
aufsummierten Integral vergleichen. Ich denke nicht dass sich das stark
unterscheidet. Das größte Problem wird sein, das Ende der Kurve zu
bestimmen, bei den Überschwingern die da angedeutet sind.
Edit: Achja, mit einer angefitteten Gaußkurve kann man das natürlich
auch vergleichen, wobei ich Wette dass dort der Fehler am Größten ist.
Ah ok genau dann werde ich das mal probieren ... eigentlich ganz nett
mit dem Anfang und Ende des Impulses durch Ableitung. Wenn ich
dazwischen alle aufsummiere, dann muss ich ja irgendwie eine Nulllinie
davon abziehen. Nehme ich dann den Wert bei Impulsanfang dafür?
Thema: Nulllinie
Es ist ein konstantes Offset dieser ist auch von deiner Höhe abhängig.
Die Summe ( dein Integral) hat einen konstanten Fehler.
Wenn du deine Messung kalibrieren kannst, dann kannst du den
mathematischen Fehler in die Kalibration drücken.
Mathematisch bestimmst du bei der Kalibration den Fehler und konstante
Fehler sind einfach mit einer linearen Kalibration korrigierbar.
Ja ne, ich frage mich ob ich eine Nulllinie für alle Impulse nehmen soll
oder für jeden eine Eigene. Ich würde das für jeden Inpuls selber
machen, also ohne ableiten und so erstmal den Durchschnitt sehr vieler
Samples vor einem Impuls rechnen und dann das als Nullinie ansehen oder
minimal drüber.
Wenn ich jetzt zweimal ableite und da jeweils die Nulldurchgänge als
Anfang und Ende sehe, was ist dann die Nulllinie? Immernoch wie gerade
beschrieben der Mittelwert von vielen Samples die keinen Impuls
enthalten oder soll ich dann die Nullinie auf höhe des Samplewerts legen
bei dem Nulldurchgang der 2. Ableitung?
Ich werde das erstmal nur mit Aufsummieren machen und die Nulllinie als
Mittelwert über sehr viele Samples vor dem jeweiligen Impuls.
Als Impulsstart ist dann wenn der Mittelwert der z. B. 4 neuesten
Samples um einen festen Wert (einstellbar) größer ist als die Nullinie.