Beim upsampling von einer Abtastfrequenz zu z.B. der 4 fachen gibt es
die Möglichkeit, die neuen samples dadurch zu gewinnen, dass man die
alten stehen lässt, oder auch mit Nullen auffüllt und filtert.
MATLAB bietet dazu beide Möglichkeiten in den einschlägigen toolboxen.
Die Frage lautet nun: Wann nimmt man das eine und wann das andere?
Ich nehme bevorzugt ersteres (altes Sample stehen lassen), wg. genannter
Pegeländerung, und weil der hochfrequente Anteil durch die hinzugefügten
Samples im Pegel geringer ausfällt als bei 0-Samples.
Demzufolge ist das zu erwartende Ergebnis nach einem Filter mit
begrenzter Steilheit besser.
Moin,
Beide Methoden unterscheiden sich z.B. im Spektrum des neuen Signals.
Wenn du die Nullen einfuegst, entstehen gleichhohe Aliasspektren. Diese
Spektren sehen anders aus, wenn du die Originalsampels wiederholst.
Dieses Wiederholen ist nix anderes als die Null-einfueg-Methode mit
nachgeschaltetem FIR Filter mit z.B. diesen Koeffizienten (fuer dein
Beispiel mit ver4fachung): [1 1 1 1].
Diesen Filterfrequenzgang siehst du dann in deinem Ausgangssignal.
Gruss
WK
Dergute W. schrieb:> Diese> Spektren sehen anders aus, wenn du die Originalsampels wiederholst.> Dieses Wiederholen ist nix anderes als die Null-einfueg-Methode mit> nachgeschaltetem FIR Filter mit z.B. diesen Koeffizienten (fuer dein> Beispiel mit ver4fachung): [1 1 1 1].> Diesen Filterfrequenzgang siehst du dann in deinem Ausgangssignal.
Oh wow. Wieder was gelernt.
Werde wohl in Zukunft doch lieber die Nullen einfügen.
Moin,
Joe F. schrieb:> Werde wohl in Zukunft doch lieber die Nullen einfügen.
Naja, jenachdem was du eigentlich haben willst. Oft will man nach dem
Upsampeln nur das Originalsignal haben, dann muss man die 3 halben
Aliasspektren mitm Tiefpass niederringen - da kann so ein [1 1 1 1]
Filter, wenn's nix kostet, ja schonmal ein Anfang sein. Macht halt am
oberen Ende deines Nutzsignals schon mehr als 3dB Daempfung und die
Sperrdaempfung ist mit min. -11 dB nun auch nicht geeignet, um in Extase
zu geraten.
Also wird man wohl noch irgendein anderes Tiefpassfilter brauchen, um
die Aliasspektren aus dem upgesampleten Signal rauszukriegen und die >3
dB Durchlassdaempfung muss man auch im Auge behalten.
Solltest du aus irgendeinem Grund aber z.B. das oberste Aliasspektrum
nach dem Upsamplen haben wollen, dann wuerde sich so ein Filter anbieten
[1 -1 1 -1] oder jeder andere, bessere Hoch- oder ggf. auch Bandpass.
Gruss
WK
Das Auffüllen mit Nullen ist mathematisch das Richtige, da keine
falschen Informationen hinzugefügt werden und das anschließende Filtern
dann eine perfekte Interpolation ergibt. Allerdings ist es so, dass das
nur bei guten Filtern auch der Fall ist. Reale Filter, besonders die
billigen und kurzen kriegen da Probleme, insbesondere bei
unsymmetrischen Datenströmen, bei denen die Null zwar eine
Nullinformation ist, aber bei unvollständiger Filterung einen
wesentlichen Signalbeitrag liefert, da der Datenstrom ein offset hat und
die signaltechnische 0 den auch haben müsste. (dann ist der Fehler
minimal). Bei Daten mit geringer Amplitude und hohem Offset ist das
besonders eklatant.
Da ist es in der Tat besser, man kopiert die Daten weiter, was einer Art
von Vorfilterung entspricht. Für lineare Daten ist es z.B. eine perfekte
Interpolation mit einem überlagerten Sägezahn mit der Grundfrequenz der
Abtastfrequenz. Dessen Spektrum bekommt man schon durch eine einfache
Summierung der Werte gut herunter.
Hier ist ein Beispiel von meiner HP eines Sinus mit Darstellung des
Fehlers in 20facher Verstärkung.
Im Bild inks mit jeweils 8 Werten bei 8-fach Überabtastung. Selbst bei
doppelter Zahl der TAPs kriegt man bei der Version mit den Nullen erst
einmal nur Rechtecke (bzw Geraden, wenn man die TAPs ausdehen würde). Es
braucht also einen besseren Filter.
Für die Billig-Interpolationen mit wenigen TAPs bietet sich auch eine
direkte lineare Interpolation und anschließende Filterung zum "Abrunden"
der Ecken an. Da ist der Aufwand in Summe am Kleinsten. Im dritten Bild
werden z.B. nur 4 TAPs verwendet. Der Interpolator benötigt zwei
Speicher:
Bei einem 4-Fach-Interpolator wie hier akkumuliert man dazu einfach die
Differenz der beiden letzten Samples der langsamen Domain, bekommt einen
dreiecksartigen Anstieg gemäß der Steigung (ohne zu Dividieren) und
filtert mit einem einfachen Summen über die letzten 8 Werte der neuen
Domain. Diesen Wert teilt man durch 4 und durch 8 und bekommt einen
geglätteten Wert. Die Mimik entspricht einem Hogenauer mit einer Stufe.
Den 8er Filter kann man durch einen echten FIR ersetzen, wenn es besser
sein soll, oder durch einen 6dB-IIR erster Ordnung, wenn es kleiner sein
muss und noch einfacher sein darf. Ohne die linearisierende Vorstufe
braucht es mindestens einen 24TAP-FIR oder auch 32.
Bei nur einem Faktor 4 kann man mit der Methode aber nicht viel sparen.
Im Gegenteil: Ein mittelmäßig langer FIR wird das besser tun, braucht
weniger resourcen und hat die Interpolation quasi mit drin. Die
Betrachtung wird dann interessant, wenn es an höhere
Interpolationsstufen geht und es auf gewaltige TAPs hinauslaufen würde.
Da werden bekanntlich mehrstufige Integrationsfilter eingesetzt, aka
"CIC" und mit kurzen FIRs glattgebügelt. Der CIC übernimmt dann die
Rolle der Vorinterpolation und füllt "richtig" auf. Wenn die Architektur
richtig aufgezogen ist, bringt sie im Mittel bessere Werte. Siehe auch
das Argument mit den Spektren.
Man könnte es so zusammenfassen, dass ein händisches Auffüllen immer
dann besser ist, wenn der Filter dahinter kein besonders guter ist.
Dergute W. schrieb:> Dieses Wiederholen ist nix anderes als die Null-einfueg-Methode mit> nachgeschaltetem FIR Filter mit z.B. diesen Koeffizienten (fuer dein> Beispiel mit ver4fachung): [1 1 1 1].> Diesen Filterfrequenzgang siehst du dann in deinem Ausgangssignal.
Ist das nun von Nachteil? und warum?
Bin nochmals in MATLAB eingestiegen und habe was probiert. Mir scheint
es doch wirklich besser zu sein, die Daten einfach weiterlaufen zu
lassen. Das wäre doch schon ein einfacher Filter. Möglich, daß es meinem
Filter liegt.
Jürgen S. schrieb:> Bei einem 4-Fach-Interpolator wie hier akkumuliert man dazu einfach die> Differenz der beiden letzten Samples der langsamen Domain, bekommt einen> dreiecksartigen Anstieg gemäß der Steigung
Das habe ich versucht, kriege aber nichts raus, was nach Interpolation
aussieht. Wie ist das gemeint, bitte?
Moin,
Signalverarbeiter schrieb:> Ist das nun von Nachteil? und warum?
Naja, wenn dir dieser Filterfrequenzgang taugt, dann wohl nicht.
Mir geht's eher drum, darzustellen, dass es nicht "2 Arten von
Upsampling" gibt, die irgendwie magisch unterschiedlich sind. Sondern
eben 2x genau das selbe sind, naemlich Einfuegen von 0 samples und bei
der einen Art (widerholung der Samplewerte) entsteht dabei eben
automatisch ein nachgeschalteter, "parasitaerer" Tiefpass. Wenn das
genau das Ding ist, was man haben will, warum nicht. Man kann in der
Richtung noch weitermachen und kommt dann bei CIC-Filtern und ihren Vor-
und Nachteilen raus.
https://en.wikipedia.org/wiki/Cascaded_integrator%E2%80%93comb_filter
Das ist eine Art Filter, die sich je nach Hardware manchmal recht
einfach einbauen lassen. In der simpelsten Form ist nur ein Kammfilter
und ein Integrator "kaskadiert", dann waere eben die Impulsantwort
sowas: [1 1 1 1] (also Widerholung der Samples).
Kaskadiert man 2 Kaemme und 2 Integratoren, dann gibt das eine linerare
Interpolation (die Impulsantwort waere dann z.b. [1 2 3 4 3 2 1].
Bei 3 Kaemmen und 3 Integratoren hintereinander gibt's ne quadratische
Interpolation [ 1 3 6 10 12 12 10 6 3 1]
usw.
Aber eigentlich ist's voellig wurst, was fuer ein Tief/Band/Hochpass
nach dem Einfuegen der Samples kommt, er muss halt nur das machen, was
du grad brauchst. Also ueblicherweise das "richtige" Spektrum genuegend
gut durchlassen und die "falschen" Spektren genuegend gut daempfen.
Gruss
WK
Dergute W. schrieb:> Also ueblicherweise das "richtige" Spektrum genuegend> gut durchlassen und die "falschen" Spektren genuegend gut daempfen.
Tja, gut gesagt. Das ist naheliegend. Nur was sind jeweils richtige und
falsche Spektren?
Signalverarbeiter schrieb:> Tja, gut gesagt. Das ist naheliegend. Nur was sind jeweils richtige und> falsche Spektren?
Ähm, wenn du das nicht weißt, füll einfach auf ?. Sieht schöner aus.
Irgendwas an deinem Signal muss dich doch interessieren, oder?
Moin,
Signalverarbeiter schrieb:> Nur was sind jeweils richtige und> falsche Spektren?
So eine Interpolation macht man ja nicht aus Jux und Dollerei, von daher
wird man dann schon wissen, in welchem Frequenzbereich man die
Ergebnisse haben will. OK, wenn mans so garnicht weiss, dann wird man
wohl mit einem Tiefpass am besten fahren.
Bei einer 4fach Interpolation sollte das dann also ein Tiefpass sein,
der alle Originalfrequenzen des uninterpolierten Signals durchlaesst,
alle anderen sperrt.
Wenn du z.B. ein Telefonsignal, mit 8kHz abgetastet, auf Samplingrate
32kHz bringen willst, brauchst du nach dem Einfuegen von jeweils 3
Nullen nach jedem Sample ins Signal also einen Tiefpass in der 32kHz
Domaene, der von 0..4kHz durchlaesst (ggf. sogar um den Faktor 4
verstaerkt) und ab 4kHz sperrt.
Naja, und da ist so ein [1 1 1 1] Filter halt eine grobe Annaehrung an
dieses Verhalten. Und wenn man's eben durch Samplewiderholung umsonst
und gratis kriegt...warum nicht.
Aber es macht dir z.B. ueber 3dB Daempfung bei 3.99kHz. Und im Bereich
um 12kHz macht es nur -11.3 dB Sperrdaempfung. Ist natuerlich besser als
nix, aber sicher nicht der Weisheit letzter Schluss.
Gruss
WK
Ich würde sagen, dass man praktisch immer einen Tiefpass braucht und
zwar einen im Bereich der vorherigen Bandbreite.
Beim Upsampeln wäre ein "falsches Spektrum" in jedem Fall das Auftreten
von neuen Frequenzen oberhalb der Nyquistfrequenz der vorherigen
niedrigeren Abtastrate und das ist mit dem händischen Interpolieren ja
der Fall!
Beim Befüllen mit alten Werten wird ein Rechteck erzeugt, beim einfachen
linearen Filter ein Sägezahn. Deren Oberwellengehalt ist nach Fourier
evident und beim Rechteck größer. Der genaue Fehler hängt vom
Originalsignal ab, das mal abgetastet wurde. Das ist ja in keinster
Weise bekannt. In den wenigen Fällen, in denen man das kennt, kann man
den Filter darauf abstellen, also die Eckfrequenz weiter herabsetzen.
Dabei muss man ein wenig mitdenken:
Beim Audio mit 48kHz -> 192kHz wird man einen 16kHz-Filter nehmen, in
der Annahme, dass man nicht nur die typischen 20% head room hat, sondern
über 16kHz nichts gehört wird. Bei 96kHz auf 192kHz wird man einen 24kHz
Filter einsetzen, weil sich der bei 96k leicht bauen lässt und nicht
mehr abschneidet, als im Original wahrscheinlich drin ist. Es gibt hier
Spezialisten, die auch dann mit 18kHz killen und andere, die einen HBF
bei 96kHz einsetzen :-)
Umgekehrt, kann man Filter auch präzisieren und betonen, um sie steiler
zu machen oder gar diskrete Filterinterpolationen verwenden. In wenigen
Fällen wird man neue Frequenzen tolerieren, um z.B. Signale mit
Rechtecken interpolieren. Rechteckgeneratoren in Musiksynthesizer z.B.
kann man so absampeln und interpolieren ohne Fehler zu machen.
In den meisten Fällen wird man sich auf das Spektrum unterhalb N/2
beziehen und den üblichen Kompromiss zwischen Passband-Durchlass und
Stoppbanddämpfung suchen.
Wie gesagt, ist es so, dass wenn man einen dafür optimierten Filter
hintendran hat, der das gut kann, ist eine Vorinterpolation nicht nötig.
Die kann sogar ein Problem darstellen, besonders wenn nicht ganzzahlig
überabgetastet wird, sondern so etwas wie 2:3 oder 4:5 weil sich dann
alte und neu Frequenz falten und das niederfrequente Mischprodukt den
Sprung des Samples alt/neu allein abbildet. (ist jetzt bildlich im
Zeitbereich schwer zu beschreiben, aber es führt dazu, dass auch
Frequenzen weit unterhalb von N/2 entstehen, die durch das Filter nicht
behandelt werden können.
In den ganzzahligen Fällen ist es unproblematischer, weil die tiefste
auftretende Frequenzkomponente des Störspektrums eben auf der alten
Samplefrequenz liegt und dafür der Filter passt.
Welchen Filter man da einsetzt, hängt auch von der Technologie ab: Im
FPGA wird man bei Streamingdaten mit einem simplen Geradeaus-Design noch
eher füllen, als bei einem parallelen Design oder gar einem
Mikroprozessor, wo die Berechnung mit Nullen einiges an Rechnung
einsparen kann.