Hallo,
ich hab vor einen Resampler mit rationalem Faktor zu Implementieren.
Dies kann man ja als folgende Struktur realisieren:
Interpolator - Tiefpass - Dezimator
Ich benötige das Ganze so, dass der Interpolationsfaktor (bei mir 4)
konstant ist und die Dezimationsrate von 10 - 50 variieren kann.
Ablaufen soll das ganze auf einem FPGA mit einem Systemtakt von 100 MHz.
Vor dem Interpolator hab ich eine Abtastfrequenz von 12,5 MHz und nach
dem Interpolator folglich 50 MHz.
Wie implementier ich das nun am Besten?
Meine Idee wär den Tiefpass einfach als IIR-Filter zu realisieren und
die Filterkoeffizienten aus einem ROM nach Bedarf nachladen zu lassen.
Ich brauch das Ganze insgesamt 16 mal.
Gibt ja auch Implementierungen mit Polyphasen FIR-Filtern, aber hilft
mir das in diesem Fall weiter? CIC-Filter sind leider zu schmalbandig
und verzerren mein Signal zu stark.
Schonmal Danke für Tipps und Ratschläge!
Moin,
Haste bei deinem IIR Filter Phasengang und Rechengenauigkeit/Overflow im
Griff? Wieso sollen CIC Filter schmalbandig sein? Woher soll hier einer
wissen, ob du Polyphasenfilter brauchen kannst? Wieso
Interpolationsfaktor 4 (und nicht 8) - wieso ueberhaupt Interpolation
und nicht gleich Tiefpass? Wie sieht denn das bei einer Dezimationsrate
von zB. 49 aus - Mit 12.5MHz rein, dann rauf auf 50Mhz, und dann? Mit
1.0204081632MHz raus? Oder 48 Clocks disabled eine Clock enabled?
Wieviel Aliasspektrum darf in das Signal; wie sieht die spektrale
Verteilung deines Nutzsignals aus?
Fragen ueber Fragen...
Gruss
WK
Dergute W. schrieb:> Moin,>> Haste bei deinem IIR Filter Phasengang und Rechengenauigkeit/Overflow im> Griff?
Ich werd den mit Maximally Flat dimensionieren.
Ist dann denk ich ein guter Kompomiss.
Mit im Griff haben muss ich mal schaun ;)
Die Filter-Koeffizienten werden vorher skaliert, um Overflow
unwahrscheinlicher werden zu lassen.
Ich weiß das da FIR leichter zu handeln, aber schaltungstechnisch mit
nem größeren Aufwand sind.
> Wieso sollen CIC Filter schmalbandig sein? Woher soll hier einer> wissen, ob du Polyphasenfilter brauchen kannst?
Ja gut, schmalbandig ist relativ. Habs mal simuliert, und da ist mein
Signal am Ausgang zu rund (wegen Rechteck, s.u.).
Naja, in jedem Lehrbuch wird über das mit Polyphasenfiltern berichtet ;)
> Wieso> Interpolationsfaktor 4 (und nicht 8) - wieso ueberhaupt Interpolation> und nicht gleich Tiefpass?
Ich muss so genau runterteilen können. Da reicht leider keine
ganzzahlige Teilung von 12,5 MHz mehr aus.
> Wie sieht denn das bei einer Dezimationsrate> von zB. 49 aus - Mit 12.5MHz rein, dann rauf auf 50Mhz, und dann? Mit> 1.0204081632MHz raus? Oder 48 Clocks disabled eine Clock enabled?> Wieviel Aliasspektrum darf in das Signal; wie sieht die spektrale> Verteilung deines Nutzsignals aus?
Nutzsignal ist ein Rechteck (+Rauschen), bzw. Datenstrom.
Genau, dann sollen die 1.0204081632 MHz rauskommen.
Also der IIR-Filter rechnet mit 50 MHz. Es wird dann nur jedes 49.
Sample des Filter-Ausgangssignals weiterverwendet. Passt das so?? Oder
hab ich nen Denkfehler?
> Fragen ueber Fragen...>> Gruss> WK
Moin,
Prinzipiell koennte das schon so funktionieren, wie ich denke, dass du
das vorhast:
Zwischen die Eingangssamples je 3x Null reinbauen; dann durch's
entsprechend eingestellte Filter, dann nur jedes 10..50 Sample draus
verwursten.
"Unschoen" ist halt, dass das Filter "so schnell" laeuft, obwohl man am
Ausgang nur viel weniger Daten braucht. Ist aber halt so beim IIR.
Ich kenn' mich da nicht so besonders aus, vielleicht gibts da Tricks,
aber ich kenn' sie nicht - und so seh' ich bei Polyphasenfiltern nicht
so recht, wie man das gut an die variable Dezimationsrate anpassen kann.
Fuer eine einzelne, feste Rate waeren die wahrscheinlich schon das
Dingens der Wahl, auch weil man dann mit dem noetigen Takt so weit
runterkaeme, dass man wahrscheinlich gleich deine 16 oder vielleicht 8
deiner Filter mit einer Hardware erschlagen koennte.
Aber das Kernproblem beim IIR seh' ich in der Flankensteilheit, und eben
dem numerischen Schweinskram. Insbesondere, wenn die Pole in die Naehe
vom Einheitskreis kommen, sieht die Welt "in echt" doch immer anders aus
als bei Matlab/Octave.
Die Frage ist halt auch, welche Flankensteilheit/Sperrdaempfung du
brauchst. Bei 1:50 Dezimation brauchst du dann eine Grenzfrequenz von
500kHz oder 0.01 Fabtast. Und da sollte jenseits der 500kHz nicht mehr
viel durchkommen, denn das faltets dir durch die Dezimation gnadenlos
runter in dein Nutzsignal. Und diesseits der 500kHz sollte nicht viel
von deinem Nutzsignal weggedaemft werden...
Probier mal, ob du so ein Filter mit der von dir gewuenschten Steilheit
hinbringst. Das wird der Dreh- und Angelpunkt.
Gruss
WK
Das mit den Nullen reinhauen ist mir suspekt. Wie soll das
funktionieren? Ich weiss aus der Signaltheorie, dass es richtig ist,
aber praktisch erhalte ich völlig unterschiedliche Ergebnisse, wenn ich
interpoliere und nicht interpolieren oder die Werte kopiere oder eben
Nullen einfüge.
Der Trick dabei ist der nachgeschaltete Tiefpass.
Der "glättet" sozusagen die Kurve und füllt die Stellen mit den Nullen
auf.
Oder anders: Der Tiefpass transferiert Signalenergie auf die Stellen,
die Null sind. Daher ist auch nach der Interpolation nach Systemtheorie
das Signal um 1/I abgeschwächt, falls I der Interpolationsfaktor ist.
Und im Frequenzbereich: Durchs Nullen einfügen verändert sich das
Spektrum nicht. Der Tiefpass filtert die sog. Spiegelspektren weg, damit
das Spektrum so aussieht wie bei einer höheren Abtastrate (Spektren
weiter auseinander).
Rolf S. schrieb:> Das mit den Nullen reinhauen ist mir suspekt. Wie soll das> funktionieren? Ich weiss aus der Signaltheorie, dass es richtig ist,> aber praktisch erhalte ich völlig unterschiedliche Ergebnisse, wenn ich> interpoliere und nicht interpolieren oder die Werte kopiere oder eben> Nullen einfüge.
Das ist wie mit vielen Bereichen der digitalen Signalverarbeitung. In
der digitalen Welt ist ein Mechanismus nicht zwangsweise auf die analoge
Welt übertragbar und auch die Ergebnisse sind es nicht. Gerade beim
Sampeln gibt es da etliche Missverständnisse. Während die einen immer
noch die Treppen in der digitalen Welt sehen und lieber Analog machen,
kommen die Digitalos mit Nyquist und behaupten, man könne ein Signal mit
Faktor 2 Samplefrequenz komplett rekonstruieren, obwohl jeder Musiker,
der Tonaufnahmen macht und ein Gehör hat, die Gegenbeweise auf der
Platte hat.
Markus H. schrieb:> Der Trick dabei ist der nachgeschaltete Tiefpass.> Der "glättet" sozusagen die Kurve und füllt die Stellen mit den Nullen> auf.
Soweit die Theorie, die ich so nicht unkommentiert stehen lassen kann:
Durch das Hinzufügen von Nullinformation wird der Resampler in der Tat
nicht mit falschen Informationen versorgt und ein idealer Interpolator
kann das auch verarbeiten. Insofern ist das richtig.
Allerdings gibt es keinen idealen Interpolator und schon gar nicht bei
nichtganzzahligen Übersetzungsverhältnissen. Der müsste meistens
unendlich lang sein, was er nie ist und eine unendlich dichte Tapzahl
haben, damit er perfekt abgebildet wird, was es auch nicht gibt. Im
Gegenteil bei BV und AV sind es oft kurze und damit sehr unvollständige
Schaltungen, die interpolieren oder rekonstruieren und die nach
Optimierung schreien.
Und selbst bei ganzzahligen Verhältnissen ist es nicht Dasselbe, ob man
eine einfache Abtastrate mit n Informationen oder eine k-fache
Abtastrate mit n*k Informationen vorliegen hat, da das Ganze irgendwann
mal wieder ins Analoge soll und da entstehen nämlich die Probleme, die
sich in ungewollten Phasenverschiebungen, Schwebungen und Oberwellen
darstellen. Und ja, die kann man sehen, messen und eben hören mit Bezug
zu meinem Vorposting.
Daher gibt es Überabtastung, Zwischeninterpolation, Dithering und
Noiseshaping, um durch geschicktes Hinzufügen von falschen! Information
zu effektiv besseren Ergebnissen zu kommen.
Aktuellen Themen dazu haben wir ja, siehe:
Beitrag "DDFS 30 MHz mit 100 MHz FPGA clock"Beitrag "Signalrekonstruktion"
Das Hinzufügen von Nullinformation ist beim Audio und auch generell
zudem nicht einfach dadurch getan, dass man wörtlich Nullen auffüllt.
Dies gilt streng genommen nur bei symmetrischen Datenströmen. Bei
Signalen mit einem Offset, z.B. Audio zwischen 0 und 65565 mit 32768 als
Nulllage wären echte Nullen für den Interpolator fatal. Damit ergibt
sich das Problem, dass man bei unsymmetrischen Daten die Nulllage wissen
muss, um "keine Information" hinzuzufügen. Und wo liegt die bitte?
Im konkreten Beispiel wäre ein 1:4 FIR-Filter, besser ein 2:8 Filter mit
Überlappung zu empfehlen, je nach Kompromiss zwischen Trägheit,
Auflösung und Präzision - bzw auch Kosten. Dessen Tiefpassverhalten muss
auf die zu erwartende höchste Frequenz angepasst werden. Da entsteht der
nächste Kompromiss: Exakt Nyquist liefert zu viele Oberwellen und der
berühmte Faktor 10 an Bandbreitenoverhead bei Messungen wird zu träge
sein. Schätzen wir also mal 40% (?). In der Bildverarbeitung ist das ein
guter Wert. Beim Audio sind 20% besser. Wären 10kHz Grenzfrequenz bei
einem schwachen Filterverhalten mit nur 8 Taps bei dem auch 30kHz noch
relevant durchkommen.
Wenn es besser sein soll: Eine 3:12 Interpolation über 3 primäre Daten,
gfs mit einem CIC und dann ein FIR hinterher. Damit hätte man auch genug
"Stützstellen" für eine asymmetrische Frequenzübersetzung mit einer
X4-Gleichung. Habe das mal für Audio gemacht. Ging sogar über
Taktdomänen hinweg.
Den Unterschied zwischen einem manuell interpolierten und dann schwach
gefilterten Signal mit 16.0 Hz Grenzfrequenz (wegen 48/3 und der dadurch
einfachen Koeffizienten) und auf der anderen Seite einer klassischen
Interpolation mit Nullen oder dem Gleichrichtmittelwert habe ich heute
noch in den Ohren.