看不太懂该代码中运用到的CHAN算法优化方式

最近在写论文,做一些基于chan式定位算法优化的研究,在网上找了许多代码,发现可以直接用的不多,最后找到了一个博主的代码,还挺不错的,但是其中有一个文件,愣是看不太懂其中运用到的优化方式,作者只说:”在第一次WLS估计后,用真实值进行对TDOA测量值的修正,再将修正过后的估计值作为第二次Chan算法的TDOA值再次进行WLS估计标签节点的坐标。”,多次联系作者未果,询问导师,导师也没看懂,为什么是用真实值修正测量值,在我的查阅之后怀疑这里作者表达的可能是卡尔曼滤波法,因为卡尔曼滤波是用“用测量值来修正估计值”,与作者说的有些类似,但是我还是没看明白代码里表示的内容,不太敢确定是否是卡尔曼滤波,在这里恳请各位的帮忙。

这是卡尔曼滤波详解:
https://blog.csdn.net/u010720661/article/details/63253509?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522164864244916780357266837%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=164864244916780357266837&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-1-63253509.142^v5^pc_search_result_control_group,143^v6^register&utm_term=%E5%8D%A1%E5%B0%94%E6%9B%BC%E6%BB%A4%E6%B3%A2&spm=1018.2226.3001.4187
?%ra=card

这是代码的网页:
https://download.csdn.net/download/qq_39320462/12985795?utm_medium=distribute.pc_relevant_download.none-task-download-2~default~OPENSEARCH~Rate-5.dl_default&depth_1-utm_source=distribute.pc_relevant_download.none-task-download-2~default~OPENSEARCH~Rate-5.dl_default&dest=https%3A%2F%2Fdownload.csdn.net%2Fdownload%2Fqq_39320462%2F12985795&spm=1003.2020.3001.6616.6

下面是通过“某种”方法优化后的代码,也是这次不懂的地方所在:
function gjchan()
M = 6;
gjChanCDFjs=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];
for i=1:4500
gjChanStandarddeviation = 1.5;
gjChandwwc = [0,0.2,0.4,0.6,0.8,1,1.2,1.4,1.6,1.8,2,2.2,2.4,2.6,2.8,3];
gjChanms=[5,10];
gjChanx=gjChanms(1);
gjChany=gjChanms(2);
gjChanc=310^8;
gjChanX=[0,0,-45,-45,0,45,45];
gjChanY=[0,51.96,25.98,-25.98,-59.16,-25.98,25.98];
gjChanbasestx=gjChanX(1:M);
gjChanbasesty=gjChanY(1:M);
gjChanN=length(gjChanbasestx);
gjChanri1=[];
gjChanxi1=[];
gjChanyi1=[];
gjChank=[];
gjChanh=[];
gjChanGa=[];
gjChanrmse=[];
for i=2:gjChanN
gjChanxi1(i-1)=gjChanbasestx(i)-gjChanbasestx(1);
gjChanyi1(i-1)=gjChanbasesty(i)-gjChanbasesty(1);
end
for i=1:gjChanN
gjChank(i)=(gjChanbasestx(i))^2+(gjChanbasesty(i))^2;
end
for j0=1:length(gjChandwwc)
for i=2:gjChanN
gjChanri1(i-1)=sqrt((gjChanbasestx(i)-gjChanx)^2+(gjChanbasesty(i)-gjChany)^2)- sqrt((gjChanbasestx(1)-gjChanx)^2+(gjChanbasesty(1)-gjChany)^2)-gjChanStandarddeviation
randn(1);
end
for i=2:gjChanN
gjChanh(i-1)=0.5*((gjChanri1(i-1))^2-gjChank(i)+gjChank(1));
end
for i=1:3
for j=2:gjChanN
switch i,
case 1,
gjChanGa(j-1,i)=-gjChanxi1(j-1);
case 2,
gjChanGa(j-1,i)=-gjChanyi1(j-1);
case 3,
gjChanGa(j-1,i)=-gjChanri1(j-1);
end
end
end
gjChanQ=zeros(gjChanN-1,gjChanN-1);
for i=1:gjChanN-1
gjChanQ(i,i)=(gjChanStandarddeviation)^2;
end
gjChanZa=inv(gjChanGa'*inv(gjChanQ)*gjChanGa)gjChanGa'inv(gjChanQ)gjChanh';
gjChanB1=[];
for i=1:gjChanN-1
gjChanB1(i,i)=sqrt((gjChanbasestx(i+1)-gjChanZa(1))^2+(gjChanbasesty(i+1)-gjChanZa(2))^2);
end
gjChanP1=gjChanc^2
gjChanB1
gjChanQ
gjChanB1;
gjChanZa1=inv(gjChanGa'*inv(gjChanP1)*gjChanGa)*gjChanGa'*inv(gjChanP1)gjChanh';
gjChanC=inv(gjChanGa'inv(gjChanQ)gjChanGa);
gjChanh1=[(gjChanZa1(1)-gjChanbasestx(1))^2;(gjChanZa1(2)-gjChanbasesty(1))^2;(gjChanZa1(3))^2];
gjChanGa1=[1,0;0,1;1,1];
gjChanr1=sqrt((gjChanbasestx(1)-gjChanZa1(1))^2+(gjChanbasesty(1)-gjChanZa1(2))^2);
gjChanB2=[gjChanZa1(1)-gjChanbasestx(1),0,0;0,gjChanZa1(2)-gjChanbasesty(1),0;0,0,gjChanr1];
gjChanP2=4
gjChanB2
gjChanC
gjChanB2;
gjChanZa2=inv(gjChanGa1'*inv(gjChanP2)*gjChanGa1)gjChanGa1'inv(gjChanP2)gjChanh1;
gjChan2B1=[];
for i=1:gjChanN-1
gjChan2B1(i,i)=sqrt((gjChanbasestx(i+1)-gjChanZa2(1))^2+(gjChanbasesty(i+1)-gjChanZa2(2))^2);
end
gjChan2P1=gjChanc^2
gjChan2B1
gjChanQ
gjChan2B1;
gjChan2Za1=inv(gjChanGa'*inv(gjChan2P1)*gjChanGa)*gjChanGa'*inv(gjChan2P1)gjChanh';
gjChan2C=inv(gjChanGa'inv(gjChanQ)gjChanGa);
gjChan2h1=[(gjChan2Za1(1)-gjChanbasestx(1))^2;(gjChan2Za1(2)-gjChanbasesty(1))^2;(gjChan2Za1(3))^2];
gjChan2Ga1=[1,0;0,1;1,1];
gjChan2r1=sqrt((gjChanbasestx(1)-gjChan2Za1(1))^2+(gjChanbasesty(1)-gjChan2Za1(2))^2);
gjChan2B2=[gjChan2Za1(1)-gjChanbasestx(1),0,0;0,gjChan2Za1(2)-gjChanbasesty(1),0;0,0,gjChan2r1];
gjChan2P2=4
gjChan2B2
gjChan2C
gjChan2B2;
gjChan2Za2=inv(gjChan2Ga1'*inv(gjChan2P2)*gjChan2Ga1)*gjChan2Ga1'*inv(gjChan2P2)*gjChan2h1;
gjChanms0 = sqrt(gjChanZa2)+[gjChanbasestx(1);gjChanbasesty(1)];
gjChan2ms0=sqrt(gjChan2Za2)+[gjChanbasestx(1);gjChanbasesty(1)];
gjChan2rmse=sqrt((gjChan2ms0(1)-gjChanx)^2+(gjChan2ms0(2)-gjChany)^2);
gjChanrmse=sqrt((gjChanms0(1)-gjChanx)^2+(gjChanms0(2)-gjChany)^2);
if gjChan2rmse > gjChanrmse
if gjChanrmse < gjChandwwc(j0)
gjChanCDFjs(j0) = gjChanCDFjs(j0) + 1;
end
else
if gjChan2rmse < gjChandwwc(j0)
gjChanCDFjs(j0) = gjChanCDFjs(j0) + 1;
end
end
end
end
figure
plot(gjChandwwc,gjChanCDFjs/5000,'^--r')
axis([0,3,0,1]);
legend('改进chan算法');
grid on;
hold on;
ylabel('CDF');
xlabel('定位误差/m');
title('TDOA下6个基站噪声1.5参与定位')

下面是优化前的,也就是正常的CHAN算法
function chan()
M = 6;
ChanCDFjs=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];
for i=1:4500
ChanStandarddeviation = 1.5;
Chandwwc = [0,0.2,0.4,0.6,0.8,1,1.2,1.4,1.6,1.8,2,2.2,2.4,2.6,2.8,3];
Chanms=[5,10];
Chanx=Chanms(1);
Chany=Chanms(2);
Chanc=310^8;
ChanX=[0,0,-45,-45,0,45,45];
ChanY=[0,51.96,25.98,-25.98,-59.16,-25.98,25.98];
Chanbasestx=ChanX(1:M);
Chanbasesty=ChanY(1:M);
ChanN=length(Chanbasestx);
%ChanStandarddeviation=[0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1,1.1,1.2,1.3,1.4,1.5,1.6,1.7,1.8,1.9,2];
Chanri1=[];
Chanxi1=[];
Chanyi1=[];
Chank=[];
Chanh=[];
ChanGa=[];
Chanrmse=[];
for i=2:ChanN
Chanxi1(i-1)=Chanbasestx(i)-Chanbasestx(1);
Chanyi1(i-1)=Chanbasesty(i)-Chanbasesty(1);
end
for i=1:ChanN
Chank(i)=(Chanbasestx(i))^2+(Chanbasesty(i))^2;
end
%for j0=1:length(ChanStandarddeviation)
for j0=1:length(Chandwwc)
for i=2:ChanN
%Chanri1(i-1)=sqrt((Chanbasestx(i)-Chanx)^2+(Chanbasesty(i)-Chany)^2)- sqrt((Chanbasestx(1)-Chanx)^2+(Chanbasesty(1)-Chany)^2)-ChanStandarddeviation(j0)rand(1);
Chanri1(i-1)=sqrt((Chanbasestx(i)-Chanx)^2+(Chanbasesty(i)-Chany)^2)- sqrt((Chanbasestx(1)-Chanx)^2+(Chanbasesty(1)-Chany)^2)-ChanStandarddeviation
randn(1);
end
for i=2:ChanN
Chanh(i-1)=0.5
((Chanri1(i-1))^2-Chank(i)+Chank(1));
end
for i=1:3
for j=2:ChanN
switch i,
case 1,
ChanGa(j-1,i)=-Chanxi1(j-1);
case 2,
ChanGa(j-1,i)=-Chanyi1(j-1);
case 3,
ChanGa(j-1,i)=-Chanri1(j-1);
end
end
end
ChanQ=zeros(ChanN-1,ChanN-1);
for i=1:ChanN-1
%ChanQ(i,i)=(ChanStandarddeviation(j0))^2;
ChanQ(i,i)=(ChanStandarddeviation)^2;
end
ChanZa=inv(ChanGa'*inv(ChanQ)*ChanGa)ChanGa'inv(ChanQ)Chanh';
ChanB1=[];
for i=1:ChanN-1
ChanB1(i,i)=sqrt((Chanbasestx(i+1)-ChanZa(1))^2+(Chanbasesty(i+1)-ChanZa(2))^2);
end
ChanP1=Chanc^2
ChanB1
ChanQ
ChanB1;
ChanZa1=inv(ChanGa'*inv(ChanP1)*ChanGa)*ChanGa'*inv(ChanP1)Chanh';
ChanC=inv(ChanGa'inv(ChanQ)ChanGa);
Chanh1=[(ChanZa1(1)-Chanbasestx(1))^2;(ChanZa1(2)-Chanbasesty(1))^2;(ChanZa1(3))^2];
ChanGa1=[1,0;0,1;1,1];
Chanr1=sqrt((Chanbasestx(1)-ChanZa1(1))^2+(Chanbasesty(1)-ChanZa1(2))^2);
ChanB2=[ChanZa1(1)-Chanbasestx(1),0,0;0,ChanZa1(2)-Chanbasesty(1),0;0,0,Chanr1];
ChanP2=4
ChanB2
ChanC
ChanB2;
ChanZa2=inv(ChanGa1'*inv(ChanP2)*ChanGa1)*ChanGa1'*inv(ChanP2)*Chanh1;
Chanms0=sqrt(ChanZa2)+[Chanbasestx(1);Chanbasesty(1)];
Chanrmse=sqrt((Chanms0(1)-Chanx)^2+(Chanms0(2)-Chany)^2);
if Chanrmse < Chandwwc(j0)
ChanCDFjs(j0) = ChanCDFjs(j0) + 1;
end
end
end
figure
plot(Chandwwc,ChanCDFjs/5000,'^--r')
axis([0,3,0,1]);
legend('chan算法');
grid on;
hold on;
ylabel('CDF');
xlabel('定位误差/m');
title('CHAN算法6个基站,噪声方差为1.5')

%Chana=Chanrmse+Chana;
%end
%Chanb=Chana/1000;