Ich möchte einen Datenstrom um 50% vergrößern, also aus jeweils 2 Daten
3 machen.
Ein Ansatz wäre, von den beiden Punkten 1 und 2 auf A, B und C zu
kommen, indem ich einfach:
1 = A, 2 = B und 3 = (A+B)/2 nehme, aber das scheint mir nicht so
prickelnd. Wie könnte ich das besser lösen?
Kommt drauf an auf was für einem System du das realisieren willst (wg.
Realisierungsaufwand).
Schau dir mal CIC-Filter an. Die führen auch eine Interpolation durch.
Markus F. schrieb:> Wie könnte ich das besser lösen?
Das kommt drauf an, was das für Daten sind, d.h. in welcher zeitliche
Beziehung die zueinander stehen (wenn überhaupt) und ob das Ergebnis
hinterher aus äquidistante Samples bestehen soll.
Vielleicht schilderst du mal das Problem und nicht deinen etwas
eigenwilligen Lösungsansatz?
Markus F. schrieb:> 1 = A, 2 = B und 3 = (A+B)/2 nehme, aber das scheint mir nicht so> prickelnd.
Das stimmt, denn dein 3. Wert wäre zwischen den beiden ersten Werten.
Du müsstest es in 2 Zyklen machen.
also in etwa so:
1
// cycle 0
2
last_sample = current_sample; // keep in_0
3
current_sample = get_new_sample(); // get in_1
4
output_sample(last_sample); // out_0
5
output_sample((last_sample + 2 * current_sample)/3); // out 1
Wenn du rein digital upsamplest, um es dann noch weiterzuverarbeiten
reicht für einfache Anspüche ein lineares Filter, wie oben, welches eine
Art verkapptes CIC-Filter darstellt. Praktisch liefert das aber Knicke
und Artefakte.
Habe sowas vor Kurzem für Video gemacht. Eine direkte 2:3 Abbildung
sieht man anhand der Ränder, die man auch infolge der Faltung mit einem
Rechteck annehmen kann.
Will man das richtig machen, braucht es wie immer ein ordentliches
Interpolationsfilter, das auf die Grenzfrequenz eingestellt wird, die in
dem Oringinal enthalten ist.
Wenn man die nicht kennt, nimmt man eben Nyquist =f/2. Wenn die
Interpolation funktionieren soll, muss man wenigstens 3 Punkte ins Spiel
bringen und eine Kurve durchlegen, je nach gewünschter Genauigkeit auch
mehr. Beim Audio muss bei hohen Abtastraten schon mal 20 Punkte und mehr
heranziehen, um von der Samplefrequenz in den Bereich der Oberwelle zu
kommen.
Markus F. schrieb:> Ich möchte einen Datenstrom um 50% vergrößern, also aus jeweils 2 Daten> 3 machen.
Das ist einfach:
Nach jedem Sample zwei Nullen einfügen, danach Tiefpass-filtern, und
dann jedes zweite Sample wegwerfen.
SIgnalverarbeiter schrieb:> Nach jedem Sample zwei Nullen einfügen, danach Tiefpass-filtern, und> dann jedes zweite Sample wegwerfen.
Das habe ich auch schon öfters gehört und mal durchgespielt:
Wenn ich da ein Filter drauflege, muss ich mit 3 malnehmen, damit
dieselbe Amplitude entsteht, komme aber nur auf sehr zackige Kurven, die
nicht wirklich eine gute Interpolation darstellen.
... kopiere ich hingegen die Werte in die Zwischenräume, so wie es bei
einem digitalen Signal ja ist, dann sieht das irgendwie besser aus - bis
auf den Sprung, der durch den Filter weggemacht wird.
Woher kommt eigentlich die lustige Idee, Nullen einzusetzen?
Die Fourier-Methode hat halt den Vorteil dass sie eine gewisse
mathematische Rigorosität besitzt (erhält die Norm, ist in einem
bestimmten Sinn die optimale Rekonstruktion des Signals); im Gegensatz
zu "irgendwo irgendwelche Nullen einfügen und dann irgenwas filtern", da
kommt halt nacher irgendwas raus was relativ unklare Fehlereigenschaften
hat ...
Was sind das denn für Daten? Was willst du denn eigentlich erreichen?
Linear interpolieren geht auch, das ist auf jeden Fall besser als das
mit den Nullen ...
Moin,
Peterle schrieb:> Woher kommt eigentlich die lustige Idee, Nullen einzusetzen?
Das waren bestimmt irgendwelche Verrueckten, die keine Ahnung haben, wie
ein Signal "irgendwie besser" aussieht.
Sven B. schrieb:> Die Fourier-Methode hat halt den Vorteil dass sie eine gewisse> mathematische Rigorosität besitzt (erhält die Norm, ist in einem> bestimmten Sinn die optimale Rekonstruktion des Signals); im Gegensatz> zu "irgendwo irgendwelche Nullen einfügen und dann irgenwas filtern", da> kommt halt nacher irgendwas raus was relativ unklare Fehlereigenschaften> hat
WTF? Relativ unklare Fehlereigenschaften? Macht ihr hier gefuehlte
Signaltheorie mit Ausdruckstanz, oder was ist das?
Gruss
WK
Dergute W. schrieb:> WTF? Relativ unklare Fehlereigenschaften? Macht ihr hier gefuehlte> Signaltheorie mit Ausdruckstanz, oder was ist das?
Wenn du Lust hast kannst du die Fehlereigenschaften gern ausrechnen, ich
hab dazu keine Lust ... wird sicher nicht ganz einfach sein ...
Sven B. schrieb:> wird sicher nicht ganz einfach sein
Das ist sicher nicht einfach.
Denn der Fehler hängt vom Eingangssignal und vom verwendeten Tiefpass
ab.
Allerdings ist der Umweg über FFT sehr rechenintensiv, ebenfalls
verlustbehaftet, und der Fehler bei dieser Methode dürfte noch
wesentlich schwieriger zu berechnen sein.
Insofern ist die Methode mit der Sample-Widerholung sicherlich nicht
grundfalsch.
Eine weitere Verbesserung könnte das Einfügen von zwei linear
angenäherten Samples sein (1/3 A + 2/3 B und 2/3 A + 1/3 B). Dann
Filtern, dann jedes 2. Sample verwerfen.
Je nach Rechenleistung kann man auch noch mehr Samples einfügen, dann
filtern, dann Samples verwerfen. Das macht das TP Filtern u.U. besser,
weil man mit die Grenzfrequenz höher ansetzen kann.
Dann kannst du auch einfach linear interpolieren zwischen den beiden
nächstgelegenen Punkten, oder? Das ist wahrscheinlich am besten mit
wenig Rechenaufwand ...
Die FFT hat eben zwei klar gute Eigenschaften: Sie ist die perfekt
korrekte Rekonstruktion des Signals wenn kein Undersampling
stattgefunden hat; und sie erhält die Fläche unter der Kurve. Das ist
schon sehr schön.
Mir scheint die Lösung von Joe F. (easylife) noch die
vom Aufwand her vernünftigste. Zumindest das, was seine Tabelle
zeigt. - Dem geschilderten Code-Ablauf kann ich leider nicht ganz
folgen.
Der Fehler dürfte eher einem erhöhten Quantisierungsrauschen
entsprechen, als störende Artefakte einzubringen.
Dergute W. schrieb:> Peterle schrieb:>> Woher kommt eigentlich die lustige Idee, Nullen einzusetzen?>> Das waren bestimmt irgendwelche Verrueckten, die keine Ahnung haben, wie> ein Signal "irgendwie besser" aussieht.
Die Idee hinter den Nullen ist, einfach dem Signal keine Energie =
Information hinzuzufügen. Diese Idee ist grundsätzlich richtig, führt
aber dazu, daß man einen sehr guten Filter braucht, um das Signal zu
rekonstruieren.
Besser ist es, dem Signal sinnvolle Informationen hinzuzufügen,
besonders, wenn es sich um ein unsymmetrisches Signal handelt, da dessen
Mittelwert = Nullwert eben nicht auf die Nulllinie liegt. Das Beste ist,
dem Signal den lokalen Mittelwert hinzuzufügen, allerdings muss man den
ja ersteinmal ausrechnen :-)
Ein guter Kompromiss zwischen dem Auffüllen mit demselben Wert und dem
Optimalwert ist eine lineare Interpolation. Die bringt "nur"
hochfrequente Knicke in das Signal, die beim Filter leichter wieder
verschwinden.
Joe F. schrieb:> Eine weitere Verbesserung könnte das Einfügen von zwei linear> angenäherten Samples sein (1/3 A + 2/3 B und 2/3 A + 1/3 B).
So in etwa, ja - wobei die im Signal enthaltene Frequenz sich über zwei
Samples besser darstellen lässt, weswegen man eine Interpolation über 3
Samples mit entsprechender Gewichtung in Erwähung ziehen sollte.
Dergute W. schrieb:> Macht ihr hier gefuehlte> Signaltheorie mit Ausdruckstanz, oder was ist das?
Hier ja. Schade nur, dass einige Unbedarfte den Mist hier für voll
nehmen werden.
Aber nun lasst das unsymmetrische Signal wieder um die Nulllinie
tanzen...
Joe F. schrieb:> Jürgen S. schrieb:>> weswegen man eine Interpolation über 3>> Samples mit entsprechender Gewichtung in Erwähung ziehen sollte.> Dies hatte ich ja bereits vorgeschlagen:
Nein, wir meinen nicht das Gleiche. Die Interpolation und Gewichtung
muss schon eingangsseitig über die Werte in der Quelldomäne erfolgen und
zwar so, daß der dabei entstehende Tiefpass zu der Abtastung in der
Zieldomäne passt. Sonst kommt es zu Moiré-Effekten.
Dergute W. schrieb:> Das waren bestimmt irgendwelche Verrueckten, die keine Ahnung haben, wie> ein Signal "irgendwie besser" aussieht.
Ich schwanke immer noch, ob das ernst gemeint war, oder nicht.
Moin,
Markus F. schrieb:> Ich schwanke immer noch, ob das ernst gemeint war, oder nicht.
Wenn du nach ueber einem Monat noch schwankst, dann sind vielleicht
deine Polstellen zu nah' am Einheitskreis bzw. der imag. Achse... ;-)
Gruss
WK