Forum: FPGA, VHDL & Co. FIR parallel und seriell braucht zu viele LUTs.


von Gustl B. (-gb-)


Angehängte Dateien:

Lesenswert?

Hallo,
ich habe einen ADC, da kommen mit 5 MSamples/s die Werte raus. Im FPGA 
habe ich einen Takt von 100 MHz. Das bedeutet, dass ich je Sample 20 
Takte Zeit habe. Weil ich auch 45 DSP Slices habe und am Ende 4 FIR 
Filter brauche, kann ich grob 10 DSP Slices je FIR verwenden. Das macht 
20 Takte*10 DSPs = 200 Koeffizienten.
Und tatsächlich, das geht auch wunderbar. Aber: Es werden unfassbar 
viele LUTs verwendet. Ich suche jetzt eine Möglichkeit wie man das im 
FPGA möglichst sparsam baut, gerne mit BRAM oder so.

Was ich versucht habe:
Die Samplewerte in ein Schieberegister stecken mit 200*16Bit. Braucht 
viele LUTs.
Dann einen "Ringspeicher", also kein Schieben der Samples in den 
Speicher sondern schreiben an eine Adresse, weil aber je Takt 10 Samples 
gleichzeitig verrechnet werden wird auch daraus kein BRAM.

Gibt es da eine elegante Möglichkeit?

Vielen Dank!

Edit:
Eine verschwenderische Lösung ist mir eingefallen:
20 BRAMs verwenden und die reih um mit Samples beschreiben. Dann kann 
man in jedem Takt von allen 20 BRAMs lesen.
Tja sonst könnte ich einen dickeren FPGA kaufen, der hat dann auch mehr 
DSPs.

Edit2:
Jetzt habe ich noch die Variante mit Schieberegister hochgeladen. Das 
braucht schon deutlich weniger LUTs, statt 126% des Artix XC7A15 sind es 
jetzt nur noch 54%. Aber passt mit der restlichen Logik dann trotzdem 
noch nicht.

: Bearbeitet durch User
von Thorsten S. (thosch)


Lesenswert?

Mein Ansatz:

Ein Dual-Port Blockram nehmen.
Die Samples werden dort in einem von 20 Taktpunkten eingeschrieben.
Das ganze steuert man mit einem Ablaufzähler, der modulo 20 zählt.

Bei symmetrischer Filter-Apertur kann man die Addition ausklammern, also 
beide Ports des BRAMs erst addieren und dann die Summe mit einem 
Filterkoeffizienten multiplizieren, der vom Ablaufzähler adressiert, aus 
einem Koeffizientenspeicher abgerufen wird.

zur Adressierung der beiden Ports nimmt man die Schreibadresse als 
Basis, von der relativ entsprechende Offsets subtrahiert werden, um die 
Samples für die Filterapertur durch den Ablaufzähler gesteuert zu 
adressieren.

Den im DSP-Slice hinter dem Multiplizierer liegenden Addierer nutzt man 
als Akku, um die Ergebnisse der Multiplikationen (Samplesumme × 
Koeffizient)
aufzusummieren.

Mit einem Takt vom 20-Fachen der Samplerate schafft man so mit einem 
BRAM und einem DSP-Slice ein symmetrisches FIR-Filter mit 19 bzw. 20 
unterschiedlichen Koeffizienten.

Dazu kommt noch der Aufwand für Schreiben (Schreibadreßzähler) sowie die
Adreßberechnung fürs Auslesen der Samples der Filterapertur (ROMs + 
Subtrahierer) und für die Akku-Ablaufsteuerung, sowie der 
Koeffizientenspeicher (Dual-Port-RAM oder ROM), je nachdem, ob Koeff. 
fest oder ladbar sein sollen.

von Dergute W. (derguteweka)


Lesenswert?

Moin,

Vielleicht nicht nur die stumpfe Holzhammermethode fuer'n FIR Design 
nehmen.
Jenachdem wieviel die Phase/Gruppenlaufzeit wackeln darf, das Ding evtl. 
als IIR entwerfen. (Wenns nicht wackeln darf und trotzdem IIR sein muss, 
halt noch eine Gruppenlaufzeitkorrektur, ist eine etwas fiesere 
Rechnerei).
Oder vielleicht bringts was, das Signal per Mischer etwas im Spektrum zu 
verschieben, dann durch einen mit Tricks billig gemachtes Tiefpass-FIR 
zu filtern, danach wieder in Original Frequenzlage zurueckmischen...Muss 
man halt etwas experimentieren. Oder'n dickeres FPGA kaufen.

Gruss
WK

von Gustl B. (-gb-)


Lesenswert?

Thorsten S. schrieb:
> Mit einem Takt vom 20-Fachen der Samplerate schafft man so mit einem
> BRAM und einem DSP-Slice ein symmetrisches FIR-Filter mit 19 bzw. 20
> unterschiedlichen Koeffizienten.

OK, verstanden, aber wie ich oben im Edit schrieb brauche ich dann viele 
BRAMs. Also hier wären das 20 Stück für 200 Koeffizienten oder eben 10 
BRAMs mit Ausklammern. Ist immer noch viel für den kleinen Artix ...
Mit doppeltem Takt wird es wieder weniger ... hm ...

von FPGA zum Spass (Gast)


Lesenswert?

Du hast feste Koeffizienten, also brauchst du keinen Schreibport am 
DualPort Rom.

Zusätzlich hat so ein Blockram 36 Bit pro Port, du kannst also pro Takt 
4 Koeffizienten auslesen -> 2*16 bit pro Port.

Damit komme ich auf 3 Blockrams um 10 DSPs zu speisen.

Ist warscheinlich nicht ganz so nett hinzuschreiben, damit die Synthese 
das macht, geht aber.

von Gustl B. (-gb-)


Lesenswert?

Dergute W. schrieb:
> Oder'n dickeres FPGA kaufen.

Dazu tendiere ich gerade. Der Artix 100 ist auch nicht teuer.

Dergute W. schrieb:
> Jenachdem wieviel die Phase/Gruppenlaufzeit wackeln darf, das Ding evtl.
> als IIR entwerfen.

Wäre möglich aber IIR sieht für mich als Laie ziemlich fies aus. Habe 
ich noch nie gemacht.

FPGA zum Spass schrieb im Beitrag #5956137:
> Zusätzlich hat so ein Blockram 36 Bit pro Port, du kannst also pro Takt
> 4 Koeffizienten auslesen -> 2*16 bit pro Port.

Ob der jetzt BRAMs mit 36 Bit nimmt oder zwei mit 18 ist mir egal. 
Letzteres ist aber vielleicht einfacher zu schreiben. Vielleicht reicht 
es ja schon, wenn ich aus dem Koeffizientenarray aus 200 Integern 5 
Arrays mit je 40 Koeffizienten baue und dann daraus getaktet je Takt 
zwei Koeffizienten lese.

von Walter T. (nicolas)


Angehängte Dateien:

Lesenswert?

Viele Koeffizienten klingt für mich immer nach langsamem Filter. 
Langsames Filter klingt für mich nach "perfekt für IIR".

Anderer Ansatz: Da die Koeffizienten symmetrisch sind, und alles vor 40 
und nach 160 kaum Einfluß hat, sollte da eine einfache Verzögerungskette 
reichen, d.h. Koeffizienten brutal auf Null setzen.

Was soll das Filter denn anstellen, wenn es fertig ist?

von Gustl B. (-gb-)


Angehängte Dateien:

Lesenswert?

Es soll filtern. Das ist ein Bandpass von 100 kHz bis 500 kHz. Das 
analoge Signal wird mit 5 MSamples/s abgetastet.

von Dergute W. (derguteweka)


Lesenswert?

Moin,

Gustl B. schrieb:
> Es soll filtern. Das ist ein Bandpass von 100 kHz bis 500 kHz. Das
> analoge Signal wird mit 5 MSamples/s abgetastet.

<Loriot>Ach</Loriot>
Ist schon klar, aber was muss das Filter tatsaechlich koennen? Also 
Mindestsperrdaempfung; Max. Durchlassripple, Abstand zwischen 
Durchlass/Sperrbereich, Phasengang,...
Wenn du jetzt sagst: Ja, bestmoeglich, fokussiert auf alle 
angesprochenen Punkte - und was anderes ausser diesem Typ FIR kann ich 
eh' nicht - dann sag' ich: Geh halt mit der Koeffizientenzahl soweit 
runter, dass der ganze Kram incl. LUTs etc. und restlichem Design in's 
FPGA passt.

Gruss
WK

von Thorsten S. (thosch)


Lesenswert?

Gustl B. schrieb:
> Mit doppeltem Takt wird es wieder weniger ... hm ...

200 MHz sollten für einen Artix jetzt nicht soo problematisch sein.
Auch wenn von draußen nur 100 MHz zur Verfügung stehen, mit der PLL aus 
dem DCM-Block machst du daraus einfach synchrone 200 MHz.

: Bearbeitet durch User
von Gustl B. (-gb-)


Angehängte Dateien:

Lesenswert?

So, 5 neue Array statt einem, die Koeffizienten habe ich hybsch 
umsortiert. Per Hand. Aber gut ...

Array0:
koe0, koe1, koe10, koe11, ...
Array1:
koe2, koe3,
Array2:
koe4, koe5
Array3:
koe6, koe7
Array4:
koe8, koe9,

Die Leseadressen, ja zwei je Array, soll ja auch die DP-RAM werden, sind 
getaktet. Aber es wird einfach nicht in BRAMs gesteckt. Gibt es da eine 
minimale Grenze die einstellbar ist? Also dass man dem Vivado sagen 
kann, dass es auch lächerlich kleine Array in BRAMs packen soll?

Dergute W. schrieb:
> Ist schon klar, aber was muss das Filter tatsaechlich koennen? Also
> Mindestsperrdaempfung; Max. Durchlassripple, Abstand zwischen
> Durchlass/Sperrbereich, Phasengang,...

Gute Frage, weiß ich nicht so genau. Ist auch eher eine Bastelei aus 
Spaß. Wir messen hier Radioaktivität, da ist ein Detektor, dahinter ein 
Shaping Verstärker, daraus kommen gaußförmige Impulse von so 1 bis 8 us 
Länge und die gehen in einen ADC der je Impuls ein Bitmuster liefert.

Das ist alles alte Hardware. In den letzten Jahren habe ich den alten 
ADC schon mit eigener FPGA Hardware verbunden um den Werten Zeitstempel 
zu geben die sehr genau sind. Da kann man jetzt wunderbar Zerfälle 
filtern anhand der Zeitabstände und Zerfallsenergien.
Dann habe ich den alten ADC ersetzt durch einen der schnell abtastet und 
dann die Abtastwerte über einem Schwellwert aufsummiert. Auch das hat 
funktioniert und wird verwendet.

Im Rahmen eines Uniprojekts habe ich mittlerweile Hardware gebaut die 
einen höher auflösenden 5 MSps ADC drauf hat mit 4 Kanälen. Das 
funktioniert auch recht rauschfrei, das Projekt ist abgeschlossen, alles 
funktioniert, ich habe viel gelernt. Jetzt habe ich diese Hardware hier 
und möchte mal probieren ob ich damit auch diese gaußförmigen Impulse 
gut, möglichst besser als bisher, erfassen kann. Das ganze 
niederfrequente Rauschen soll möglichst weg und alles Hochfrequente 
auch, daher der Bandpass. Da soll am Ende wieder ein gaußförmiges Signal 
rauskommen, aber ohne DC und mit weniger Rauschen, das ich einfach nur 
aufintegrieren muss in Software um schöne Werte zu bekommen. Das hier 
ist einfach nur ein erster Test.

Natürlich könnte ich weniger Koeffizienten nehmen, einen dickeren FPGA, 
einen anderen ADC, eine andere Schaltung davor, aber das ist jetzt eben 
die Hardware die ich hier habe. Eine ganz andere Idee wäre auch das 
Signal über einen Transformator zu koppeln und dann mit einem 
Spitzenwertdetektor festzuhalten und einmal hochauflösend zu sampeln. 
Aber das habe ich jetzt nicht hier.

Dergute W. schrieb:
> Geh halt mit der Koeffizientenzahl soweit
> runter, dass der ganze Kram incl. LUTs etc. und restlichem Design in's
> FPGA passt.

Das ist aber komplett ohne sportlichen Ehrgeiz.

Thorsten S. schrieb:
> 200 MHz sollten für einen Artix jetzt nicht soo problematisch sein.
> Auch wenn von draußen nur 100 MHz zur Verfügung stehen, mit der PLL aus
> dem DCM-Block machst du daraus einfach synchrone 200 MHz.

Ja, stimmt. Mache ich wenn es anders nicht geht. Es läuft gerade alles 
im FPGA schön mit den 100 MHz.
Eine weitere Möglichkeit wäre auch mehrere DSPs zu nutzen statt der 10. 
Die Bisherige Idee ist, dass am Ende die 4 FIRs getrennt laufen. Aber 
die könnte man ja auch zeitlich trennen. Vor allem wenn die alle die 
gleichen Koeffizienten verwenden. Dann hätte ich 4 mal so viele DSPs 
aber nur ein Viertel der Takte. Also 40 DSPs und 5 Takte bei 100 MHz. 
Vielleicht ist das besser, mal sehn ... werde ich alles ausprobieren 
wenn es nicht leichter geht.

: Bearbeitet durch User
von Gustl B. (-gb-)


Angehängte Dateien:

Lesenswert?

Was ist DAS denn, jetzt habe ich 5 IP BRAMs generieren lassen. Ja, 5 
weil man da leider nicht per Generic eine andere .coe Datei angeben kann 
... egal ... jedenfalls was wird daraus gemacht? Siehe Bild. Ja, richtig 
geguckt. Kein BRAM. Mal gucken ob man da was umstellen kann ... grml

Vielleicht war es falsch DUAL PORT ROM zu wählen ...

: Bearbeitet durch User
von Thorsten S. (thosch)


Lesenswert?

Da die Nutzbandbreite bei 5MHz Samplerate nur bis 500 kHz geht, wäre 
auch ein anderer Weg denkbar:

Erst mit einem Downsampler auf Halfbandfilter-Basis die Samplerate 
halbieren, dann reicht die halbe Anzahl FIR-Taps für die gleiche 
Filtercharakteristik.

Das Halfbandfilter ist mit der von mir empfohlenen Methode besonders 
effizient implementierbar, wenn ich mich jetzt nicht vertan gab, sollte 
eine dieser Filtereinheiten mit 20 Takten ein 61 Tap Halfbandfilter 
schaffen, sofern man das Sample für die Aperturmitte im Schreibslot des 
BRAMs aus dem anderen Port ausliest und die restlichen 19 Takte für die 
symmetrischen Paare nutzt.
Die Null-Koeffizienten muß man praktischerweise ja gar nicht erst 
berechnen, obwohl sie definitionsgemäß in die Filterlänge eingehen.

von Thorsten S. (thosch)


Lesenswert?

Man könnte sogar noch einmal die Samplerate halbieren, bevor man in den 
Bandpaß geht...

von Dergute W. (derguteweka)


Lesenswert?

Moin,

Die alten Probleme, das alte Dilemma. Du hast eine 19er Mutter, die 
willst du loesen. Weil du aber mit Hammer und Stemmeisen umgehen kannst, 
versuchst du jetzt rauszukriegen, was besser geht: Mit einem grossen 
Hammer und einem Stemmeisen oder 6 kleineren Haemmern und 6 Stemmeisen 
auf der armen Mutter rumpruegeln, um sie aufzumachen.
Mit Gabel- oder Ringschluesseln kennst du dich nicht aus, du bist 
gelernter Maurer...
Also nochmal: Wenn du eh' schon weisst, wie dein Impuls aussieht, dann 
nimm' ein "matched Filter" - in deinem Fall halt ein Gaussfilter. Damit 
kriegst du die bestmoeglichste Rauschunterdrueckung. Dann muss das 
garnicht so riesig sein. Wenn dich DC stoert, dann kombinier das mit 
einem DC-Remover; da gibts z.b. hier nen schoenen Artikel:
https://www.dsprelated.com/showarticle/58.php

Gruss
WK

von Gustl B. (-gb-)


Lesenswert?

Dergute W. schrieb:
> Die alten Probleme, das alte Dilemma. Du hast eine 19er Mutter, die
> willst du loesen. Weil du aber mit Hammer und Stemmeisen umgehen kannst,
> versuchst du jetzt rauszukriegen, was besser geht: Mit einem grossen
> Hammer und einem Stemmeisen oder 6 kleineren Haemmern und 6 Stemmeisen
> auf der armen Mutter rumpruegeln, um sie aufzumachen.

Ja, sehr gut. Und wo hast du das alles gelernt? Richtig, ich bin kein 
Etechniker und mache das bisher nur als Hobby. Ich lerne gerne dazu, 
werde aber jetzt nicht nochmal studieren. Also bleibt mir nur lesen und 
Fragen stellen. Gegen Fragen stellen hast du scheinbar etwas, schade, 
denn dazu gibt es so ein Forum.

Dergute W. schrieb:
> "matched Filter" - in deinem Fall halt ein Gaussfilter

Danke für den Tip, das kannte ich noch nicht. Da muss ich jetzt lesen 
gehen was das ist.

Dergute W. schrieb:
> Wenn dich DC stoert, dann kombinier das mit
> einem DC-Remover; da gibts z.b. hier nen schoenen Artikel:
> https://www.dsprelated.com/showarticle/58.php

Und nochmals vielen Dank! Das sieht recht einfach aus. Sogar fast zu 
einfach, schick.

Thorsten S. schrieb:
> Man könnte sogar noch einmal die Samplerate halbieren, bevor man in den
> Bandpaß geht...

Nun, für 500 kHz reicht ja 1 MSps, da bräuchte ich also nur jedes 5. 
Sample nehmen.

von Dergute W. (derguteweka)


Lesenswert?

Moin,

Gustl B. schrieb:
> Gegen Fragen stellen hast du scheinbar etwas, schade,
> denn dazu gibt es so ein Forum.

Neenee, da hab' ich nix dagegen. Vor 4 Jahren hatte ich auch nix dagegen 
und schrub auch schon von matched Filtern und wie man billig an ein 
Gaussfilter im FPGA kommen kann:
Beitrag "Peakfläche über leicht verrauschter Nullinie bestimmen."
Und in 4 Jahren schreib' ichs auch nochmal ;-)

Gruss
WK

von FPGA zum Spass (Gast)


Lesenswert?

Gustl B. schrieb:
> jedenfalls was wird daraus gemacht? Siehe Bild. Ja, richtig
> geguckt. Kein BRAM.

Wird wohl ignoriert weil so wenig drinne ist.
Oder du erzeugst die Adresse asynchron.

Ersteres kannst du mit dem ram_style attribute "block" ausschließen.
https://www.xilinx.com/support/documentation/sw_manuals/xilinx2017_1/ug901-vivado-synthesis.pdf

Wenn es immer noch nicht klappt, dann kuck mal das du die Leseaddresse 
aus einem getakteten FF nimmst, ohne sie weiter zu verändern.

von Gustl B. (-gb-)


Lesenswert?

Dergute W. schrieb:
> Neenee, da hab' ich nix dagegen. Vor 4 Jahren hatte ich auch nix dagegen
> und schrub auch schon von matched Filtern und wie man billig an ein
> Gaussfilter im FPGA kommen kann:
> Beitrag "Peakfläche über leicht verrauschter Nullinie bestimmen."
> Und in 4 Jahren schreib' ichs auch nochmal ;-)

Das stimmt, hatte ich damals wohl ignoriert weil ich von Filtern noch 
nichts verstand. Heute bin ich auch kaum weiter, habe aber mehr Zeit. 
Sehe ich das richtig, dass ein Gaussfilter einen Filterkernel hat der 
wie mein Gaussimpuls aussieht? Also kann ich den als normalen FIR 
schreiben nur dass die Koeffizienten eben ein Gaussimpuls sind?
Weil der zu den erwarteten Impulsen passt reichen da weniger 
"Stützstellen" (?), ich kann also mit der Samplerate runtergehen und 
dann mit weniger Koeffizienten rechnen.

FPGA zum Spass schrieb im Beitrag #5956354:
> Wird wohl ignoriert weil so wenig drinne ist.
> Oder du erzeugst die Adresse asynchron.

Ne, da hatte ich mich verguckt. Am Ende wird es doch als BRAM 
implementiert. Aber in der Synthese taucht es vorher noch nicht auf. 
Jedenfalls hat das nichts oder fast nichts gebracht. Jetzt werden zwar 
2,5 BRAMs für die Koeffizienten verwendet, aber immernoch massig LUTs 
vermutlich für die Samplewerte die durchgeschoben werden. Die müsste ich 
auch in BRAMs packen.

Edit:
@Dergute W.:
Wo lernt man das denn alles? Ich bin ja komplett fachfremd und mache das 
als Hobby. VHDL jetzt seit grob 10 Jahren, mit Signalen, also ADCs grob 
seit 5 Jahren. Mit eigenen analog und digital Schaltungen auf Platinen 
habe ich vor so 4 Jahren angefangen. Das war tatsächlich oft ein 
steiniger Weg, aber ich habe viel gelernt und kann jetzt doch schon 
einiges für ein Hobby. Filter sind für mich eines der Gebiete die ich 
noch kaum verstanden habe. Ich brauchte sie bis jetzt noch nicht und 
habe bisher nur ein paar mal damit rumgespielt. Mein Problem ist vor 
allem, dass es so viele verschiedene Dinge gibt die man lernen kann. 
Analoge Filter, Schaltregler, Layout und seine Spezialitäten, FPGA 
Eigenheiten und Bausteine, ... derzeit schreibe ich einen Controller für 
den Hypermemorybus weil ich auf meine aktuelle FPGA Bastelplatine einen 
HyperMemory draufgelötet habe. Das ist auch wieder irre kompliziert. Am 
Ende ist die Zeit einfach zu knapp.
Daher die Frage wo lernt man das möglichst kompakt?
Ich bin ja am überlegen mich irgendwo als Quereinsteiger zu bewerben um 
dann auch Dinge zu lernen die ich mir als Hobbybastler nicht leisten 
kann oder will.

: Bearbeitet durch User
von Duke Scarring (Gast)


Lesenswert?

Gustl B. schrieb:
> Wir messen hier Radioaktivität, da ist ein Detektor, dahinter ein
> Shaping Verstärker, daraus kommen gaußförmige Impulse von so 1 bis 8 us
> Länge und die gehen in einen ADC der je Impuls ein Bitmuster liefert.
Du kannst den Shaping-Verstärker modellieren und eine Rückrechnung auf 
das ursprüngliche Signal machen. In der Regel interessiert die Höhe 
(=Energie) des Signals und ggf. der Zeitpunkt (wenn die Strahlung aus 
Beschleunigern kommt oder für Korrelationsgeschichten).
WIMRE wird da auch gerne ein CUSP-Filter verwendet, weil das in diesem 
Fall irgendwie den geringsten Fehler verusacht.

Duke

von Gustl B. (-gb-)


Angehängte Dateien:

Lesenswert?

Wie der shaping Verstärker funktioniert weiß ich nicht, das ist eben ein 
Fertiggerät aber könnte ich mir mal angucken. Im Grunde kommen aus dem 
Detektor so exponentielle Impulse, also ganz kurze Stromimpulse wenn da 
ein Gamma in den Germaniumkristall reingeflogen ist. Die sind aber sehr 
kurz so im einstelligen ns Bereich wobei ich mir da nicht sicher bin.
Wir haben Photodetektoren für Alpha und Germaniumdetektoren für Gamma 
aus einem der beiden kommen sehr schnelle exponentielle Pulse raus, aus 
dem anderen eher langsame auch im us Bereich.

Da macht der shaping Verstärker eben diese mehrere us langen 
Gaussimpulse draus.

Duke Scarring schrieb:
> WIMRE wird da auch gerne ein CUSP-Filter verwendet, weil das in diesem
> Fall irgendwie den geringsten Fehler verusacht.

http://www.ijsrp.org/research-paper-0915/ijsrp-p4517.pdf

Sieht gut aus. Zu der Filterei habe ich aber auch noch eine naive Frage:
Im Digitalen ist man schön flexibel, aber gibt es da eine klare Aussage 
ob digital oder Analog besser ist? DC Block und dann die Peakhöhe kann 
man auch analog gut machen und dann langsam einmal je Impuls 
hochauflösend abtasten.

Duke Scarring schrieb:
> In der Regel interessiert die Höhe
> (=Energie) des Signals und ggf. der Zeitpunkt (wenn die Strahlung aus
> Beschleunigern kommt oder für Korrelationsgeschichten).

Man verwendet oft die Höhe, aber auch die Fläche unter dem Impuls 
entspricht der Energie. Das sind ja am Anfang Stromimpulse, eigentlich 
will man Ladungen zählen.
Ja die Zeit ist wichtig, darum habe ich mich in den letzten Jahren 
gekümmert (noch ohne eigenen ADC). Jetzt wird zu jedem Impuls die 
Energie mit der genauen Zeit gespeichert und wir können wunderschön 
filtern. Z. B. gibt es ja Isotope die zuerst in ein kurzlebiges Isotop 
zerfallen und das zerfällt dann nochmal in ein langlebiges. Da können 
wir schön die Langlebigen rausfiltern weil die ja am wahrscheinlichsten 
in einem bestimmten Zeitfenster nach einem ersten Impuls passieren. Man 
kann auch beide solche Zerfälle rausfiltern und wenn man gleichzeitig 
noch die Energien verwendet kann man noch viel mehr filtern, eine 
ziemlich schicke Sache. Wir messen hier vor allem low-level, also mit 
sehr wenigen Zerfällen, oft wenigen Zerfällen am Tag von dem gesuchten 
Isotop. Da stört also alles andere drum herum aus der "Natur". Klar 
haben wir eine dicke Bleiabschirmung aus extra sauberem Blei und 
verwenden für die Konstruktion auch nur sauberes oder altes Metall von 
vor den Atomtests, aber trotzdem bleibt ein Hintergrund. Da ist eine 
Filterung nach Isotopen sehr sinnvoll.

Edit:
Der ganz einfache DC Remover funktioniert schon mal. Ist aber nur der 
erste aus dem Link.

: Bearbeitet durch User
von Thorsten S. (thosch)


Lesenswert?

Gustl B. schrieb:
> Nun, für 500 kHz reicht ja 1 MSps, da bräuchte ich also nur jedes 5.
> Sample nehmen.

Ganz so einfach ist es dann doch nicht, denn damit würdest du das 
Abtasttheorem verletzen, falls im mit 5 Msps gelieferten Signal 
Frequenzanteile von über 500 kHz enthalten sind. (was allein durch 
Rauschen schon der Fall sein wird)

Deshalb erwähnte ich ja das Downsampling über Halfbandfilter.

von Burkhard (Gast)


Lesenswert?

Gustl B. schrieb:
> Das ganze
> niederfrequente Rauschen soll möglichst weg und alles Hochfrequente
> auch, daher der Bandpass. Da soll am Ende wieder ein gaußförmiges Signal
> rauskommen, aber ohne DC und mit weniger Rauschen, das ich einfach nur
> aufintegrieren muss in Software um schöne Werte zu bekommen.

Das klingt nach Gabor- oder Wavelet-Transformation mit Threshholding, 
d.h. nach der Analyse (STFT oder Filterbank) werden die 
"uninteressanten" Koeffizienten auf Null gesetzt und danach das Signal 
wieder synthetisiert.

Die Gabor Transformation ist davon das einfachere Verfahrne, sie basiert 
auf einer STFT (blockweise Verarbeitung), im Frequenzraum werden die 
Koeffizienten modifiziert und dann wieder rücktransformiert. Wenn Du 
vllt. 100 usec digitalisiertes Orginalsignal zur Verfügung stellts, 
könnte man mit Octave oder Matlab schauen, ob das Verfahren 
grundsätzlich geeignet ist.

* https://de.wikipedia.org/wiki/Gabor-Transformation
* http://ltfat.github.io/doc/gabor/

von Gustl B. (-gb-)


Lesenswert?

Das klingt jetzt aber deutlich komplizierter als der DC Block aus dem 
Link oben oder ein FIR.

Mein DC Block funktioniert noch nicht ganz. Dazu habe ich eine Frage:
Hier https://www.dsprelated.com/showarticle/58.php ist unten in Figure 
3a die Schaltung gezeigt. Daran ist für mich noch leicht unklar was die 
MA Blöcke sind. Ist das wirklich nur oben aus Figure 1b der gestrichelt 
gezeichnete Kasten oder die ganze Figure 1b?

von Burkhard (Gast)


Angehängte Dateien:

Lesenswert?

Gustl B. schrieb:
> Das klingt jetzt aber deutlich komplizierter als der DC Block aus dem
> Link oben oder ein FIR.

Aber der Aufgabe offensichtlich angemessener als ein simpler FIR (den 
DC-Remover gibt es umsonst dazu).

Wie die FFT eines Gauss-Impulses (hier 8 usec breit) zeigt, kommst Du 
mit "drüber und drunter" Rauschen wegfiltern nicht weit, sofern das 
Signal ein Gauss-Impuls bleiben soll. Und einen FFT-Core liefert 
entweder Dein Hersteller mit oder gibt es OpenCores & Co. Just my 2 
cent.

von Gustl B. (-gb-)


Lesenswert?

Guter Punkt. Aber um DC zu entfernen wäre ein FIR ja trotzdem noch was.

von Dergute W. (derguteweka)


Lesenswert?

Moin,

Gustl B. schrieb:
> Daher die Frage wo lernt man das möglichst kompakt?

Die entsprechenden Vorlesungen aus einem Nachrichtentechnikstudiengang 
und das ein oder andere Buch und der ein oder andere Artikel im www. 
Aber ob das noch "kompakt" ist?

Gustl B. schrieb:
> Ist das wirklich nur oben aus Figure 1b der gestrichelt
> gezeichnete Kasten

Ja.
Ich wuerd' fuer dein Zeugs auch nur die einfache "schaltung" nehmen. Das 
bisschen ripple im Pegel sollte bei dir nichts ausmachen. Hauptsach' die 
Phase ist linear.

Gruss
WK

von Gustl B. (-gb-)


Angehängte Dateien:

Lesenswert?

Dergute W. schrieb:
> Die entsprechenden Vorlesungen aus einem Nachrichtentechnikstudiengang
> und das ein oder andere Buch und der ein oder andere Artikel im www.
> Aber ob das noch "kompakt" ist?

Tja dafür braucht man viel Zeit. Derzeit geht viel Zeit drauf mit 
anderem Hardwarezeugs.

Dergute W. schrieb:
> Ja.
> Ich wuerd' fuer dein Zeugs auch nur die einfache "schaltung" nehmen. Das
> bisschen ripple im Pegel sollte bei dir nichts ausmachen. Hauptsach' die
> Phase ist linear.

Hm. Mein Code hier sollte eigentlich der Schaltung entsprechen, tut aber 
nicht ganz was ich erwarte. Auch das DC ist nicht ganz weg. Das sah bei 
dem FIR schon deutlich besser aus, da ging es laut pyfda aus dem die 
Koeffizienten stammen bis mehr als 100dB nach unten.

von Burkhard (Gast)


Lesenswert?

Dergute W. schrieb:
> fuer dein Zeugs auch nur die einfache "schaltung" nehmen

Eine ganz einfache Version gibt es übrigens hier: 
https://www.xilinx.com/support/documentation/white_papers/wp279.pdf

War mein erster DC-Remover - ganz ohne "MA"s.

von Gustl B. (-gb-)


Lesenswert?

Doch klar, das sieht zwar anders aus, ist aber eigentlich das gleiche 
Prinzip. Man bildet eine Summe aus vielen Samplewerten und sagt dann das 
ist DC. Das zieht man dann von dem Eingang ab.

: Bearbeitet durch User
von Gustl B. (-gb-)


Angehängte Dateien:

Lesenswert?

Das ist ja witzig, bei diesem CUSP weiß ich nicht wie ich mir den als 
Kernel erzeuge, also habe ich mal mit einem Trapez gespielt. Das hat mir 
dann nicht gefallen, also habe ich ein invertiertes Trapez rangehängt. 
Sah schon besser aus. Jetzt habe ich ein Dreieck, eines nach oben und 
eines nach unten und das macht schon ziemlich gut aus dem exponentiellen 
Signal etwas das für mich brauchbar aussieht. DC ist weg. Das könnte ich 
so verwenden und dann den Höchsten Wert verwenden für die 
Zerfallsenergie. Aber das ist ja jetzt nur geraten. Vermutlich wäre da 
ein bipolarer Gausspulse besser, so wie hier in dem Datenblatt 
abgebildet. 
https://www.ortec-online.com/-/media/ametekortec/brochures/671.pdf (das 
ist übrigens so ein shaping Verstärker) Leider habe ich keine Ahnung wie 
ich eine Wertetabelle von einem bipolaren Gauss erzeugen kann. Gibt es 
irgendwo eine Lister von ganz vielen Filterkerneln?

Angehängt als Bildchen sind Kernel, Eingangssignal und Ausgangssignal. 
Ich habe das als FIR in Python geschrieben, das ist da handlicher als 
VHDL.

von Dergute W. (derguteweka)


Angehängte Dateien:

Lesenswert?

Moin,

Gustl B. schrieb:
> Leider habe ich keine Ahnung wie
> ich eine Wertetabelle von einem bipolaren Gauss erzeugen kann.

Kanns sein, dass das die Ableitung einer Gausskurve sein soll?
Die koennte ungefaehr so ausschauen und man koennte sich sowas 
zusammenbasteln:
1
impz(conv(gausswin (100,4),[1,-1]))

> Gibt es
> irgendwo eine Lister von ganz vielen Filterkerneln?

Das glaube ich nicht, Tim.
Dafuer gibts sowas wie Matlab, Octave, oder irgendwelches 
Python-basiertes Zeugs zum Rechnen.

Gruss
WK

von Gustl B. (-gb-)


Lesenswert?

Habe ich mir auch durch numerische Ableitung gebaut, allerdings nicht so 
elegant. Aber ... das Ergebnis ist leider nicht so schön. Naja ...

Kann es sein, das die Xilinx Tools bei Multiplikationen mit kleinen 
ganzen Zahlen keine DSPs verwenden? Ich habe jetzt statt Koeffizienten 
von 1 bis 20 nurnoch welche von 1 bis 9 und plötzlich werden keine DSPs 
mehr benutzt.

: Bearbeitet durch User
von Burkhard (Gast)


Lesenswert?

Dergute W. schrieb:
>> Gibt es
>> irgendwo eine Lister von ganz vielen Filterkerneln?
>

> Dafuer gibts sowas wie Matlab, Octave, oder irgendwelches
> Python-basiertes Zeugs zum Rechnen.

Und dann noch Scilab, PDL, Julia uvm. Masochisten nehmen Fortran oder 
BASIC :-)

Filterkernel kann man sich selber basteln. Das Grundprinzip: 
Frequenzverhalten festlegen und dann per inverser DFT in die Zeitdomäne 
transformieren.

Ein bißchen DSP-Hintergrundwissen hilft beim Anpassen der Filterlänge 
und der Auswahl eines geeigneten Fensters. Literatur dazu gibt es auch 
online, z.B. Steven W. Smith: http://www.dspguide.com/ch14.htm 
nachfolgende Kapitel, insbesondere 16.

von Gustl B. (-gb-)


Lesenswert?

Juhu, wieder Lernstoff. Danke! Ich nutze bisher nur Python und das Tool 
Pyfdax.

von Gustl B. (-gb-)


Angehängte Dateien:

Lesenswert?

So, ich habe mal den Dreiecksfilter in pyfda getippt und siehe da, das 
sieht ziemlich brauchbar aus. Ich finde vor allem die DC Unterdrückung 
ziemlich gut. Wenn ich mir von dem Tool Filter entwerfen lasse gehen die 
da nicht so weit runter (60 dB). Die schaffen alle nur so bis -15 dB. 
Jetzt werde ich den sehr einfachen FIR mal mit echten Werten testen und 
gucken was da für Zerfallsspektren rauskommen.

: Bearbeitet durch User
von Dergute W. (derguteweka)


Lesenswert?

Moin,

Das schaut mir so aus, als ob das ein enger Verwandter dieser Familie 
sein koennte:

https://de.wikipedia.org/wiki/Cascaded-Integrator-Comb-Filter

Diese Dinger passen ganz hervorragend und mit wenig Aufwand in FPGAs

Gruss
WK

von Phil E. (aktiver_mitleser)


Lesenswert?

Gustl B. schrieb:
> Kann es sein, das die Xilinx Tools bei Multiplikationen mit kleinen
> ganzen Zahlen keine DSPs verwenden? Ich habe jetzt statt Koeffizienten
> von 1 bis 20 nurnoch welche von 1 bis 9 und plötzlich werden keine DSPs
> mehr benutzt.

So was lässt sich leicht als shift-add implementieren (x*9 = x<<3 + x), 
es ist plausibel dass das Tool dann die DSPs sparen will. Wenn du 
unbedingt einen DSP verwenden willst, kann man das meistens mit 
irgendwelchen #pragmas im Quelltext erzwingen oder halt händisch eine 
DSP-Zelle instanziieren und im HDL-Code verdrahten.

> So, ich habe mal den Dreiecksfilter in pyfda getippt und siehe da, das
sieht ziemlich brauchbar aus.
Auf welche Koeffizienten bist du da gekommen? Vielleicht lässt sich da 
ja wirklich was optimieren.

von Gustl B. (-gb-)


Lesenswert?

@ Dergute W.:
Danke!

OK, also ja dann passt das ja ohne DSPs. Ich habe jetzt ganz einfach ein 
Dreiecksignal als Filterkernel.
1
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0,-1,-2,-3,-4,-5,-6,-7,-8,-9,-10,-11,-12,-13,-14,-15,-16,-15,-14,-13,-12,-11,-10,-9,-8,-7,-6,-5,-4,-3,-2,-1

Man man sich das anguckt, dann wird also das erste positive Dreieck 
genommen und davon das zweite angezogen. Das ist also eine Berechnung 
der Änderung, neue Werte minus alte Werte nur eben hier als jeweils 
gewichtete Summe.

von Dergute W. (derguteweka)


Lesenswert?

Moin,

Wenn du dir jetzt deine Dreiecksfilterimpulsantwort scharf anguckst, 
wird dir sofort ( :-) ) auffallen, dass die durch 3 einzelne Filter in 
Kette gebildet werden kann:

f1=[1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1];
f2=f1;
f3=[1,zeros(1,31), -1]; #also: [1 0 0 ... 0 -1];
Diese 3 Einzelfilter sind bedeutend billiger im FPGA zu realisieren, als 
das komplette Ding von dir. So kann man LUTs und Gedoens eingesparen.

Gruss
WK

von Gustl B. (-gb-)


Lesenswert?

Mir fällt da erstmal nichts auf, aber ich versuche es mal zu verstehen:

Die ersten beiden Filter f1 und f2 sind ja nur gleitende Mittelwerte 
weil alle Koeffizienten den gleichen Wert haben. Das Signal geht also 
durch zwei gleitende Mittelwertfilter. Und dann mit Filter f3 wird die 
Differenz gebildet wie bei mir. Aber:
Bei meinem Dreieck sind das ja unterschiedliche Gewichtungen, also ja, 
das sind auch links und rechts zwei Mittelwerte, aber gewichtete die 
voneinander abgezogen werden.
Kannst du das erklären wieso das auch ohne die einzelnen Gewichte 
funktioniert?

von El Ef (Gast)


Lesenswert?

Die Impulsantwort des 1. Filters ist ein Rechteck. Dieses Rechteck geht 
dann auf den 2. Filter und die "Rechteckantwort" dieses Filters ist ein 
Dreieck ( oder auch 2 Rechtecke gefaltet ergibt ein Dreieck)
Dieses Dreieck geht dann auf den dritten Filter und die "Dreieckantwort" 
ergibt dann ein positives und ein negatives Dreieck  (Dreieck gefaltet 
mit der Impulsantwort des dritten Filters)

So ist ergibt durch die Reihenschaltung der drei Filter die gleiche 
Impulsantwort

von Gustl B. (-gb-)


Lesenswert?

Super! Vielen Dank!

von Dergute W. (derguteweka)


Lesenswert?

Moin,

Und schlaue Mathematiker (also ich nicht, aber ich glaub's einfach) 
koennen zeigen, dass wenn man so ein Rechteck unendlich oft faltet, 
tatsaechlich ein Gauss dabei rauskommt...

Gruss
WK

von Gustl B. (-gb-)


Angehängte Dateien:

Lesenswert?

Das habe ich mal in Python gemacht vor einiger Zeit und ja, es kamen 
Gaussförmige bei raus siehe Anhang, das waren 9 geitende 
Mittelwertfilter. Jetzt ist natürlich die Frage ob das sinnvoll ist. 
Aber ich werde das einfach mal ausprobieren.

von Gustl B. (-gb-)


Lesenswert?

@ Dergute W. (derguteweka):
Tatsache, diese 3 "Filter" brauchen deutlich weniger FPGA Rohstoffe vor 
allem weil man jeweils einen BRAM (FIFO) verwenden kann. Danke!

von Gustl B. (-gb-)



Lesenswert?

Und so sieht das jetzt aus.
Im Anhang:
Simulation, dann habe ich am ADC mal einen Sinus gesweept von 0 bis 2,5 
MHz. Da sieht man das analoge Filter. Und dann auch mal mit digitalem 
Filter. Und auch eine FFT vom Sweep mit digitalem Filter.
Und dann auch exponentielle Pulse (aus dem Generator) einmal ohne und 
mit digitalem Filter.

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.