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
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.
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
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 ...
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.
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.
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?
Es soll filtern. Das ist ein Bandpass von 100 kHz bis 500 kHz. Das analoge Signal wird mit 5 MSamples/s abgetastet.
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
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
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
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
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.
Man könnte sogar noch einmal die Samplerate halbieren, bevor man in den Bandpaß geht...
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
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.
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
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.
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
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
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
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.
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/
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?
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.
Guter Punkt. Aber um DC zu entfernen wäre ein FIR ja trotzdem noch was.
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
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.
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.
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
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.
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
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
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.
Juhu, wieder Lernstoff. Danke! Ich nutze bisher nur Python und das Tool Pyfdax.
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
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
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.
@ 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.
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
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?
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
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
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.
@ Dergute W. (derguteweka): Tatsache, diese 3 "Filter" brauchen deutlich weniger FPGA Rohstoffe vor allem weil man jeweils einen BRAM (FIFO) verwenden kann. Danke!
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.