Ich habe einen Sensor, der seine Messwerte mit einem Zeitstempel und einem Wert meldet. Es werden jedoch keine Messwerte mit einer festen Rate generiert.
Ich finde es schwierig, mit den variablen Zinssätzen umzugehen. Die meisten Filter erwarten eine feste Abtastrate. Das Zeichnen von Diagrammen ist mit einer festen Abtastrate ebenfalls einfacher.
Gibt es einen Algorithmus zum Neuabtasten von einer variablen Abtastrate auf eine feste Abtastrate?
resampling
FigBug
quelle
quelle
Antworten:
Der einfachste Ansatz besteht darin, eine Art Spline-Interpolation durchzuführen, wie Jim Clay vorschlägt (linear oder auf andere Weise). Wenn Sie jedoch den Luxus einer Stapelverarbeitung haben und besonders wenn Sie einen überbestimmten Satz ungleichmäßiger Proben haben, gibt es einen "perfekten Rekonstruktions" -Algorithmus, der äußerst elegant ist. Aus numerischen Gründen ist es möglicherweise nicht in allen Fällen praktikabel, aber es lohnt sich zumindest, das Konzept zu kennen. Ich habe es zum ersten Mal in diesem Artikel gelesen .
Der Trick besteht darin, Ihren Satz von ungleichmäßigen Abtastwerten als bereits aus gleichmäßigen Abtastwerten durch Sinusinterpolation rekonstruiert zu betrachten . Nach der Notation in der Zeitung:
Beachten Sie, dass dies einen Satz linearer Gleichungen liefert, eine für jede ungleichmäßige Stichprobe , wobei die Unbekannten die gleich beabstandeten Stichproben y ( k T ) sind , wie folgt:y(t) y(kT)
Als ein Spielzeugbeispiel ist hier ein Vergleich (unter Verwendung von numpy ) zwischen der obigen Methode und der kubischen Spline-Interpolation auf einem leicht zitternden Gitter:
(Der Code zum Reproduzieren des obigen Diagramms befindet sich am Ende dieser Antwort.)
Alles, was gesagt wird, wäre für qualitativ hochwertige, robuste Methoden, beginnend mit etwas in einem der folgenden Papiere, wahrscheinlich angemessener:
-
quelle
Dies klingt nach einem Problem der asynchronen Abtastratenkonvertierung. Um von einer Abtastrate in eine andere zu konvertieren, können wir die kontinuierliche Zeitdarstellung des Signals durch Ausführen einer Sinusinterpolation berechnen und dann mit unserer neuen Abtastrate erneut abtasten. Was Sie tun, ist nicht viel anders. Sie müssen Ihr Signal neu abtasten, um festgelegte Abtastzeiten zu erhalten.
Das kontinuierliche Zeitsignal kann berechnet werden, indem jede Probe mit einer sinc-Funktion gefaltet wird. Da die sinc-Funktion auf unbestimmte Zeit fortgesetzt wird, verwenden wir etwas Praktischeres wie eine fensterförmige sinc mit einer praktischen endlichen Länge. Der schwierige Teil ist, dass, da sich Ihre Samples mit der Zeit bewegen, beim Resampling möglicherweise für jedes Sample ein Sinc mit einem anderen Phasenversatz verwendet werden muss.
Kontinuierliches Zeitsignal vom abgetasteten Signal:
Daraus können Sie das Signal neu abtasten:
Alles zusammen ergibt:
Da dies nicht kausal oder nachvollziehbar ist, kann die sinc-Funktion durch eine Funktion der endlichen Unterstützung ersetzt und die Summationsgrenzen entsprechend angepasst werden.
Sei kernel (t) eine windowed sinc oder eine ähnliche Funktion der Länge 2k, dann:
Ich hoffe, das hilft ..., aber ich habe vielleicht einen Fehler gemacht und es könnte ein bisschen matheintensiv sein. Ich würde empfehlen, die Konvertierung der Abtastrate zu untersuchen, um weitere Informationen zu erhalten. Vielleicht könnte jemand anderes hier auch eine bessere Erklärung oder Lösung geben.
quelle
Ich denke, Jacobs Antwort ist sehr praktikabel.
Eine einfachere Methode, die hinsichtlich der Einführung von Verzerrungen wahrscheinlich nicht ganz so gut ist, ist die Polynominterpolation. Ich würde entweder eine lineare Interpolation (einfach, in Bezug auf die Signalleistung nicht so gut) oder kubische Splines (immer noch nicht zu hart, bessere Signalleistung) verwenden, um jederzeit Samples aus Ihren willkürlichen Zeitsamples zu erstellen.
quelle
Die lineare Interplation mit 4 oder 6 oder 8 Nachbarn ist möglicherweise für Ihre Daten ausreichend.
Ich würde vorschlagen, mit einer Methode zu beginnen, die Sie gründlich verstehen, bevor Sie in Splines eintauchen.
Eine andere, ganz andere Methode ist die inverse Distanzgewichtung . Es ist einfach zu implementieren (siehe idw-interpolation-with-python unter SO), funktioniert auch in 2D-3D und höher, ist aber theoretisch schwer zu analysieren.
(Offensichtlich kann KEINE einzelne Interpolationsmethode möglicherweise zu den Millionen Kombinationen von
[Signal, Rauschen, Fehlermetrik, Testfunktion] passen , die in der Realität auftreten.
Es gibt weltweit mehr Methoden mit mehr Knöpfen als Testfunktionen.
Dennoch eine Galerie von Methoden und Testfunktionen können hilfreich sein.)
quelle
Wenn Sie mit matlab arbeiten, können Sie dies mit timeseries tun.
quelle
Bevor Sie sich mit exotischer Verarbeitung befassen, können Sie etwas Einfaches wie dieses ausprobieren (Pseudocode - keine Interpolation, aber das könnte hinzugefügt werden).
quelle
Die Antwort von Datageist ist richtig, die von Jacob nicht. Eine einfache Möglichkeit, dies zu überprüfen, besteht darin, dass der vom Datageisten vorgeschlagene Algorithmus garantiert durch die ursprünglichen Abtastwerte interpoliert (wobei eine unendliche numerische Genauigkeit vorausgesetzt wird), während dies bei Jacobs Antwort nicht der Fall ist.
quelle