¿Usar un filtro de Kalman requiere un valor de verdad?

1

Tengo algunos datos de acelerómetro que necesito filtrar y limpiar. Sin embargo, según los ejemplos en línea que veo, el filtro requiere lo que se denomina un "valor de verdad". El código se basa en esto:

enlace

Ahora,paraelvalordeverdaddemisdatosdeaceleración,mepreguntabasipodríagenerarloaplicandounafuncióndesuavizadoamiconjuntodedatos,yluegolausocomovalordeverdad.Laimagendeabajomuestramisdatosdeaceleración,conlaparteverdequemuestralosdatossuavizados.Estáutilizandoelalgoritmodesuavizado"Blackman Tukey" . Sin embargo, puede ver que no es bueno al procesar señales de alta frecuencia. Sin embargo, tengo un valor de "verdad aproximada".

Mi pregunta es, ¿puedo usar este valor suavizado como mi valor de verdad en mi filtro de kalman?

    
pregunta Raaj

1 respuesta

10

No estoy seguro de lo que estás viendo, pero debes entender los ejemplos que vinculas.

Ninguno de ellos usa el valor de verdad dentro del filtro real. Está ahí para que tenga algo con qué comparar en relación con la salida del filtro.

Aquí está el script simple:

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()

Vamos a descomponerlo:

Primero, cree la matriz de entrada y luego cree la entrada "ruidosa" simulada agregando valores aleatorios a cada elemento de la matriz de entrada.

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]

A continuación, se definen varios parámetros que describen las características de la varianza del sistema. Estos deberán derivarse de su fuente de señal.

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

Este es el código de filtrado real:

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)

Nota: actual_values no está referenciado en ninguna parte en el código anterior. El filtro de Kalman opera por completo solo en los datos dentro de la matriz noisy_measurement .

Finalmente, traza los diversos arreglos.

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()

Básicamente, no necesitas el valor de verdad en absoluto. Necesitas leer tus ejemplos. Está graficado solo para que pueda determinar la eficacia del filtro de Kalman.

Críticamente, particularmente para propósitos de prueba, no puede caracterizar el error producido por un filtro de Kalman con contantes de {n} sin conocer el valor de verdad real. El filtro se filtrará bien, pero no hay manera de determinar si la salida es precisa. La configuración adecuada del filtro requiere poder medir solo el ruido dentro del sistema.

    
respondido por el Connor Wolf

Lea otras preguntas en las etiquetas