Forum: Digitale Signalverarbeitung / DSP / Machine Learning Peakfläche über leicht verrauschter Nullinie bestimmen.


von Gustl B. (-gb-)


Lesenswert?

Hallo,

ich messe Impulse mit einem ADC. Die Impulse sind ca. 6us lang und haben 
Gauß-Glockenform. Sie sitzen auf der Nulllinie. Der ADC tastet das 
Signal mit 50MSamples/s ab.

Derzeit erkenne ich einen Impuls dadurch dass das Signal über eine 
Triggerschwelle steigt und danach bestimme ich die Impulsfläche durch 
Aufsummieren der ADC-Werte minus des Triggerwertes bis das Signal wieder 
unter die Triggerschwelle sinkt.

So, das funktioniert auch alles prima und wenn ich die Peakflächen dann 
nach Häufigkeit sortiere bekomme ich ein hybsches Spektrum. Aber: Es 
könnte besser gehen.
Leider ist die Nulllinie etwas verrauscht. Also nicht schlimm, aber eben 
doch etwas weil Spannungswandler zerhacken und lauter so Zeug. Die Idee 
wäre jetzt also nicht die Fläche über einer festen Triggerschwelle 
sondern über einer dynamischen tatsächlichen Nullinie zu bestimmen. Dazu 
müsste ich also vor dem Peak die Nulllinie messen und dahinter und dann 
daraus den Mittelwert als tatsächliche Null nehmen. Ganz grob.

Jetzt die Frage:
Gibt es da irgendwelche Herangehensweisen die üblich sind und die 
funktionieren? Wenn ich die Nulllinie vor und hinter dem Peak messe kann 
ich auch nicht sagen was dazwischen passiert. Sollte ich etwas komplett 
anderes machen um die Peaks voneinander zu unterscheiden?
Also das sind immer Gauß nur unterschiedlicher Höhe. Wen man das 
differenziert oder sich die maximale Steigung anguckt, ich weiß nicht ob 
das besser wäre wie die Fläche.

Edit:
Jetzt hab ich mit LibreOffice mal etwas rumgerechnet, also erstmal eine 
Gauß Wertetabelle von hier http://www.mathe-fa.de genommen und dann 
numerisch abgeleitet. Erst einmal dann zweimal. Bei der zweiten 
Ableitung, wen man die invertiert und dann nur den Teil >0 verwendet, 
also davon dann die Fläche über der Nulllinie. Wäre das was?

Und wenn ich numerisch ableite, wird das Ergebnis schlechter wenn man 
Mittelwerte nimmt? Also statt f'(x)=f(x)-f(x-1) mal 
f'(x)=(f(x)-f(x-7))/8 verwendet. Das ist zwar kein Mittelwert aber ... 
irgendwie wird die Kurve die dann rauskommt deutlich glätter.

-gb-

: Bearbeitet durch User
von FPGA Pongo (Gast)


Lesenswert?

Du musst eine Schwelle bestimmen, aber der ein Peak ein Peak ist und in 
den Zwischenräumen, in denen definitiv kein Peak ist, das Rauschen 
ermitteln und das Level bilden, dass Du dann jeweils abziehst.

Eine Frage: Was ist ein "hybsches" Spektrum? Kenne keinen Mr. Hybe

von Dogbert (Gast)


Lesenswert?

Du willst also die Fläche und die Position oder nur das auftreten dieser 
6us gaussförmigen Pulse möglichst genau messen? Oder etwas anderes?

Zuerst wäre mal sicherzustellen dass es nicht zu viel Aliasing gibt bei 
der Abtastung.
Dann für jede Abtastung ein Zeitfenster von >6 also vielleicht 7us in 
die der Puls immer komplett reinpasst die Summe also Fläche berechnen 
und den Maximalwert festhalten.
Die Maximalwertermittlung braucht evtl. upsampling davor um die 
Genauigkeit zu vergrößern, wenn das Spektrum des Pulses zu nahe an Fs/2 
kommt.
Ein weiteres Kriterium wäre einzuführen und zwar die Breite des Pulses, 
so dass die Maximalwertermittlung sicher wird und nicht auf Rauschen 
getriggert wird.
Die Breite des Pulses ist die Summe der Quadrate der Samples dividiert 
durch die Summe der Samples (Fläche).
Immer wenn die Breite über dem Schwellenwert ist, kann die 
Maximalwertermittlung triggern.
Evtl. kann das upsampling filter noch eine Bandbegrenzung machen die den 
Messwert nicht ändert aber den maximalwerttrigger noch robuster macht 
auf kosten der wiederholrate/des Zeitfensters.

Natürlich muss man Arbeit investieren dass effizient zu implementieren 
und evtl. zu vereinfachen wenn die Rahmenbedingungen es zulassen.

von Gustl B. (-gb-)


Lesenswert?

Also mich interessiert nur die Fläche des Impulses. Also die Fläche über 
einem leider nicht ganz glatten Untergrund. Ja also wie FPGA Pongo 
vorschlägt das Rauschen zu ermitteln ginge, ist aber schwer, weil ich 
nicht weiß über einen wie großen Bereich ich da einen Mittelwert bilden 
soll.

Irgendwie würde ich gerne generell weg von einem Schwellwert. Wenn ich 
die 2. Ableitung nehme und dann nur die Fläche unter der Nulllinie oder 
wenn man die invertiert nur die Fläche über der Nulllinie dann hat das 
nur was mit Steigungen zu tun. Also niedrige Frequenzen auf denen der 
Impuls komplett drauf sitzt wären dann egal.
Also hier im Bild rechts nur die Fläche über der Nulllinie.
http://www.ihr.uni-stuttgart.de/fileadmin/user_upload/autoren/mh/structure/img393.gif

Numerisch ableiten geht auch einfach, aber wenn ich den Impuls oft 
abtasten, dann ist die Änderung zwischen je zwei Samples gering und die 
Ableitung sehr vertauscht. Ich würde hier wie schon oben erwähnt immer 
Samples mit größerem Abstand nehmen oder Mittelwerte bilden.
Wäre das ein Weg der zum Ziel führt?

Danke!

von Dogbert (Gast)


Lesenswert?

Gustl Buheitel schrieb:
> dann ist die Änderung zwischen je zwei Samples gering und die
> Ableitung sehr vertauscht.

Eben, zwei mal ableiten bedeutet 40Db/Dekade Anstieg in der Verstärkung. 
Dummerweise konzentriert sich der Gausspuls in Richtung DC, hat 
Gaussförmiges Spektrum um DC herum, also wird dieser viel mehr damit 
abgeschwächt als das eher gleichmäßig spektral verteilte Rauschen.
Und dieses Rauschen dominiert dann in der 2. Ableitung.
Oder sieh es anders: Der Puls besteht aus vielen Samples, ist 
tieffrequent, warum nur ein paar Samples (nicht bandbegrenzt) anschauen 
und alles daraus ableiten wollen?

Um einen Schwellenwert kommt man nicht herum, aber man kann ja einen 
besseren Schwellenwert als einfach den Pegel nehmen, die kontinuierlich 
über ein Fenster berechnete Pulsbreite wie ich vorschlug. Plus die 
maximalwertermittlung der Fläche, natürlich.
Denn die Pulsbreite scheint das am wenigsten Schwankungen durch 
Störungen unterworfene hier zu sein und die Störungen alleine ergeben 
keine so große Pulsbreite.

Man kann es ja einfach mal in Matlab oder Octave modellieren und 
ausprobieren...

von derguteweka (Gast)


Lesenswert?

Moin,

Vielleicht steh' ich auch nur auf der Leitung; aber: Was ist denn genau 
gefordert? Musst du das Vorhandensein der Impulse detektieren/irgendwas 
triggern, was muss wie genau gemessen werden, Hoehe oder Flaeche oder 
Breite oder sind die Impulse eh' immer exakt gleich lang und nur 
unterschiedlich hoch? Was sind fuer Stoerungen auf dem Signal, nochwas 
ausser Quantisierungsrauschen, wenn ja, wie gross sind die Stoerungen, 
wie sehen die aus?

So ins Blaue rein: Wenn man eh' schon weiss, wie ein Signal aussieht, 
was man irgendwo rausfischen soll, dann ist ein matched-Filter oft eine 
gute Idee...

Gruss
WK

von Gustl B. (-gb-)


Lesenswert?

Also ich möchte aus Impulsen die alle ca. 6us lang sind und 
unterschiedlich hoch ein Spektrum bauen, also unterschiedliche Impulse 
nach Häufigkeit sortieren. Dazu müssen die Impulse möglichst gut 
unterschiede werden. Wenn ich die Fläche nehme, also alle Samples 
aufsummiere bekomme ich eine sehr große Zahl die schon mal recht 
eindeutig ist und den Zweck gut erfüllt.

Jetzt will ich aber, dass zwei exakt gleiche Impulse auch den gleichen 
oder einen sehr ähnlichen Zahlenwert liefern. Aber leider ist meine 
Nulllinie eben nicht perfekt glatt. Da ist nicht viel Rauschen aber eben 
doch etwas im mV Bereich. Wen ich jetzt zwei identische Impulse habe und 
der eine sitzt im Tal einer niedrigen Störfrequenz und der andere Impuls 
sitzt auf dem Berg, dann ist die Fläche über einer festen Schwelle 
natürlich unterschiedlich.
Und das will ich rausbekommen.

Wenn ich nur die Steigung angucke, also wie erwähnt die 2. Ableitung, 
dann würden mich niedrige Frequenzen im vergleich zu den 6us nichtmehr 
stören.

Aber ich weiß nicht ob es da bessere, einfacherer Methoden gibt.

von derguteweka (Gast)


Lesenswert?

Moin,

Gustl Buheitel schrieb:
> Aber ich weiß nicht ob es da bessere, einfacherer Methoden gibt.

Da faellt mir momentan auch nichts ein. Aber ansonsten klingt das fuer 
mich schon so, als ob ein matched-Filter da was bringen koennte. Waere 
also in deinem Fall ein Gaussfilter, und lustigerweise ist ein 
Gaussimpuls, der durch ein Gaussfilter geht, danach immernoch ein 
Gaussimpuls. d.h. du kannst da mit deiner Flaechenbestimmung so 
weitermachen wie bisher.
Also "einfach" (=vorrausgesetzt, du hast genuegend Rechenbumms uebrig 
und kannst mit der Verzoegerung leben) alle Samples vor deiner 
Verarbeitung durch ein entsprechendes Gaussfilter jagen. Das wirkt im 
Frequenzbereich als Tiefpass, d.h. hoeherfrequente Rauschanteile werden 
gedaempft.

Gruss
WK

von Guest (Gast)


Lesenswert?

Dein Problem ist mathematisch gesehen wohl eine Parameterschätzung. Du 
misst ein Signal
 wobei y[k] eine Gauss-Kurve ist, Phi der zu schätzende Parameter und N 
das Rauschen. Den zugehörigen Schätzer bekommst du per Maximum 
Likelihood Estimation denke ich. Also in etwa

Wobei L die Likelihood Funktion, also die PMF von Y gegeben Phi ist und 
Y der Vektor aus allen Y[k]. Ich würde also mit der Gauss-Kurve 
korrelieren um ihre Position zu finden und dann den berechneten ML 
Schätzer den Parameter schätzen lassen. Wenn du mehr Information über 
die eigenschaften des Rauschen hättest, könnte man an dieser Stelle 
weiterrechnen. Vermutlich ist es Gauss-Verteilt mit einem 
Leistungsdichtespektrum, welches einen Peak bei einer niedrigen Frequenz 
hat, hört sich zumindest danach an. Dann würde wenn ich mich recht 
erinnere der ML Schätzer einfach die Lösung des Gleichungssystems 
ausspucken...

Ein vermutlich anderer Ansatz wäre der Einsatz eines Minimum MSE 
Filters. Möglicherweise verkommt der aber bei diesem einfachen Beispiel 
zum ML Schätzer.

von Guest (Gast)


Lesenswert?

Ah die Erinnerung kommt langsam wieder. Der MMSE Filter wird wohl zum 
Matched Filter konvergieren aufgrund fehlender Intersymbolinterferenz. 
Der ist eigentlich für etwas bisschen anderes gemacht. Wie auch immer.

Ich habe vorhin überlesen, dass die Breite des Pulses nur Zirka 6us ist, 
also nicht exakt. Das müsste man in den Parameterschätzer noch einbauen 
und ebenfalls berücksichtigen, mir fällt aber gerade nicht ein wie das 
funktionieren sollte...

von Gustl B. (-gb-)


Lesenswert?

Ja, also ... vielen Dank! So wirklich verstehen tu ich das aber nicht, 
also ich hab mit Signalverarbeitung sonst eher nichts am Hut und 
beschränke mich auf einfache Dinge wie Aufsummieren und so.
Ist der von Dir beschriebene Weg sehr schwierig umzusetzen in VHDL?

: Bearbeitet durch User
von Guest (Gast)


Lesenswert?

Man könnte es so machen:

Und daraus den ML Estimator ableiten. Wie gesagt, du braucht mehr 
Informationen über das Rauschen, am besten die Kovarianzmatrix. Die 
kannst du natürlich auch im System schätzen (also Kalibrieren) indem du 
den Erwartungswert über viele Korrelierte Samples ohne Gauss-Funktion 
bildest. Wenn du am Durchrechnen interessiert bist und es nicht 
hinbekommst, melde dich mal...

von Guest (Gast)


Lesenswert?

Gustl Buheitel schrieb:
> Ja, also ... vielen Dank! So wirklich verstehen tu ich das aber nicht,
> also ich hab mit Signalverarbeitung sonst eher nichts am Hut und
> beschränke mich auf einfache Dinge wie Aufsummieren und so.

Das ist eh mehr Stochastik als Signalverarbeitung.

Gustl Buheitel schrieb:
> Ist der von Dir beschriebene Weg sehr schwierig umzusetzen in VHDL?

Das kommt auf die Lösung an. Vermutlich ist die Lösung nicht besonders 
kompliziert wenn du die Kovarianzmatrix des Rauschen als konstant siehst 
und as Rauschen ansonsten gaussverteilt ist.
Die Lösung des Systems ist vielleicht nicht so einfach wie Aufsummieren 
und das Maximum finden, dafür ist sie mathematisch möglicherweise sogar 
optimal. Das heißt es ist dann beweisbar, dass es keinen qualitativ 
besseren Algorithmus gibt.

Achso man bekommt wahrscheinlich bessere Ergebnisse wenn man von Phi_2 
schonmal den Erwartungswert abzieht, aber das müsste man sich berechnen.

von Guest (Gast)


Lesenswert?

Noch eine Kleinigkeit: Das Rauschen ist wohl nicht Gaussisch verteilt 
weil der ADC in Sättigung geht. Es wär dann irgendwo abgeschnitten. Das 
dürfte die Rechnung und deren Lösung echt ätzend machen. Ich weiß nicht 
wie viel an Optimalität man verliert wenn man das vernachlässigt...

von Gerd E. (robberknight)


Lesenswert?

Was ist mit der bisherigen Lösung per fester Triggerschwelle das 
Problem? Daß Du einige kleine Pulse verpasst oder daß Du die Pulse nicht 
so genau wie gewünscht erfassen kannst, da Du einen Offset wegen dem 
Rauschen drauf hast?

Ich vermute mal letzteres.

Dann würde ich so vorgehen: Du sampelst immer. Normalerweise haust Du 
die Werte in einen vereinfachten gleitenden Durchschnitt (neuen Wert 
addieren, Durchschnitt subtrahieren). Daraus bekommst Du Deine 
Nulllinie.

Allerdings würde ich die Werte nicht sofort in den Durchschnitt 
reinaddieren, sondern erst mal in einem Puffer zwischenspeichern. Der 
Puffer muss so groß sein, daß der langsamste mögliche Impuls in dieser 
Zeit bis zur bisherigen Triggerschwelle gekommen ist. Wenn die 
Triggerschwelle überschritten wird, addierst Du alles aus diesem Puffer, 
was über der Durchschnitts-Nulllinie liegt, zu dem Impuls und nicht zum 
Nulllinien-Durchschnitt.

Alternativ könnte man zur Unterscheidung Nulllinie / Anfang des Impulses 
auch einen Kalman-Filter verwenden.

von Gustl B. (-gb-)


Lesenswert?

@Guest:
Also ich weiß nicht was Sättigung bedeutet, also jedenfalls wird nie die 
maximale Spannung erreicht. Deine Lösung klingt sehr gut, aber auch eher 
schwer für einen Anfänger umzusetzen. Ich müsste erstmal das Rauschen 
kennen. Das ist gar nicht so einfach und dann ist die Frage ob das 
konstant bleibt wenn man in dem Raum am Abend z.B. die Lampen oder 
irgendein anderes Gerät einschaltet.

@Gerd E.:
Ja richtig, mir geht es um den Offset der durch niedrige Frequenzen auf 
der Nullinie entsteht. Deine Lösung ist einfach umzusetzen.

Erstmal werde ich jetzt das mit der 2. Ableitung versuchen, da bin ich 
gerade dran und hab auch schon etwas am Laufen. Sollte das keine 
deutliche Verbesserung bringen werde ich das mit der 
Durchschnitts-Nulllinie versuchen. Die Triggerschwelle würde ich dann 
auch nicht feste machen sondern an diese Nulllinie koppeln. Als Offset 
drüber.

von Guest (Gast)


Lesenswert?

Gustl Buheitel schrieb:
> Also ich weiß nicht was Sättigung bedeutet, also jedenfalls wird nie die
> maximale Spannung erreicht. Deine Lösung klingt sehr gut, aber auch eher
> schwer für einen Anfänger umzusetzen. Ich müsste erstmal das Rauschen
> kennen. Das ist gar nicht so einfach und dann ist die Frage ob das
> konstant bleibt wenn man in dem Raum am Abend z.B. die Lampen oder
> irgendein anderes Gerät einschaltet.

Sättigung heißt genau das was du annimmst. Selbst wenn der Maximalwert 
deines ADCs nicht getroffen wird (das sollte man eigentlich ändern, 
stichwort Aussteuerung und damit SNR) wird vermutlich der Minimalwert, 
also 0V sehr wohl getroffen. Dort wird die Rausch-Verteilung 
abgeschnitten und damit nichtlinear.

Das Rauschen dürfte von deinem Schaltregler dominiert sein, welcher eine 
sehr  eindeutige Frequenzverteilung erzeugt. Das sollte schon fast 
deterministisch sein. Das heißt, dass sich das Rauschen zwar über 
verschiedene äußere Einflüsse ändert, diese Änderung aber nicht 
signifikant ist. Ansonsten kannst du die Eigenschaften des Rauschens wie 
gesagt auch im System schätzen und erst dort den Filter berechnen. DAS 
ist dann wirklich kompliziert...

von Guest (Gast)


Lesenswert?

Gustl Buheitel schrieb:
> Erstmal werde ich jetzt das mit der 2. Ableitung versuchen, da bin ich
> gerade dran und hab auch schon etwas am Laufen. Sollte das keine
> deutliche Verbesserung bringen werde ich das mit der
> Durchschnitts-Nulllinie versuchen. Die Triggerschwelle würde ich dann
> auch nicht feste machen sondern an diese Nulllinie koppeln. Als Offset
> drüber.

Eigentlich sollte es das ziemlich viel schlechter machen. Ich verspreche 
dass selbst eine einfache ML Schätzung mit Annahme von Unkorreliertem 
Gausschen Rauschen besser wird. Andere Sache: Woher weißt du, wann ein 
Puls gekommen ist?

von Gustl B. (-gb-)


Lesenswert?

Also die 0V liegen nicht beim ADC bei 0 oder sogar drunter sondern schön 
in einem Bereich dass drunter sogar etwas Spannungen unter der Nulllinie 
erfasst werden können. Ich kann das verschieben mit einem Poti.

Wann ein Impuls kommt sehe ich derzeit dadurch dass Samplewerte über 
einer einstellbaren Triggerschwelle liegen. Mit einer dynamischen 
Triggerschwelle die mit dem Untergrund mitschwingt wird es schwierig. Ja 
da müsste man dann einen größeren Bereich angucken, also alte Werte für 
den dynamischen Untergrund aufheben und dann erkennen wenn neue Werte da 
deutlich von abweichen.

von Guest (Gast)


Lesenswert?

Gustl Buheitel schrieb:
> Also die 0V liegen nicht beim ADC bei 0 oder sogar drunter sondern schön
> in einem Bereich dass drunter sogar etwas Spannungen unter der Nulllinie
> erfasst werden können. Ich kann das verschieben mit einem Poti.
>
> Wann ein Impuls kommt sehe ich derzeit dadurch dass Samplewerte über
> einer einstellbaren Triggerschwelle liegen. Mit einer dynamischen
> Triggerschwelle die mit dem Untergrund mitschwingt wird es schwierig. Ja
> da müsste man dann einen größeren Bereich angucken, also alte Werte für
> den dynamischen Untergrund aufheben und dann erkennen wenn neue Werte da
> deutlich von abweichen.

Ah, da wirds schon interessanter. Und das Signal fluktuiert stark, wenn 
gerade keine Gauss-Kurve kommt? Also die Nulllinie ist nicht bei einer 
konstanten sondern variiert stark? Das ist das Problem, richtig?

von Tom (Gast)


Lesenswert?

Gustl Buheitel schrieb:
> Also das sind immer Gauß nur unterschiedlicher Höhe. Wen man das
> differenziert oder sich die maximale Steigung anguckt, ich weiß nicht ob
> das besser wäre wie die Fläche.

Du kannst einfach einen Modell-Fit für Gaußkurve mit Offset machen. Die 
Parameter wären dann Offset durch Nulllinie, Höhe/Breite der Gaußkurve 
und evtl. Zentrum der Gaußkurve.

von Guest (Gast)


Lesenswert?

Tom schrieb:
> Gustl Buheitel schrieb:
>> Also das sind immer Gauß nur unterschiedlicher Höhe. Wen man das
>> differenziert oder sich die maximale Steigung anguckt, ich weiß nicht ob
>> das besser wäre wie die Fläche.
>
> Du kannst einfach einen Modell-Fit für Gaußkurve mit Offset machen. Die
> Parameter wären dann Offset durch Nulllinie, Höhe/Breite der Gaußkurve
> und evtl. Zentrum der Gaußkurve.

Hast du dafür einen anderen praktikablen Algorithmus als einen ML 
Parameterschätzer? Least-Squares? Wie rechnet man das im System mit den 
Parametern aus? Wird das nicht ein gigantischer Rechenaufwand? Und führt 
das nicht am Ende auch auf einen ML Schätzer? Zu

von Guest (Gast)


Lesenswert?

*Zumindest bei Gaussförmigen Rauschen ist doch ML und LS das selbe oder?

von Gustl B. (-gb-)


Lesenswert?

Naja was heißt stark? Das Signal hat so einen Bereich von ca. 10Volt. 
Den bilde ich auf ungefähr den ganzen ADC Bereich ab, also oben und 
unten stößt es nie an da lasse ich etwas Platz. Und der ADC tastet das 
mit 12Bits und 50MSampes/s ab.

Jetzt als Beispiel:
Der Typische 6us Impuls wird dann 300 mal abgetastet. Für die Fläche 
ergibt es dann eine Summe aus 300*12Bit Werten.

12Bits sind 4096 Schritte, 10V (ganz grob) durch 4096=2,5mV je Schritt. 
Wenn ich jetzt also eine niedrige (im Vergleich zu den 6us) Frequenz 
drauf habe die mir die Nulllinie wackelt und das bis so +-50mV dann 
ändert das die Fläche deutlich. Einmal im Tal der langsamen Frequenz ist 
die Fläche dann um 300*50mV/2,5mV=6000 kleiner und mal um diese 6000 
größe auf einem Berg.

Wären das also zwei identische Impulse dann schwankt die Fläche trotzdem 
um 12000. Wie ist das jetzt im Vergleich zur Gesamtfläche?
Also Gesamtfläche ist grob, also ganz grob nehme ich jetzt mal an dass 
der Durchsnitt vom Gauß 2/3 des Maximums ist. Also jedes Sample 2/3 des 
maximalen Wertes vom Gauß. Dann ist das bei einem hohen Impuls mit den 
10V ungefähr 300*4096*2/3=819200 und für einen kleineren Impuls der nur 
5V hoch ist 0,5*300*4096*2/3=409600 und für einen kleinen Impuls der 1V 
hoch ist 819200/10=81920.
Spätestens da macht dann das Schwingen der Nulllinie schon einiges aus.

von Guest (Gast)


Lesenswert?

Kannst du so viele Rauschwerte wie möglich posten? Also einfach nur 
Werte die der ADC aufgenommen hat, ohne das Gauss-Signal. Praktisch 
einfach nur die Werte, die eigentlich nur 0 sein sollten. Am besten so, 
weiß nicht, ein paar Millionen Samples wären ganz gut. Daraus kann ich 
die Autokorrelationsfunktion, das Leistungsdichtespektrum und die 
Kovarianzmatrix sowie die Wahrscheinlichkeitsverteilung mit Varianz und 
Erwartungswert schätzen und weiteres Vorgehen abwägen.

von Gustl B. (-gb-)


Lesenswert?

Ähm ... also ja, könnte ich, aber dazu müsste ich erst das FPGA so 
beschreiben dass es das kann. Also das werde ich machen wenn ich hier 
mit der 2. Ableitung nicht weiter komme. Ich meine, Deine Idee klingt 
sehr gut, nur scheint mir das eher kompliziert, auch kompliziert dann in 
das FPGA zu bauen und verstehen tu ich das auch nicht wirklich. 
Jedenfalls Danke!

von Guest (Gast)


Lesenswert?

So jetzt habe ich ein wenig mehr Zeit. Vorweg: die von mir angefragten 
Werte solltest du am besten sowieso posten, dann kann man sich ein Bild 
der Lage machen und abschätzen welche Methode welche Ergebnisse bringt. 
Vielleicht ist die von dir verlangte Genauigkeit ja einfach garnicht 
möglich, dann sparst du dir ewiges rumgebastle.


Gustl Buheitel schrieb:
> Ich meine, Deine Idee klingt
> sehr gut, nur scheint mir das eher kompliziert, auch kompliziert dann in
> das FPGA zu bauen und verstehen tu ich das auch nicht wirklich.
> Jedenfalls Danke!

Ich versuche mal zu beschreiben was ich hier vor habe: Das Signal dass 
der ADC sieht ist eine Überlagerung des tatsächlichen Gaussignals und 
eines s.g. Rauschens.
Das Gaussignal kann man formelmäßig durch eine e-Funktion mit 
Quadratbildung im Exponenten darstellen. Dazu kommt ein Parameter Phi_1, 
der die Höhe der Kurve darstellt und ein Parameter Phi_2, der die Breite 
darstellt. Kennst du diese zwei Parameter, so kannst du die Fläche exakt 
berechnen (durch die Summe über die Signalwerte oder einfach per 
Formel).
Das Rauschen ist schwieriger. Man geht aus gutem Grund wenn man es nicht 
besser weiß von einer Gauß-Verteilung aus. Das bedeutet nun nicht, dass 
das Rauschen allein auch wie eine Gauß-Kurve aussieht. Viel mehr heißt 
es, dass zu jedem Zeitpunkt das Rauschsignal einen zufälligen Wert 
annimmt, aber ein Wert nahe an der Null wahrscheinlicher ist als ein 
Wert weiter draußen. Trägt man in einem Graphen die Wahrscheinlichkeit 
an der y-Achse und den Wert an der x-Achse an, so erhält man die Gauß 
Funktion. Nun kann es aber sein, dass man durch Kenntnis des 
Rauschwertes zu einem Zeitpunkt eine Aussage über den Wert an einem 
anderen Zeitpunkt machen kann. Das nennt man dann "die beiden Werte sind 
korreliert". In den Verschiedenen Größen Autokorrelationsfunktion, 
Leistungsdichtespektrum und Korrelationsmatrix sind die Informationen 
über diese Korrelation gespeichert.

Der Maximum-Likelihood Algorithmus macht nun folgendes: Wir empfangen 
bestimmte Daten Y[k] und überlegen uns nun, wie wahrscheinlich es ist, 
für bestimmte Parameter Phi_1 und Phi_2 genau diese Daten Y[k] empfangen 
zu haben. Dann wählen wir Phi_1 und Phi_2 so, dass diese 
Wahrscheinlichkeit maximiert wird. Wir raten also die Parameter so, dass 
die Messwerte am Wahrscheinlichsten zu den Parametern passen. Das ist im 
Grunde recht intuitiv.
Die Formel dazu habe ich schon gepostet, das ist die mit arg max. Man 
liest sie so:

Wir wählen das Argument (also das [Phi]) [arg], welches eine Funktion 
maximiert [max]. Diese Funktion ist die Wahrscheinlichkeit, dass wir die 
Werte Y empfangen haben, unter der Bedingung, dass die Parameter Phi 
waren [L(Y|Phi)].


Ich werde noch ein wenig rumrechnen, aber oft kommt aus diesem eher 
schwierigen Algorithmus ein sehr einfaches Ergebnis raus. Beispiel:

Du ziehst 50 mal eine Kugel aus einer Urne (mit Zurücklegen). Du weißt, 
dass 3 Schwarze Kugeln und eine unbekannte Anzahl weißer Kugeln in der 
Urne sind. Du möchtest nun die Anzahl der weißen Kugeln schätzen.
Das Ergebnis des ML-Schätzers wird sein:
Wobei x die Zahl der Versuche ist, bei der du eine Schwarze Kugel 
gezogen hast. Du siehst also, das kann dein FPGA ohne Probleme 
berechnen. Andererseits ist das (offensichtlich) ein sehr guter Schätzer 
der gute Ergebnisse bringt. Gibt ein Verfahren nicht auf, weil die 
Herleitung schwierig ist. Die Herleitung machst du nur einmal, dein 
Produkt muss nur das Ergebnis der Herleitung ausführen.

von Gustl B. (-gb-)


Lesenswert?

Ok, Danke. Also wie ist das wenn ich da Parameter rate, da brauche ich 
doch dann viele Versuche bis ich ein Optimum treffe? Für mich sieht das 
nach schwieriger Umsetzung aus, da wäre es wohl einfacher die 
Versorgungsspannung besser zu filtern oder so.
Ich will sagen bei dem schnellen Aufbau der Hardware lohnt es sich nicht 
viel Zeit in bessere Software zu investieren weil die bei der Hardware 
wohl besser aufgehoben wäre. Ich suche eher nach einer einfachen Methode 
das ergebnis etwas zu verbessern, also wie mit einer dynamischen 
Nulllinie. Hier hatte ich gefragt falls Jemand da andere Ideen hat die 
aber auch einfach umzusetzen sind.

Ich hab jetzt die 2. Ableitung im FPGA und das funktioniert auch. Bei 
der nächsten Gelegenheit werde ich das dann auch mal am echten Signal 
testen und gucken wie das Spektrum wird.

von Guest (Gast)


Lesenswert?

Gustl Buheitel schrieb:
> Ich hab jetzt die 2. Ableitung im FPGA und das funktioniert auch. Bei
> der nächsten Gelegenheit werde ich das dann auch mal am echten Signal
> testen und gucken wie das Spektrum wird.

Probiers halt in Matlab/Octave. Ich gehe davon aus dass das ganz 
furchtbar wird.

Gustl Buheitel schrieb:
> Ok, Danke. Also wie ist das wenn ich da Parameter rate, da brauche ich
> doch dann viele Versuche bis ich ein Optimum treffe? Für mich sieht das
> nach schwieriger Umsetzung aus, da wäre es wohl einfacher die
> Versorgungsspannung besser zu filtern oder so.
> Ich will sagen bei dem schnellen Aufbau der Hardware lohnt es sich nicht
> viel Zeit in bessere Software zu investieren weil die bei der Hardware
> wohl besser aufgehoben wäre. Ich suche eher nach einer einfachen Methode
> das ergebnis etwas zu verbessern, also wie mit einer dynamischen
> Nulllinie. Hier hatte ich gefragt falls Jemand da andere Ideen hat die
> aber auch einfach umzusetzen sind.

Mooooment. Raten heißt in dem Zusammenhang natürlich aufgrund der 
vorliegenden Daten eine Schätzung machen. Einfach den Maximalwert nehmen 
ist zum Beispiel Raten, allerdings eine ziemlich schlechte Methode. Ein 
ML Schätzer ist auch Raten, allerdings viel besser.

Ansonsten: nimms wie du willst. Bessere Hardware sorgt für ein besseres 
Signal und damit bessere Ergebnisse. Bessere Software nutzt die Hardware 
voll aus. Dein Arbeitgeber dankt dir bei einem Consumer Produkt bestimmt 
wenn du nen sehr genauen (teueren) ADC brauchst weil die Software 
einfach viel wertvolle Information wegwirft.

Den ML Schätzer auszurechnen ist ziemlich qualvoll, ich habe mal 
Mathematica bemüht. Ergebnis ist:

- Für phi1, also die Höhe musst du jeden Empfangswert den du einbeziehst 
mit einer Konstanten multiplizieren, das ganze aufsummieren und durch 
eine weitere Konstante dividieren.

- Für phi2, also die Breite benutzt du die Summe aus phi1, dividierst 
sie aber durch eine weitere Summe aus Koeffizienten und Samples. Davon 
nimmst du den Logarithmus und davon dann 1/Wurzel.

Ich würde sagen, das kann man auch in einem FPGA rechnen. Ich hoffe ich 
habe mich dabei nicht verrechnet, bin nicht sehr geübt in Mathematica.

von Guest (Gast)


Lesenswert?

Achso sowas wirklich ausrechnen tut man wohl in einem Softcore wenn man 
die Zeit dazu hat. Das spart Ressourcen. Ansonsten geht es sicher auch 
in richtiger Logik, aber letztendlich braucht man ja doch irgendwo noch 
einen Prozessor. Wie oft bekommst du denn so eine Gausskurve? Im Zweifel 
kann man auf dem FPGA nur die Korrelation rechnen und wenn man eine 
Kurve gefunden hat die wichtigen Samples an einen Prozessor übergeben.

Wofür ist der Spaß überhaupt, abgesehen davon Studenten am Feiertag auf 
Trab zu halten?

von Gustl B. (-gb-)


Lesenswert?

Logarithmus, Wurzel, und das in VHDL in einem FPGA?

Also es geht um ein Hobby. Also mein Vater misst Radioaktiven Zerfall 
und bekommt da diese Impulse. Als ADC verwendet er Hardware aus den 
80ern die das auch ganz gut macht aber keine Ahnung wie. Am ende fällt 
da je Impuls ein 13Bit Wert raus und viele davon ergeben ein schönes 
Spektrum. Weil es diese alten Geräte kaum noch auf eBay gibt dachte ich 
das kann man mit einem normalen ADC der oft abtastet recht leicht 
zumindest genauso gut machen, aber: Nein, ist wohl doch nicht soooo 
einfach. Also das was ich bisher habe ist minimal schlechter und reicht 
völlig für normale Detektoren aber eben nicht für sehr genaue Modelle.

Ich bin selber Student (Mathe/Physik für Lehramt nicht vertieft) und 
mache als Hobby etwas VHDL. Unter anderem habe ich schon ein FPGA 
Interface zu den alten ADCs. Und da mache ich auch Zeitstempel zu den 
einzelnen Werten der ADCs so dass man nicht nur ein Spektrum bekommt wie 
früher, sondern eine "Zeitreihe" also viele ADC Werte mit Zeite. Das hat 
den Vorteil, dass man das im Nachhinein in einzelne Messungen 
zerschneiden kann, aber auch, dass man einzelne Isotope rausfiltern 
kann, also wenn man eines hat das zuerst in ein Kurzlebiges zerfällt und 
dieses dann nochmal. Da kennt man dann die Zeit des Kurzlebigen und kann 
da mit Zeitfenstern schön filtern.

Bisher habe ich im FPGA keinen Prozessor und werde das auch nicht 
machen, genauso wie Wurzel und Logarithmus, soweit bin ich noch nicht 
:-)

von Guest (Gast)


Lesenswert?

Gustl Buheitel schrieb:
> Logarithmus, Wurzel, und das in VHDL in einem FPGA?

1/sqrt ausrechnen ist ganz einfach: 
http://en.wikipedia.org/wiki/Fast_inverse_square_root

Gustl Buheitel schrieb:
> (Mathe/Physik für Lehramt nicht vertieft)

Mathelehrer ohne Ahnung von Stochastik? Meiner Erfahrung nach leider die 
Regel...

Gustl Buheitel schrieb:
> Unter anderem habe ich schon ein FPGA
> Interface zu den alten ADCs. Und da mache ich auch Zeitstempel zu den
> einzelnen Werten der ADCs so dass man nicht nur ein Spektrum bekommt wie
> früher, sondern eine "Zeitreihe" also viele ADC Werte mit Zeite. Das hat
> den Vorteil, dass man das im Nachhinein in einzelne Messungen
> zerschneiden kann, aber auch, dass man einzelne Isotope rausfiltern
> kann, also wenn man eines hat das zuerst in ein Kurzlebiges zerfällt und
> dieses dann nochmal. Da kennt man dann die Zeit des Kurzlebigen und kann
> da mit Zeitfenstern schön filtern.

Mhm sowas macht man normalerweise in Prozessoren die sich die ADC Werte 
per DMA reinholen, wobei 50MSPS schon recht viel ist. Aber gut, Hobby 
ist Hobby, ich überleg noch ob mir noch eine einfachere Lösung einfällt.

von Guest (Gast)


Angehängte Dateien:

Lesenswert?

Hab nebenbei noch schnell ein Octave/Matlab Skript geschrieben mit dem 
man ein bisschen spielen kann:

Es erzeugt eine Gauss-Kurve mit Amplitude 2048, überlagert Rauschen mit 
Varianz 10 und einen sehr langsamen Sinus mit Amplitude 20. In etwa das, 
was du oben beschrieben hast. Dann berechnet es Flächen und Ableitungen. 
Falls du es nicht aufmachen kannst hänge ich noch einen Screenshot an, 
insbesondere um dir zu zeigen, was die Ableitungen mit deinem Signal 
machen...

von derguteweka (Gast)


Lesenswert?

Moin,

Guest schrieb:
> Hab nebenbei noch schnell ein Octave/Matlab Skript geschrieben mit dem
> man ein bisschen spielen kann

Ausgezeichnet, Smithers!

Ich hab' da mal grad unqualifiziert nach der Zeile 4 folgende 2 Zeilen 
reingepastet:
1
yy=conv(y,gausswin(300,4));
2
y=yy(150:450);

Das ist sehr unschoen, aber geht schnell...
Dann sieht man den Effekt des von mir vorgeschlagenen Gaussfilters. 
Vorteil: So ein FIR-Filter kann man oft auch mit der 
FPGA-Entwicklungsumgebung direkt als Core basteln. Und da seh' ich auch 
nicht so Probleme, das mit 50MSamples/sec zu betreiben, wie bei den 1/x, 
log(x) etc. Geschichten. Wenn's die unbedingt doch sein muessen, dann 
wuerd' ich aus Blockram gucken, eine grosse Lookuptable zu basteln. Dann 
klappts auch wieder mit dem Durchsatz.

Gruss
WK

von Christoph db1uq K. (christoph_kessler)


Lesenswert?

Von Analog Devices gibt es im Web und als Buch den "DSPguide", darin 
auch ein Kapitel zur Impulsverarbeitung von Szintillationsdetektoren
http://www.dspguide.com/ch17/2.htm

Ich nehme an, das ist auch die Anwendung hier, eine histografische 
Darstellung von Impulshöhen.

: Bearbeitet durch User
von Guest (Gast)


Lesenswert?

derguteweka schrieb:
> Das ist sehr unschoen, aber geht schnell...

Ja...naja...du vergisst dass du dafür mit 300 Koeffizienten filtern 
musst. Das Ergebnis ist recht gut, ein Matched Filter eben. Bei 50MHz 
mit 300 Koeffizienten braucht aber schon etwas mehr als sich durch den 
Coregen zu klicken und passt auch nicht in jedes FPGA denke ich. Wenn 
man es zwischen den Pulsen berechnen kann ist es natürlich kein Problem. 
Der TO hat ja noch nicht verraten wie oft Pulse kommen.

Wenn der TO die gewünschten Rauschwerte posten würde könnte man sich 
überlegen, ob man die Störfrequenz nicht einfach mit einem 
schmalbandingen Bandpass-IIR Filter dämpfen kann. Das dürfte bei, sagen 
wir, 10 Koeffizienten eigentlich schon passabel funktionieren.

von Christoph db1uq K. (christoph_kessler)


Lesenswert?

Beitrag "Re: Pollin PMT-Modul"
das waren damals meine Impulse aus dem Fotovervielfacher, ähnliche 
Impulsbreiten, von Gaussförmig kann ich aber nicht sprechen

von Guest (Gast)


Lesenswert?

Christoph Kessler (db1uq) schrieb:
> Von Analog Devices gibt es im Web und als Buch den "DSPguide", darin
> auch ein Kapitel zur Impulsverarbeitung von Szintillationsdetektoren
> http://www.dspguide.com/ch17/2.htm

Naja das hat der TO ja anscheinend schon korrekt umgesetzt, er hat ja 
angeblich schon Gaussförmige Pulse. Nur das Rauschen ist für ihn ein 
Problem.

von derguteweka (Gast)


Lesenswert?

Guest schrieb:
> Ja...naja...du vergisst dass du dafür mit 300 Koeffizienten filtern
> musst. Das Ergebnis ist recht gut, ein Matched Filter eben. Bei 50MHz
> mit 300 Koeffizienten braucht aber schon etwas mehr als sich durch den
> Coregen zu klicken und passt auch nicht in jedes FPGA denke ich. Wenn
> man es zwischen den Pulsen berechnen kann ist es natürlich kein Problem.
> Der TO hat ja noch nicht verraten wie oft Pulse kommen.

Das Filter sollte eigentlich "immer" laufen, denn sonst muss man sich ja 
vorher schon ueberlegen, was ein Puls ist und was nicht, etc.
Natuerlich; wenn man ein popeliges FPGA hat und nur faehig ist, beim 
Coregen auf OK zu druecken, ist man mit einem 300 Tap FIR evtl. etwas 
angeschmiert.

Aber grad' ein Gaussfilter laesst sich prima mit ein paar 
hintereinandergeschalteten Rechteckfiltern(also z.b. so eine 
Impulsantwort: [1,1,1,1] ) approximieren; dann wirds wirklich 
ueberschaubar, voellig multipliziererfrei und weil dann nur ein paar 
Addierer zwischen den Latches haengen, auch so schnell, dass man die 
Filter mit N*50MHz takten kann, dann noch Multiplexer/Demultiplexer 
davor/danach und schon braucht man dann noch weniger Platz....

Gruss
WK

von Gustl B. (-gb-)


Lesenswert?

@ Christoph Kessler:
Ja wir verwenden auch Szintillationsdetektoren, diese haben von sich aus 
schon eine deutlich niedrigere Auflösung als die Germaniumdetektoren. 
Für Szintillationsdetektoren reicht das was ich schon habe bestens, nur 
für gute Germaniumdetektoren eben nicht ganz. Wobei meine ADC 
Beschaltung auch sehr Laienhaft ist, ich vermute Jemand der sich etwas 
mehr mit Analogschaltungen auskennt würde das deutlich rauschfreien 
bauen ohne viel Mehraufwand.
Das ist auch der Grund weshalb ich nicht sonderlich viel Zeit für andere 
Methoden verwenden möchte.

@ Guest:
Ja ich hatte natürlich Stochastik, aber nur extrem wenig. Bei Lehramt 
nicht Vertieft geht das nicht wirklich über Mathe Grundkurs Niveau 
hinaus. Bis vor relativ kurzer Zeit wurde an Realschulen auch keinerlei 
Stochastik unterrichtet.

Ja hier ist schon alles gaußförmig, das macht nach dem Vorverstärker am 
Detektor ein Pulse-Shaping-Amplifier. Dahinter gucke ich mir das Signal 
an.

Impulse kommen je nach Zählrate. Also je nach Probe mal sehr wenige 
Einzelne je Sekunde bis hin zu so 1000 und mehr je Sekunde.

Also was ihr hier rechnet und wie ihr helfen möchtet ist sehr 
lobenswert, wirklich. Aber hier ist mein ADC Board: 
Beitrag "Re: ADC single ended Schaltung" Also ... zuerst 
würde ich das verbessern weil sich da vermutlich sehr einfach ein 
besseres Ergebnis erziehlen lässt. Hier habe ich den Thread nur 
aufgemacht in der Hoffnung, dass es auch auf FPGA-Seiten eine einfache 
Verbesserung gibt. Meine feste Triggerschwelle über der die Fläche 
summiert wird ist nämlich ähnlich unprofessionell wie die Hardware. Ich 
werde aber nirgens wirklich viel Zeit investieren.

Wieso mache ich das dann überhaupt?
Also wie schon geschrieben sind alte ADCs die für diese Spezialanwendung 
gebaut wurden Mangelware und neue Modelle sehr teuer. Mit meiner 
Bastellösung kann ich hier zumindest schon einige alte ADCs für 
schlechtere Detektoren ersetzen.
Die ADC Platine habe ich gebastelt weil ich keine fertige gefunden habe 
die A) einen single-ended-Eingang und B) keinen Hochpass hat und C) 
nicht teuer ist. Eigentlich alles im Preisrahmen hat einen Transformator 
oder sonst wie Hochpass Eingang und das ist eben unbrauchbar. Also 
vermute ich jetzt mal so.

Falls einer von Euch Elektronik baut, dann wäre eine ADC Platine ein 
schönes Projekt. Jedoch habe ich keine Ahnung von der Nachfrage. Für SDR 
hat man gerne einen Transformator Eingang und für vieles Andere reichen 
deutlich langsamere ADCs. Ich habe mich für einen "schnellen" ADC mit 
vielen Bits entschieden um die Kurve möglichst genau abzutasten. Im 
Vergleich zu einem 8Bit ADC (http://www.knjn.com/Flashy.html) und einem 
leicht modifizierten OpenADC (10Bits) (http://newae.com/openadc) bei 
jeweils 50MSamples/s ist meine 12Bits Selbstbaulösung schon besser.

von Guest (Gast)


Lesenswert?

Gustl Buheitel schrieb:
> Im
> Vergleich zu einem 8Bit ADC (http://www.knjn.com/Flashy.html) und einem
> leicht modifizierten OpenADC (10Bits) (http://newae.com/openadc) bei
> jeweils 50MSamples/s ist meine 12Bits Selbstbaulösung schon besser.

Wirklich? So wie du das aktuell machst hast du einen Sinus von 50mV, 
also 20 Division drauf. Das entspricht über 4 bit. Von deinem 12bit ADC 
kannst du also nichtmal 8 mit vernünftiger Sicherheit benutzen...

Wenn ich dir einen Tipp geben darf: Mach das ganze auf einem RedPitaya. 
Das ist ein FPGA Board mit zwei 14bit 125MSPS (50 MHz BW) DC coupled 
ADCs, die auch wirklich funktionieren. Der FPGA ist ein Zynq, also ein 
sehr potenter FPGA mit einem Dualcore ARM auf dem Linux läuft, du kannst 
also die Daten per FPGA vorbereiten und dann auf einem sehr potenten 
embedded System fertigrechnen.

http://www.elektor.de/red-pitaya-instrument Aktuell für 240 Euro im 
Angebot.

Gustl Buheitel schrieb:
> Bei Lehramt
> nicht Vertieft geht das nicht wirklich über Mathe Grundkurs Niveau
> hinaus. Bis vor relativ kurzer Zeit wurde an Realschulen auch keinerlei
> Stochastik unterrichtet.

Das halte ich an unserem Schulsystem für so schlecht. Menschen die für 
ein Fach brennen werden das nie als Lehramt studieren weil man dann mit 
dem Fach kaum zu tun hat. Gerade in den weiterführenden Schulen sind die 
Lehrer doch eh weniger als Erzieher und Pädagogen gefragt sondern mehr 
als Motivationsstützen. Wenn die ein Fach kaum interessiert wird es auch 
den Schülern keinen Spaß machen. Nichts gegen dich, Physik scheint dich 
ja eher zu interessieren...

von Guest (Gast)


Lesenswert?

http://blog.redpitaya.com/?p=9 Du wärst nicht der Erste, der das mit 
einem RedPitaya macht. Die Leute hier haben scheinbar nichtmal einen 
Vorverstärker, das RedPitaya hängt angeblich direkt an der 
Photomultiplizierer-Anode.

von derguteweka (Gast)


Lesenswert?

Moin,

Gustl Buheitel schrieb:
> Also ... zuerst
> würde ich das verbessern weil sich da vermutlich sehr einfach ein
> besseres Ergebnis erziehlen lässt. Hier habe ich den Thread nur
> aufgemacht in der Hoffnung, dass es auch auf FPGA-Seiten eine einfache
> Verbesserung gibt.

Seh' ich anders. "sehr einfach ein besseres Ergebnis" ist was anderes 
als: Entwickle, beschaffe und bestuecke eine HF-gerechte, mindestens 2 
lagige Platine.
Und ich find' deinen Aufbau in dem Rahmen voellig OK. Klar - die 
Leitungen zu den Keramik-Cs koennten kuerzer sein, etc. bla; aber 
dafuer, dass du halt nicht viel Zeit investieren willst/kannst isses 
voellig OK.

Unter diesen Vorraussetzungen wuerd' ich sagen: Versuch einfach in 
deinen Signalpfad im FPGA gleich nach dem Eingang "irgendein" 
Tiefpassfilter reinzubauen. Voellig egal wie der ausschaut; 
Grenzfrequenz irgendwo bei vielleicht 200KHz. "Schlimmer" kanns damit 
auf keinen Fall werden...

Gruss
WK

von Guest (Gast)


Lesenswert?

derguteweka schrieb:
> Unter diesen Vorraussetzungen wuerd' ich sagen: Versuch einfach in
> deinen Signalpfad im FPGA gleich nach dem Eingang "irgendein"
> Tiefpassfilter reinzubauen. Voellig egal wie der ausschaut;
> Grenzfrequenz irgendwo bei vielleicht 200KHz. "Schlimmer" kanns damit
> auf keinen Fall werden...

Ich denke die Störung ist wesentlich niederfrequenter als das Signal?

von Gustl B. (-gb-)


Lesenswert?

Also das mit den 50mV naja also wenn ich bei meinem Oszi die Zeit auf 
sagen wir 1ms/div stelle und 50mV/div dann füllt das Signal halt so ca. 
1div aus in der Vertikalen.

Richtig, das RedPitaya hat mich auch schon interessiert, aber ich will 
das was ich mache eigentlich nicht in einer CPU machen weil ich keine 
Ahnung davon habe. Also klar es war auch eines der wenigen die ich 
gefunden hatte die von den Specs passen, aber ich will jetzt nicht 
Treiber für Linux schreiben lernen. Daher eine Frage: Kann man bei dem 
Zynq auch nur den FPGA Teil verwenden? Also so wie einen Artix? Genug 
GPIOs hat der ja ... da würde ich dann VGA, einen UART und was für ein 
paar Drehgeber machen so wie ich das jetzt mit dem Spartan3/6 mache.

Tja das Schulsystem^^, also mich interessier Physik deutlich mehr als 
Mathe und zwar weil Physik näher am Lehrplan ist. Klar da macht man auch 
viel was man später nie mehr braucht, aber es gibt auch vieles was 
sinnvoll ist. Generell kommt die Didaktik deutlich zu kurz würde ich 
sagen. Also zumindest bei Lehramt nicht vertieft.

Edit:
Zu den Störungen kann ich nicht viel sagen. Also ja, ich habe 
hochfrequente Störungen, also vor allem die 50MHz vom Takt, aber die 
sind ja immer da und deutlich schneller als der Impuls. Das sollte also 
eigentlich nicht allzuviel ausmachen. Stören würden Signale die mal da 
sind und mal nicht oder so niederfrequent, dass die Impulse mal auf Berg 
und mal im Tal sitzen, also die Nulllinie verschoben wird.

: Bearbeitet durch User
von Guest (Gast)


Lesenswert?

Gustl Buheitel schrieb:
> Also das mit den 50mV naja also wenn ich bei meinem Oszi die Zeit auf
> sagen wir 1ms/div stelle und 50mV/div dann füllt das Signal halt so ca.
> 1div aus in der Vertikalen.

Und in der Horizontalen? Über welche Frequenzen reden wir hier?

Gustl Buheitel schrieb:
> Daher eine Frage: Kann man bei dem
> Zynq auch nur den FPGA Teil verwenden? Also so wie einen Artix? Genug
> GPIOs hat der ja ... da würde ich dann VGA, einen UART und was für ein
> paar Drehgeber machen so wie ich das jetzt mit dem Spartan3/6 mache.

Kann man machen, ist aber Verschwendung. Man macht es eher genau 
andersrum.
Auf dem Teil läuft wie gesagt Linux. Das heißt du schließt es an und es 
zeigt sofort auf deinem Monitor was an, du kannst Maus und Tastatur 
anstecken, du kannst das Netzwerk anstecken usw. Scheinbar gibt es dann 
einen fertigen Treiber für den ADC, das heißt du steckst deinen 
Detektordings an und kriegst direkt die Samplewerte, die du dir mit 
vorgefertigten Programmen erstmal wie auf einem Oszi angucken kannst. 
Den Rest kannst du dir dann mit Python oder Bash und Gnuplot 
zusammenstricken, das ist nicht sehr schwer aber natürlich anders als 
VHDL.

Zum Beispiel:
http://wiki.redpitaya.com/index.php?title=User_Manual#Signal_acquisition_utility
Du steckst Monitor Maus und Tastatur an, fährst das Teil hoch, tippst 
"acquire 300" ein und hast sofort von jedem der beiden ADCs 300 Samples 
auf dem Schirm.

von Gustl B. (-gb-)


Lesenswert?

Das Rauchen hatte ich Eins oben im Edit beschrieben, mehr weiß ich dazu 
nicht. Aber ich habe einen Schaltregler drinnen um aus 6V 3,3V zu 
machen.

Ja also Linux und Python verwende ich um Spektren zu erstellen, aber ... 
ist das schnell genug um in Echtzeit alle Impulse zu erkennen? Das mit 
dem ADC würde ich schon gerne im FPGA machen und dann nur die 
Flächenwerte und einen Zeitstempel an das Linux schicken. Oder 
meinetwegen die Samples selber in denen der Impuls liegt.

von Gustl B. (-gb-)


Angehängte Dateien:

Lesenswert?

So, hier mal von oben nach unten Original, erste Ableitung und zweite 
Ableitung eines Testsignals (vom Signalgenerator). Ich finde das sieht 
gar nicht soooo schlecht aus. Wenn ein Detektor frei ist für eine 
Testmessung dann werde ich das mal mit richtigen Signalen vom Detektor 
machen.

von Wolfgang (Gast)


Lesenswert?

Gustl Buheitel schrieb:
> Als ADC verwendet er Hardware aus den 80ern die das auch ganz gut macht
> aber keine Ahnung wie. Am ende fällt da je Impuls ein 13Bit Wert raus
> und viele davon ergeben ein schönes Spektrum.

Dann wird das wohl ein Szintillationsdetektor mit Ladungskonverter sein, 
in der Art http://arxiv.org/abs/0911.0986

von Guest (Gast)


Lesenswert?

Gustl Buheitel schrieb:
> So, hier mal von oben nach unten Original, erste Ableitung und zweite
> Ableitung eines Testsignals (vom Signalgenerator). Ich finde das sieht
> gar nicht soooo schlecht aus. Wenn ein Detektor frei ist für eine
> Testmessung dann werde ich das mal mit richtigen Signalen vom Detektor
> machen.

Sieht nich ganz unbrauchbar aus, ja. Wie kommt das? Hast du vielleicht 
einen Tiefpass im ADC, der auf wesentlich weniger als 25MHz begrenzt?

von Gustl B. (-gb-)


Lesenswert?

Hallo, ja wir haben auch Szintillationsdetektoren, aber auch 
Germanium-Kristall-Detektoren. Für die Szintillationsdetektoren reich 
das was ich habe schon bestens. Die haben selber keine gute Auflösung. 
Bei Germaniumdetektoren sieht das schon anders aus, da braucht man 
bessere Messtechnik dahinter.

Edit:
@ Guest:
Ich verwende Mittelwerte oder ... ich summiere immer mehrere Samples 
zusammen und berechne dann zwischen mehreren davon die Steigung. Also 
Steigung ist dann

(Sample0+Sample1+Sample2+Sample3) - (Sample4+Sample5+Sample6+Sample7)

Also so in der Art. Aber vielleicht macht es das auch schlechter.

: Bearbeitet durch User
von Guest (Gast)


Lesenswert?

Gustl Buheitel schrieb:
> @ Guest:
> Ich verwende Mittelwerte oder ... ich summiere immer mehrere Samples
> zusammen und berechne dann zwischen mehreren davon die Steigung. Also
> Steigung ist dann
>
> (Sample0+Sample1+Sample2+Sample3) - (Sample4+Sample5+Sample6+Sample7)
>
> Also so in der Art. Aber vielleicht macht es das auch schlechter.

Ah! Sag sowas doch! Schlechter macht es das nicht unbedingt aber ein 
richtiges FIR Filter wäre ein Stück besser. Wenn du das mit 5 Werten 
machst hast du eben statt 50MSPS nurnoch 10MSPS und damit statt 25MHz 
nurnoch 5MHz Bandbreite. Nachdem im oberen Frequenzspektrum eh nur 
Rauschen ist gleicht das die Wirkung des Hochpasses (ableiten) wieder 
aus. Letzten Endes ist die hohe Abtastrate erstmal unsinnig und du musst 
überlegen wie du am besten Nutzen daraus ziehst. Da ist der Mittelwert 
eigentlich garnicht schlecht.

http://www.atmel.com/images/doc8003.pdf

von derguteweka (Gast)


Lesenswert?

Moin,

Guest schrieb:
>> (Sample0+Sample1+Sample2+Sample3) - (Sample4+Sample5+Sample6+Sample7)
>>
>> Also so in der Art. Aber vielleicht macht es das auch schlechter.
>
> Ah! Sag sowas doch! Schlechter macht es das nicht unbedingt aber ein
> richtiges FIR Filter wäre ein Stück besser.

Ich weiss nicht, ob's allen bewusst ist, aber das ist ein "richtiges" 
FIR Filter - mit der Impulsantwort [1,1,1,1,-1,-1,-1,-1] - das koennte 
man sich z.B. vorstellen aus einer Kettenschaltung eines simplen 
Tiefpasses [1,1,1,1] und eines Differenzierers [1,0,0,0,-1].
Wenn man jetzt einfach noch ein paar von diesen [1,1,1,1] Tiefpaessen 
oder sowas in der Art einbaut, dann kommt man immer naeher an ein 
Matched(hier: Gauss)-Filter.

Gruss
WK

von Gustl B. (-gb-)


Angehängte Dateien:

Lesenswert?

Ui sehr schön, Danke @derguteweka, war mir nicht bewusst! Und auch Danke 
@Guest für das PDF! Ich taste so schnell ab weil ... mehr Daten mehr 
gut, also keine Ahnung ob das stimmt aber es sieht oft danach aus.

Jetzt habe ich auch mal Spektren angehängt. Einmal mit dem 8Bit ADC von 
KNJN und einmal mit dem 12Bit Eigenbau. Das sind unterschiedliche 
Proben, aber die Peaks sollten von der Breite her trotzdem gleich sein.

Also ich bin schon zufrieden mit dem Eigenbau, aber ... es könnte eben 
noch etwas besser sein. Der Peak bei Kanal 3900 ist auf halber Höhe etwa 
14 Kanäle breit. 11 Kanäle hat der bei dem alten ADC der extra dafür 
gebaut ist.

: Bearbeitet durch User
von Guest (Gast)


Lesenswert?

derguteweka schrieb:
> Ich weiss nicht, ob's allen bewusst ist, aber das ist ein "richtiges"
> FIR Filter - mit der Impulsantwort [1,1,1,1,-1,-1,-1,-1] - das koennte
> man sich z.B. vorstellen aus einer Kettenschaltung eines simplen
> Tiefpasses [1,1,1,1] und eines Differenzierers [1,0,0,0,-1].
> Wenn man jetzt einfach noch ein paar von diesen [1,1,1,1] Tiefpaessen
> oder sowas in der Art einbaut, dann kommt man immer naeher an ein
> Matched(hier: Gauss)-Filter.
>
> Gruss
> WK

Nicht wirklich. Zumindest ich habe es so gelesen, dass er das immer für 
4 Werte macht und dann direkt zu den nächsten 4 springt. Für das FIR 
filter müsste er immer nur einen Schritt weitergehen. Das ist FIR -> 
Dezimator -> FIR.

von Gustl B. (-gb-)


Lesenswert?

Ja also ich gehe immer nur um einen Schritt weiter. Was mache ich 
gerade?

Für jeweils eine Ableitung habe ich einen Puffer von 16 Samples die in 
jedem Takt um eines weiter geschoben werden. Dann nehme ich in jedem 
Takt die ältesten 8 dieser Werte und summiere diese auf und das Gleiche 
mache ich auch mit den neuesten 8. Die Summen subtrahiere ich dann für 
die Steigung. Das geschieht alles in einer "Pipeline", aber jeden Takt 
kommt da ein Ergebnis raus und jeden Takt werden die Eingangswerte um 1 
verschoben. Also vielleicht ein Filter ...

Edit:
Kann man sich so eine Summen/Mittelwertbildung als eine Art 
"Kondensator" vorstellen? Also etwas das Werte puffert und vermengt 
miteinander. Also Ein Kondensator der nur mit einem Beinchen am Signal 
hängt, eben eine zusätzliche Kapazität. Oder eher nicht?

Das Ergebnis der 1. Ableitung geht dann in den Puffer für die 2. 
Ableitung.

: Bearbeitet durch User
von derguteweka (Gast)


Lesenswert?

Moin,

Gustl Buheitel schrieb:
> Ja also ich gehe immer nur um einen Schritt weiter. Was mache ich
> gerade?
>
> Für jeweils eine Ableitung habe ich einen Puffer von 16 Samples die in
> jedem Takt um eines weiter geschoben werden. Dann nehme ich in jedem
> Takt die ältesten 8 dieser Werte und summiere diese auf und das Gleiche
> mache ich auch mit den neuesten 8. Die Summen subtrahiere ich dann für
> die Steigung. Das geschieht alles in einer "Pipeline", aber jeden Takt
> kommt da ein Ergebnis raus und jeden Takt werden die Eingangswerte um 1
> verschoben. Also vielleicht ein Filter ...
Jepp, das ist zweifelsohne ein FIR-Filter :-D
Kleiner Trick:

Fuer dieses Filter wirst du dann neben den Flipflops fuer die 
Schieberegister auch 15 Addierer mit jeweils >=12Bit gebraucht haben.
Wenn du jetzt ein Filter nimmst, in dem du immer 8 Samples aufsummierst 
(Impulsantwort: [1,1,1,1,1,1,1,1]) und den Ausgang dieses Filters in ein 
2. Filter gibst, mit der Impulsantwort [1,0,0,0,0,0,0,0,-1] dann 
brauchst du fuer das selbe Ergebnis nur 8 Addierer...Das ganz kann man 
dann noch weiter "vereinfachen"; das geht in Richtung CIC-Filter (um mal 
ein Stichwort fallen zu lassen).

> Edit:
> Kann man sich so eine Summen/Mittelwertbildung als eine Art
> "Kondensator" vorstellen? Also etwas das Werte puffert und vermengt
> miteinander. Also Ein Kondensator der nur mit einem Beinchen am Signal
> hängt, eben eine zusätzliche Kapazität. Oder eher nicht?

Mnnnnjaaaahmmmvielleichtsoungefaehr. Klassisch vergleicht man ein 
IIR-Filter 1.Ordnung eher mit einem RC-Tiefpass. Ein Sonderfall davon, 
auf FIR umgemuenzt, koennte dann so aussehen: [8,4,2,1] als 
Impulsantwort; d.h. die einzelnen Samples werden unterschiedlich 
gewichtet, aber noch so, dass die Multiplikation noch "simpel" ist - im 
Gegensatz zu dem was du machst: [1,1,1,1]. Aber beides sind irgendwie 
Tiefpassfilter, obwohl das [1,1,1,1] imho "schoenere Sperrdaempfung" und 
schoeneren Phasengang hat.

Mit aehnlichen Bauchschmerzen kannst du auch einen Differenzierer mit 
einem RC-Hochpass vergleichen.

> Das Ergebnis der 1. Ableitung geht dann in den Puffer für die 2.
> Ableitung.

Der dann nochmal genauso aufgebaut ist, oder nur noch einen 
Differenzierer drinnen hat?

Gruss
WK

von Gustl B. (-gb-)


Lesenswert?

Danke für den Hinweis mit dem Trick. Falls ich irgendwo an FPGA-Grenzen 
stoßen sollte werde ich das einbauen.

Ja der Zweite ist genau gleich. Meine 1. Ableitung sieht deutlich 
verrauschter wie die 2. aus, vielleicht sollte ich da über noch mehr 
Samples mitteln. Egal, erstmal testen mit einem Messignal.

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.