Ich habe einige Beschleunigungsmesserdaten, die ich filtern und bereinigen muss. Basierend auf den Online-Beispielen, die ich sehe, erfordert der Filter jedoch einen sogenannten "Wahrheitswert". Der Code basiert darauf:
http://scottlobdell.me/2014/08/kalman-filtering-python-reading-sensor-input/
Nun zum Wahrheitswert für meine Beschleunigungsdaten, ich habe mich gefragt, ob ich ihn generieren könnte, indem ich eine Glättungsfunktion auf meinen Datensatz anwende und diesen dann als Wahrheitswert verwende. Das Bild unten zeigt meine Beschleunigungsdaten, wobei der grüne Teil die geglätteten Daten zeigt. Es verwendet den „Blackman Tukey“ -Glättungsalgorithmus. Sie können jedoch sehen, dass es nicht gut darin ist , Hochfrequenzsignale zu verarbeiten. Trotzdem habe ich einen "groben Wahrheitswert".
Meine Frage ist, kann ich diesen geglätteten Wert als meinen Wahrheitswert in meinem Kalman-Filter verwenden?
Ich bin mir nicht sicher, was Sie sehen, aber Sie müssen die von Ihnen verlinkten Beispiele verstehen .
Keiner von ihnen verwendet den Wahrheitswert innerhalb der eigentlichen Filterung. Es ist da, damit Sie in Bezug auf die Filterausgabe etwas vergleichen können.
Hier ist das einfache Skript:
import random
# intial parameters
iteration_count = 500
actual_values = [-0.37727 + j * j * 0.00001 for j in xrange(iteration_count)]
noisy_measurement = [random.random() * 0.6 - 0.3 + actual_val for actual_val in actual_values]
process_variance = 1e-5 # process variance
estimated_measurement_variance = 0.1 ** 2 # estimate of measurement variance, change to see effect
# allocate space for arrays
posteri_estimate_for_graphing = []
# intial guesses
posteri_estimate = 0.0
posteri_error_estimate = 1.0
for iteration in range(1, iteration_count):
# time update
priori_estimate = posteri_estimate
priori_error_estimate = posteri_error_estimate + process_variance
# measurement update
blending_factor = priori_error_estimate / (priori_error_estimate + estimated_measurement_variance)
posteri_estimate = priori_estimate + blending_factor * (noisy_measurement[iteration] - priori_estimate)
posteri_error_estimate = (1 - blending_factor) * priori_error_estimate
posteri_estimate_for_graphing.append(posteri_estimate)
import pylab
pylab.figure()
pylab.plot(noisy_measurement, color='r', label='noisy measurements')
pylab.plot(posteri_estimate_for_graphing, 'b-', label='a posteri estimate')
pylab.plot(actual_values, color='g', label='truth value')
pylab.legend()
pylab.xlabel('Iteration')
pylab.ylabel('Voltage')
pylab.show()
Lassen Sie es uns aufschlüsseln:
Erstellen Sie zuerst das Eingabearray und dann die simulierte „verrauschte“ Eingabe, indem Sie jedem Element im Eingabearray zufällige Werte hinzufügen.
import random
# intial parameters
iteration_count = 500
actual_values = [-0.37727 + j * j * 0.00001 for j in xrange(iteration_count)]
noisy_measurement = [random.random() * 0.6 - 0.3 + actual_val for actual_val in actual_values]
Als nächstes werden mehrere Parameter definiert, die die Eigenschaften der Systemabweichung beschreiben. Diese müssen von Ihrer Signalquelle abgeleitet werden.
process_variance = 1e-5 # process variance
estimated_measurement_variance = 0.1 ** 2 # estimate of measurement variance, change to see effect
# allocate space for arrays
posteri_estimate_for_graphing = []
# intial guesses
posteri_estimate = 0.0
posteri_error_estimate = 1.0
Dies ist der eigentliche Filtercode:
for iteration in range(1, iteration_count):
# time update
priori_estimate = posteri_estimate
priori_error_estimate = posteri_error_estimate + process_variance
# measurement update
blending_factor = priori_error_estimate / (priori_error_estimate + estimated_measurement_variance)
posteri_estimate = priori_estimate + blending_factor * (noisy_measurement[iteration] - priori_estimate)
posteri_error_estimate = (1 - blending_factor) * priori_error_estimate
posteri_estimate_for_graphing.append(posteri_estimate)
Hinweis: wird im obigen Code nirgendwoactual_values
referenziert . Der Kalman-Filter arbeitet vollständig nur mit den Daten innerhalb des Arrays.noisy_measurement
Zeichnen Sie schließlich die verschiedenen Arrays.
import pylab
pylab.figure()
pylab.plot(noisy_measurement, color='r', label='noisy measurements')
pylab.plot(posteri_estimate_for_graphing, 'b-', label='a posteri estimate')
pylab.plot(actual_values, color='g', label='truth value')
pylab.legend()
pylab.xlabel('Iteration')
pylab.ylabel('Voltage')
pylab.show()
Im Grunde brauchen Sie den Wahrheitswert also überhaupt nicht. Sie müssen Ihre Beispiele tatsächlich lesen. Es ist nur grafisch dargestellt, damit Sie die Wirksamkeit des Kalman-Filters bestimmen können.
Kritisch ist, insbesondere zu Testzwecken, dass Sie den von einem Kalman-Filter erzeugten Fehler nicht mit Konstanten von {n} charakterisieren können , ohne den tatsächlichen Wahrheitswert zu kennen. Der Filter filtert gut, aber es gibt keine Möglichkeit festzustellen, ob die Ausgabe korrekt ist. Um den Filter richtig einzurichten, muss nur das Rauschen innerhalb des Systems gemessen werden können.
Connor Wolf
Ben Jackson