前言

学习粒子滤波,主要是为了大创的IVR,系统的学习了一遍之后,发现大创也就如此,之前的一些疑惑都统统扫除,感觉自己也能对别人的论文挥斥方遒一样(bushi)

视频链接

# 贝叶斯公式

离散:

P(X=xY=y)=P(Y=yX=x)P(X=x)P(Y=y)P(X=x|Y=y) = \frac{P(Y=y|X=x)P(X=x)}{P(Y=y)}

连续:

P(X<xY=y)=P(Y=yX<x)P(X<x)P(Y=y)P(X<x|Y=y) = \frac{P(Y=y|X<x)P(X<x)}{P(Y=y)}

定理:

fX(x)N(u1,σ12)fYX(yx)N(u2,σ22)fXY(xy)N(σ12σ12+σ22u2+σ22σ12+σ22u1,σ12σ22σ12+σ22)f_{X}(x) \sim N(u_1,\sigma_1 ^2),f_{Y|X}(y|x) \sim N(u_2,\sigma_2 ^2)\\ f_{X|Y}(x|y) \sim N(\frac{\sigma_1 ^2}{\sigma_1 ^2 + \sigma_2 ^2}u_2 + \frac{\sigma_2 ^2}{\sigma_1 ^2 + \sigma_2 ^2}u_1 ,\frac{\sigma_1 ^2 \sigma_2 ^2}{\sigma_1 ^2 + \sigma_2 ^2})

分析:

σ12σ22,fXY(xy)N(σ12σ12+σ22u2+σ22σ12+σ22u1,σ12σ22σ12+σ22)N(u2,σ22)(倾向观测值)σ12σ22,fXY(xy)N(σ12σ12+σ22u2+σ22σ12+σ22u1,σ12σ22σ12+σ22)N(u1,σ21)(倾向预测值)\begin{align*} 若\sigma_1 ^2 \gg \sigma_2 ^2,f_{X|Y}(x|y) \sim N(\frac{\sigma_1 ^2}{\sigma_1 ^2 + \sigma_2 ^2}u_2 + \frac{\sigma_2 ^2}{\sigma_1 ^2 + \sigma_2 ^2}u_1 ,\frac{\sigma_1 ^2 \sigma_2 ^2}{\sigma_1 ^2 + \sigma_2 ^2})\approx N(u_2,\sigma_2 ^2) \qquad (倾向观测值)\\ 若\sigma_1 ^2 \ll \sigma_2 ^2,f_{X|Y}(x|y) \sim N(\frac{\sigma_1 ^2}{\sigma_1 ^2 + \sigma_2 ^2}u_2 + \frac{\sigma_2 ^2}{\sigma_1 ^2 + \sigma_2 ^2}u_1 ,\frac{\sigma_1 ^2 \sigma_2 ^2}{\sigma_1 ^2 + \sigma_2 ^2})\approx N(u_1,\sigma_2 ^1) \qquad (倾向预测值) \end{align*}

狄拉克函数

δ(x)={0,x0,x=0满足+δ(x)dx=1\begin{equation} \delta (x)=\left\{ \begin{aligned} 0 \qquad,& x \neq 0 \\ \infty \qquad,& x = 0 \\ \end{aligned} \right. \end{equation} \qquad 满足 \int_{-\infty}^{+\infty} \delta (x) dx = 1

实质上δ(x)\delta (x)为必然事件的概率密度

H(x)={1,x00,x<0δ(x)=ddxH(x)\begin{equation} H (x)=\left\{ \begin{aligned} 1 \qquad,& x \ge 0 \\ 0 \qquad,& x < 0 \\ \end{aligned} \right. \end{equation} \qquad 则 \delta(x)=\frac{d}{dx}H(x)

定理:

+f(x)δ(x)dx=f(0)\int_{-\infty}^{+\infty} f(x)\delta (x) dx = f(0)

推论:

abδ(x)dx=1a<0<babf(x)δ(x)dx=f(0)a<0<bcdf(x)δ(xa)dx=f(a)c<a<d\begin{align*} &\int_{a}^{b} \delta (x) dx = 1 \qquad &a<0<b \\ &\int_{a}^{b} f(x)\delta (x) dx = f(0) \qquad &a<0<b \\ &\int_{c}^{d} f(x)\delta (x - a) dx = f(a) \qquad &c<a<d \\ \end{align*}

贝叶斯滤波算法

状态方程:Xk=f(Xk1)+Qk观测方程:Yk=H(Xk)+Rk\begin{align*} 状态方程:&\qquad X_k = f(X_{k-1}) + Q_k\\ 观测方程:&\qquad Y_k = H(X_k) + R_k \\ \end{align*}

算法:

初值:X0f0(x)预测步:fk(x)=+fQk(xf(v))fk1+(v)dv更新步:fk+(x)=ηkfRk(ykh(x))fk(x),ηk=[+fRk(ykh(x))fk(x)]1期望估计值:x^k+=+xfk+(x)dx\begin{align*} 初值:&\qquad X_0 \sim f_0(x) \\ 预测步:& \qquad f_k ^{-}(x) = \int_{-\infty}^{+\infty} f_{Q_k}(x-f(v))f_{k-1}^{+}(v) dv \\ 更新步:& \qquad f_k^{+}(x) = \eta_k f_{R_k}(y_k-h(x))f_k^{-}(x) \qquad ,\eta_k=[\int_{-\infty}^{+\infty} f_{R_k}(y_k-h(x))f_k^{-}(x)]^{-1} \\ 期望估计值:& \qquad \hat{x}_k^{+} = \int_{-\infty}^{+\infty} xf_k^{+}(x)dx \\ \end{align*}

缺点:难以处理无穷积分

对策:

  • 对状态方程、观测方程做假设

f(xk1),h(xk)为线性函数Kalman Filter卡尔曼滤波Qk,Rk为正态分布f(xk1),h(xk)为非线性函数Extend Kalman Filter拓展卡尔曼滤波Qk,Rk为正态分布\begin{align*} f(x_{k-1}),h(x_k)为线性函数& \\ &\Rightarrow \quad Kalman\ Filter \quad卡尔曼滤波 \\ Q_k,R_k为正态分布& \\ \\ f(x_{k-1}),h(x_k)为非线性函数& \\ &\Rightarrow \quad Extend\ Kalman\ Filter \quad 拓展卡尔曼滤波 \\ Q_k,R_k为正态分布& \\ \end{align*}

  • 处理无穷积分 高斯积分 \Rightarrow粒子滤波

  • 处理分布函数 无迹卡尔曼滤波

速度 精度 稳定性
EKF 较稳定
PK 较稳定
UKF 较快 较高 很不稳定,易崩溃(维度越高越不稳定)

卡尔曼滤波

条件:

f(xk1)=FXk1h(xk)=hXk假设为线性函数f(x_{k-1}) = F X_{k-1} \quad h(x_k) = h X_k \qquad 假设为线性函数

fQ(x)=12πQex22RfR(x)=12πRex22Rf_Q(x) = \frac{1}{\sqrt{2\pi Q}}e^{-\frac{x^2}{2R}} \quad f_R(x) = \frac{1}{\sqrt{2\pi R}}e^{-\frac{x^2}{2R}}

Xk1N(uk1+,σk1+)QN(0,Q)RN(0,R)设X_{k-1} \sim N(u_{k-1}^{+} , \sigma_{k-1}^{+}) \qquad Q \sim N(0,Q) \qquad R \sim N(0,R)

算法:

uk=Fuk1+σk=F2σk1++QK=hσkh2σk+Ruk+=uk=K(ykhuk)σk+=(1Kh)σku_k^{-}=F u_{k-1}^+ \qquad\sigma_k^{-} = F^2 \sigma_{k-1}^{+} + Q \qquad K = \frac{h\sigma_k^{-}}{h^2\sigma_k^{-} + R} \\ u_k^{+} = u_k^{-} = K(y_k - hu_k^{-}) \qquad \sigma_k^{+} = (1 - Kh)\sigma_k^{-}

分析:K=hh2R/σkK=\frac{h}{h^2 - R/\sigma _k ^{-}}

Rσk,K0,uk+=uk+K(ykhuk)uk(倾向预测值)Rσk,K1h,uk+=uk+K(ykhuk)ykh(倾向预测值)\begin{align*} &若R \gg \sigma_k ^{-}, K \rightarrow 0 , u_k^{+} = u_k^{-} + K(y_k - hu_k^{-}) \rightarrow u_k^{-} \qquad &(倾向预测值)\\ &若R \ll \sigma_k ^{-}, K \rightarrow \frac{1}{h} , u_k^{+} = u_k^{-} + K(y_k - hu_k^{-}) \rightarrow \frac{y_k}{h} \qquad &(倾向预测值) \end{align*}

矩阵形式的卡尔曼滤波

ukukσkkFHQR皆为矩阵u_k \Rightarrow \vec{u}_k \qquad \sigma_k \Rightarrow \sum\nolimits_{k} \\ F、H、Q、R皆为矩阵

算法:

uk=Fuk1k=Fk1FT+QK=kHT(HkHT+R)1uk+=uk+K(ykHuk)k+=(IKH)k\begin{align*} \vec{u}_k^{-} &= F \vec{u}_{k - 1}^{-} \\ \sum\nolimits_{k}^{-} &= F\sum\nolimits_{k - 1}^{-} F^{T} + Q \\ K &= \sum\nolimits_{k}^{-} H^{T}(H\sum\nolimits_{k}^{-}H^{T} + R)^{-1} \\ \vec{u}_k^{+} &= \vec{u}_k^{-} + K(\vec{y}_k - H\vec{u}_k^{-}) \\ \sum\nolimits_{k}^{+} &= (I - KH)\sum\nolimits_{k}^{-}\\ \end{align*}

生成高斯噪声信号:

x=t2x=t^2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
%生成一段时间t
t = 0.1:0.01:1;
L = length(t);

%生成真实信号x,以及观测信号y

%初始化
x = zeros(1, L);
y = x;

%生成信号,设x=t^2
for i = 1:L

x(i) = t(i)^2;
y(i) = x(i) + normrnd(0, 1);

end

%输出生成的信号
plot(t, x, t, y);
legend('真实信号','观测信号');

高斯噪声_卡尔曼滤波

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
function Xplus = Kalman_Filter(y, F, Q, H, R, Xplus_0, Pplus_0)

L = length(y);
n = length(F);

%初始化X(k)plus
Xplus = zeros(n, L);

%初值
Xplus(:, 1) = Xplus_0;
Pplus = Pplus_0;

for i = 2:L

%预测步
Xminus = F * Xplus(:, i - 1);
Pminus = F * Pplus * F' + Q;

%更新步
K = (Pminus * H') * inv(H * Pminus * H' + R);
Xplus(:, i) = Xminus + K * (y(i) - H * Xminus);
Pplus = (eye(n) - K * H) * Pminus;

end

end

简单模型:

Xk=Xk1+QYk=Xk1+RX_{k} = X_{k-1} + Q \\ Y_{k} = X_{k-1} + R

1
2
3
4
5
6
7
8
9
10
11
12
>> F = 1;
>> H = 1;
>> Q = 1;
>> R = 1;
>> Xplus_0 = 0.01;
>> Pplus_0 = 0.01^2;

>> Xplus1 = Kalman_Filter(y, F, H, Q, R, Xplus_0, Pplus_0);

>> plot(t, x, 'r', t, y, 'g', t, Xplus1, 'b');
>> legend('真实信号', '观测信号', '预测信号');

卡尔曼滤波

预测方程优化:

Xk=Xk1+Xk1dt+Xk1(dt)22!Xk=Xk1+Xk1dtXk=Xk1dt\begin{align*} X_k &= X_{k-1} + X'_{k-1} dt + X''_{k-1} \frac{(dt)^2}{2 !} \\ X'_k &= X'_{k-1} + X'_{k-1} dt \\ X''_k &=X''_{k-1} dt \\ \end{align*}

1
2
3
4
5
6
7
8
9
10
11
12
13
>> dt = t(2) - t(1);
>> F = [1, dt, 0.5 * dt^2; 0, 1, dt; 0, 0, 1];
>> H = [1, 0, 0];
>> Q = [1, 0, 0; 0, 0.01, 0; 0, 0, 0.0001];
>> R = 20;
>> Xplus_0 = [0.1^2, 0, 0];
>> Pplus_0 = [0.01, 0, 0; 0, 0.01, 0; 0, 0, 0.0001];

>> Xplus2 = Kalman_Filter(y, F, Q, H, R, Xplus_0, Pplus_0);

>> plot(t, x, 'r', t, y, 'g', t, Xplus2(1, :), 'm');
>> legend('真实信号', '观测信号', '预测信号');

卡尔曼滤波_改进

综合比较:

1
2
3
>> plot(t, x, 'r', t, y, 'g', t, Xplus1, 'b', t, Xplus2(1, :), 'm');
>> legend('真实信号', '观测信号', '预测信号', '预测信号改进');

卡尔曼滤波_比较

拓展卡尔曼滤波

条件:

f(xk1) 与 h(xk)假设为非线性函数f(x_{k-1})\ 与\ h(x_k) \qquad 假设为非线性函数

f(xk1)f(x_{k-1})h(xk)h(x_k)线性化

状态方程: Xk=f(Xk1)+QkXk1N(x^k1+,Pk1+)泰勒展开: f(xk1)f(x^k1+)+f(x^k1+)(Xk1x^k1+)f(x^k1+)Xk1+[f(x^k1+)f(x^k1+)x^k1+]A=f(x^k1+)B=f(x^k1+)f(x^k1+)x^k1+预测方程: Xk=AXk1+B+Qk观测方程: Yk=f(Xk)+RkXkN(x^k,Pk)泰勒展开: h(xk)h(x^k)+h(x^k)(Xkx^k)h(x^k)Xk+[h(x^k)h(x^k)x^k]C=h(x^k)D=h(x^k)h(x^k)x^k更新方程: Yk=CXk+D+Rk\begin{align*} 状态方程: \ &X_k = f(X_{k-1}) +Q_k \quad X_{k-1} \sim N(\hat{x}^{+}_{k-1},P^{+}_{k-1}) \\ 泰勒展开: \ &f(x_{k-1}) \approx f(\hat{x}^{+}_{k-1}) + f'(\hat{x}^{+}_{k-1})(X_{k-1}-\hat{x}^{+}_{k-1}) \approx f'(\hat{x}^{+}_{k-1})X_{k-1} + [f(\hat{x}^{+}_{k-1})-f'(\hat{x}^{+}_{k-1})\hat{x}^{+}_{k-1}] \\ 令\quad &A=f'(\hat{x}^{+}_{k-1})\quad B = f(\hat{x}^{+}_{k-1})-f'(\hat{x}^{+}_{k-1})\hat{x}^{+}_{k-1} \\ 预测方程:\ &X_k = AX_{k-1} + B +Q_k \\ \\ 观测方程: \ &Y_k = f(X_{k}) +R_k \quad X_{k} \sim N(\hat{x}^{-}_{k},P^{-}_{k}) \\ 泰勒展开: \ &h(x_{k}) \approx h(\hat{x}^{-}_{k}) + h'(\hat{x}^{-}_{k})(X_{k}-\hat{x}^{-}_{k}) \approx h'(\hat{x}^{-}_{k})X_{k} + [h(\hat{x}^{-}_{k}) - h'(\hat{x}^{-}_{k})\hat{x}^{-}_{k}] \\ 令\quad &C=h'(\hat{x}^{-}_{k})\quad D = h(\hat{x}^{-}_{k})-h'(\hat{x}^{-}_{k})\hat{x}^{-}_{k} \\ 更新方程:\ &Y_k = CX_{k} + D +R_k \end{align*}

算法:

Xk1N(x^k1+,pk1+)预测步: A=f(x^k1+)x^k=f(x^k1+)Pk=A2Pk1++Q更新步: C=h(x^k)K=CPkC2Pk+Rx^k+=x^k+K(ykh(x^k))Pk+=(1KC)Pk\begin{align*} &X_{k-1} \sim N(\hat{x}^{+}_{k-1},p^{+}_{k-1}) \\ 预测步:\ &A=f'(\hat{x}^{+}_{k-1}) \qquad \hat{x}^{-}_k = f(\hat{x}^{+}_{k-1}) \qquad P^{-}_{k} = A^2P^{+}_{k-1} + Q \\ 更新步:\ &C=h'(\hat{x}^{-}_k) \qquad K = \frac{CP^{-}_{k}}{C^2P^{-}_{k}+R} \qquad \hat{x}^{+}_k = \hat{x}^{-}_k +K(y_k - h(\hat{x}^{-}_k)) \qquad P^{+}_k = (1 - KC)P^{-}_k \\ \end{align*}

矩阵形式:

Xk1N(x^k1+,k1+)A=(f1xk1(1)f1xk1(2)f1xk1(n)fnxk1(1)fnxk1(2)fnxk1(n))xk=f(x^k1+)k1=Ak1+AT+QC=(h1xk(1)h1xk(2)h1xk(n)hnxk(1)hnxk(2)hnxk(n))K=kCT(CkCT+R)xk+=xk+K(yh(xk))k+=(IKC)k\begin{align*} &\vec{X}_{k-1} \sim N(\hat{\vec{x}}^{+}_{k-1},\sum\nolimits_{k-1}^{+}) \\ A&= \begin{pmatrix} \frac{\partial f_1}{\partial x^{(1)}_{k-1}} & \frac{\partial f_1}{\partial x^{(2)}_{k-1}} & \cdots & \frac{\partial f_1}{\partial x^{(n)}_{k-1}} \\ \vdots & \vdots & \ddots & \vdots \\ \frac{\partial f_n}{\partial x^{(1)}_{k-1}} & \frac{\partial f_n}{\partial x^{(2)}_{k-1}} & \cdots & \frac{\partial f_n}{\partial x^{(n)}_{k-1}} \\ \end{pmatrix} \\ \vec{x}^{-}_{k} &= f(\hat{\vec{x}}^{+}_{k-1}) \\ \sum\nolimits_{k-1}^{-} &= A \sum\nolimits_{k-1}^{+} A^{T} + Q \\ C&= \begin{pmatrix} \frac{\partial h_1}{\partial x^{(1)}_{k}} & \frac{\partial h_1}{\partial x^{(2)}_{k}} & \cdots & \frac{\partial h_1}{\partial x^{(n)}_{k}} \\ \vdots & \vdots & \ddots & \vdots \\ \frac{\partial h_n}{\partial x^{(1)}_{k}} & \frac{\partial h_n}{\partial x^{(2)}_{k}} & \cdots & \frac{\partial h_n}{\partial x^{(n)}_{k}} \\ \end{pmatrix} \\ K &= \sum\nolimits_{k}^{-} C^{T}(C \sum\nolimits_{k}^{-} C^T +R) \\ \vec{x}^{+}_k &= \vec{x}^{-}_k + K(\vec{y} -h(\vec{x}^{-}_k)) \\ \sum\nolimits_{k}^{+} &= (I - KC)\sum\nolimits_{k}^{-} \end{align*}

生成高斯噪声信号:

真实数据:xi=sin(3xi1)观测数据:yi=xi2+R\begin{align*} 真实数据:\quad x_i&=\sin(3x_{i-1}) \\ 观测数据:\quad y_i&=x_i^2+R \end{align*}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
%生成100个信号
t = 0.01:0.01:1;
n = length(t);
x = zeros(1, n);
y = zeros(1, n);

%初值
x(1) = 0.1;
y(1) = 0.1^2;

%生成真实数据与观测数据
for i = 2:n

x(i) = sin(3 * x(i - 1));
y(i) = x(i)^2 + normrnd(0, 1);

end

%输出生成的信号
plot(t, x, 'r', t, y, 'b');
legend('真实信号', '观测信号');

高斯噪声_拓展卡尔曼滤波

注:只对一维的情况

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
function Xplus = Extend_Kalman(y, F, Q, H, R, Xplus_0, Pplus_0)

n = length(y);
Xplus = zeros(1, n);

f=sym(F);
df=diff(f);
dF=matlabFunction(df);
h=sym(H);
dh=diff(h);
dH=matlabFunction(dh);

Pplus = Pplus_0;
Xplus(1) = Xplus_0;

for i = 2:n

%预测步
A = dF(Xplus(i - 1));
Xminus = F(Xplus(i - 1));
Pminus = A * Pplus * A' +Q;

%更新步
C = dH(Xminus);
K = Pminus * C * inv(C * Pminus * C' +R);
Xplus(i) = Xminus + K * (y(i) - H(Xminus));
Pplus = (eye(1) - K * C) * Pminus;

end

end

1
2
3
4
5
6
7
8
9
10
11
12
>> F = @(x)sin(x);
>> H = @(x)x^2;
>> Q = 1;
>> R = 1;
>> Xplus_0 = 0.01;
>> Pplus_0 = 0.01^2;

>> Xplus = Extend_Kalman(y, F, Q, H, R, Xplus_0, Pplus_0)

>> plot(t, x, 'r', t, y, 'g', t, Xplus, 'b');
>> legend('真实信号', '观测信号', '预测信号');

拓展卡尔曼滤波

原因:多峰问题。观测方程yi=xi2+Ry_i=x_i^2+R有两个解

粒子滤波器

条件:

Xk=f(xk1)+QkYk=h(xk)+RkX0,Q1,,Qk,R1,,Rk相互独立\begin{align*} X_k &= f(x_{k-1}) + Q_k \\ Y_k &= h(x_k) + R_k \\ X_0,Q_1, \dots ,& Q_k,R_1, \dots , R_k 相互独立 \end{align*}

算法:

(1)初值 X0N(u,σ2)(2)生成nX0样本 x0(1),,x0(n)(3)生成X0样本对应权重 ω0(i)(ω0(i)=1n or f(x0(i))i=1nf(x0(i)))预测步开始(4)生成Xk的样本 xk(i)=f(x0(i))+Q预测步的分布函数 fk(x)=i=1nωk1(i)δ(xxk(i))预测步结束观测到数据yk(5)更新步的分布函数 fk+(x)=ηfR(ykh(x))fk(x)=i=1nη fR(ykh(x)) ωk1(i)δ(xxk(i))改变粒子权重 ωk(i)=fR(ykh(x(i)))ωk1(i)fR=12πσex22σ2(6)归一化 η=(i=1nωk(i))1(7)估计期望位置 x^k+=E(x)=+i=1nωk(i)δ(xxi)dx=i=1nωk(i)xi(8)方差 D(X)=E(X2)[E(X)]2=+x2f(x)dx(+x2f(x)dx)2=i=1n[ωk(i)xi2(x^k+)2]更新步结束\begin{align*} (1)&初值\ X_0 \sim N(u,\sigma ^2) \\ (2)&生成n个X_0样本\ x_0^{(1)} , \dots , x_0^{(n)} \\ (3)&生成X_0样本对应权重\ \omega_0^{(i)} \quad \bigg(\omega_0^{(i)} = \frac{1}{n} \ or \ \frac{f(x_0^{(i)})}{\sum_{i=1}^{n} f(x_0^{(i)})}\bigg) \\ &\cdots \cdots \\ &预测步开始 \\ (4)&生成X_k^{-}的样本\ x_k^{-(i)} = f(x_0^{(i)}) + Q \\ &预测步的分布函数\ f_k^{-}(x) = \sum_{i=1}^{n} \omega_{k-1}^{(i)} \delta(x - x_k^{(i)}) \\ &预测步结束 \\ &观测到数据y_k \\ (5)&更新步的分布函数\ f_k^{+}(x) = \eta f_R(y_k - h(x))f_k^{-}(x) = \sum _{i = 1}^{n} \eta \ f_R(y_k - h(x))\ \omega_{k-1}^{(i)} \delta(x - x_k^{(i)}) \\ &改变粒子权重\ \omega_k^{(i)} = f_R(y_k - h(x^{-(i)}))\omega _{k-1}^{(i)} \qquad f_R = \frac{1}{\sqrt{2\pi \sigma}} e^{-\frac{x^2}{2\sigma ^2}} \\ (6)&归一化\ \eta = (\sum_{i = 1}^{n} \omega _k^{(i)})^{-1} \\ (7)&估计期望位置\ \hat{x}_k^{+} = E(x) = \int_{-\infty}^{+\infty} \sum _{i=1}^{n} \omega_k^{(i)} \delta(x - x_i) dx = \sum_{i=1}^{n} \omega_k^{(i)}x_i \\ (8)&方差\ D(X) = E(X^2) - [E(X)]^2 = \int_{-\infty}^{+\infty} x^2f(x)dx - \bigg(\int_{-\infty}^{+\infty} x^2f(x)dx\bigg)^2 = \sum _{i=1}^{n} [\omega_k^{(i)}x_i^2- (\hat{x}_k^{+})^2] \\ &更新步结束 \\ &\dots \dots \end{align*}

生成高斯噪声信号:

真实数据:xi=sin(xi1)+5xi1xi12+1观测数据:yi=xi3+R\begin{align*} 真实数据:\quad x_i&=\sin(x_{i-1})+\frac{5x_{i-1}}{x_{i-1}^2+1} \\ 观测数据:\quad y_i&=x_i^3+R \end{align*}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
%生成100个信号
t = 0.01:0.01:1;
x = zeros(1, 100);
y = zeros(1, 100);

%初值
x(1) = 0.1;
y(1) = 0.01^3;

%生成真实数据与观测数据
for i = 2:100

x(i) = sin(x(i - 1)) + 5 * x(i - 1) / (x(i - 1)^2 + 1);
y(i) = x(i)^3 + normrnd(0, 1);

end

%输出生成的信号
plot(t, x, t, y);
legend('真实信号','观测信号');

高斯噪声_粒子滤波

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
function Xplus = Particle_Filter(y, F, Q, H, R, n, Nth, Xplus_0)

L = length(y);

%设粒子集合
Xold = zeros(1, n); %重采样前粒子
Xnew = zeros(1, n); %重采样后粒子
Xplus = zeros(1, L); %滤波值,即后验概率期望
w = zeros(1, n); %粒子权重集合

%设置初值x0(i)
for i = 1:n

Xold(i) = Xplus_0;
w(i) = 1 / n;

end

for i = 2:L

%预测步,由x0推出x1
for j = 1:n

Xold(j) = F(Xold(j)) + normrnd(0, Q);

end

%更新步,更新粒子权重
for j = 1:n

%w(j) = (2 * pi * R)^(-0.5) * exp(- (y(i) - h(xold(j)))^2 / (2 * R));
%归一化可以消去前面的系数
w(j) = exp(- (y(i) - H(Xold(j)))^2 / (2 * R));

end

%归一化
w = w / sum(w);

%重采样
Neff = 1 / sum(w .* w);

if Neff < Nth * n

c = zeros(1, n);
c(1) = w(1);

for j = 2:n

%设置区间
c(j) = c(j - 1) + w(j);

end

%转盘子,生成随机数,落在哪个区间
for j = 1:n

a = unifrnd(0, 1); %均匀分布

for k = 1:n

if a < c(k)

Xnew(j) = Xold(k);
break; %找到区间之后,跳出

end

end

end

%把新的粒子赋给Xold
Xold = Xnew;

%权重都设为1/n
for j = 1:n

w(j) = 1 / n;

end

end

%估计期望位置
for j = 1:n
Xplus(i) = Xplus(i) + Xold(j) * w(j);
end

end

end

1
2
3
4
5
6
7
8
9
10
11
12
13
>> F = @(x)sin(x) + 5 * x / (x^2 + 1)
>> H = @(x)x^3
>> Q = 1;
>> R = 1;
>> n = 100;
>> Nth = 0.5;
>> Xplus_0 = 0.01;

>> Xplus = Particle_Filter(y, F, Q, H, R, n, Nth, Xplus_0);

>> plot(t, x, 'r', t, y, 'g', t, Xplus, 'b');
>> legend('真实信号', '观测信号', '预测信号');

粒子滤波器

1
2
3
>> plot(t, x, 'r', t, Xplus, 'b');
>> legend('真实信号', '预测信号');

放大康康

感想

毕业了,其实到了最后因为一些特殊的原因(现在回想起来两个人其实也不该)我的大创就终止了,但是没想到会在最后结题答辩的时候翻车,说心里话有一些对不起我的大创老师。虽然大创可能在教授的研究生涯中根本算不上一个科研项目,但是对于我们本科生而言真的是提前开眼。感谢我们的大创老师的栽培以及研究生学长学姐的相助,若没有本科的大创的科研训练,恐怕我研究生的项目也无法如此快速的入手。