Фильтр Калмана


Фильтр Калмана - очень полезная вещь для выравнивания сингалов, к примеру от датчиков. Вот пример

import math
import random
import matplotlib.pyplot as plt

# -----------------------------------
# среднее отклонение
varVolt = 0.85
# скорость реакции на изменение
varProcess = 0.01
Pc = 0.0
G = 0.0
P = 1.0
Xp = 0.0
Zp = 0.0
Xe = 0.0

def filter(v):
    global varVolt, varProcess, Pc, G, P, G, Xp, Zp, Xe
    Pc = P + varProcess
    G = Pc/(Pc+varVolt)
    P = (1-G)*Pc
    Xp = Xe
    Zp = Xp
    Xe = G*(v-Zp)+Xp
    return Xe
# -----------------------------------    
    
fig = plt.figure()

Q=320

RX = list(range(Q))
RY = list(range(Q))

x=0
for n in range(Q):
    delta = random.uniform(-15,15)
    RX[n] = x
    RY[n] = 60*math.sin(3.1415/180*x)+delta
    x = x+1

plt.plot(RX, RY, color='red')
#plt.scatter(RX, RY)

for n in range(Q):
    RY[n] = filter(RY[n])

plt.plot(RX, RY, color='green')

plt.grid(True)

plt.savefig(fname='pic02', fmt='png')

plt.show()