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!
Auch wenn ich die Frage nicht gänzlich verstehe - ich glaube, Du suchst das da: https://de.wikipedia.org/wiki/Methode_der_kleinsten_Quadrate , oder?
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.
Soll das permanent oder gruppenweise geschehen? Suche mal nach mittlere quadratische Kontingenz.
@ 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!
:
Bearbeitet durch User
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 ...
:
Bearbeitet durch User
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?
:
Bearbeitet durch User
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.
:
Bearbeitet durch User
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.
Die Ableitungen sind frei von einem Gleichanteil. Du kannst ein Tiefpaßfilter bauen, das außerhalb eines Events nur Werte sampelt.
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.