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 |
6 | |
7 | // cycle 1 |
8 | last_sample = current_sample; // keep in_1 |
9 | current_sample = get_new_sample(); // get in_0 |
10 | output_sample((last_sample * 2 + current_sample)/3); // out_2 |
:
Bearbeitet durch User
Du kannst eine FFT machen, mit Nullen auffüllen und rücktransformieren. Weiß aber nicht ob das das ergibt was du willst ...
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 ...
:
Bearbeitet durch User
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.
:
Bearbeitet durch User
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.
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: Beitrag "Re: Welche Interpolation beim Upsampling nehmen?" ;-)
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
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.