GNSS差分码偏差(DCB,Differential Code Bias),有时也称IFB(Inter-Frequency Bias),是由不同类型的GNSS信号在卫星和接收机不同通道产生的时间延迟(硬件延迟/码偏差)差异,按照频率相同或者不同又可以细分为频内偏差(Intra-Frequency Bias)和频间偏差(Inter-Frequency Bias)。
我们以L1频点为例,把L1的卫星钟差为基准,L2的卫星钟差为:
δ
2
s
a
t
=
δ
1
s
a
t
+
(
b
2
s
a
t
−
b
1
s
a
t
)
=
δ
f
1
s
a
t
+
D
C
B
12
s
a
t
\delta _2^{sat} = \delta _1^{sat} + (b_2^{sat} - b_1^{sat}) = \delta _{f1}^{sat} + DCB_{12}^{sat}
δ2sat=δ1sat+(b2sat−b1sat)=δf1sat+DCB12sat
其中
δ
\delta
δ 为卫星钟差,b为该卫星的硬件延迟,该表示为L1L2频点的DCB。
我们对无电离层组合的钟差考虑
δ
I
F
s
a
t
=
f
1
2
δ
1
s
a
t
−
f
2
2
δ
2
s
a
t
f
1
2
−
f
2
2
=
f
1
2
δ
1
s
a
t
−
f
2
2
(
δ
1
s
a
t
−
D
C
B
12
s
a
t
)
f
1
2
−
f
2
2
=
δ
1
s
a
t
−
f
2
2
D
C
B
12
s
a
t
f
1
2
−
f
2
2
\delta _{IF}^{sat} = {{f_1^2\delta _1^{sat} - f_2^2\delta _2^{sat}} \over {f_1^2 - f_2^2}} = {{f_1^2\delta _1^{sat} - f_2^2(\delta _1^{sat} - DCB_{12}^{sat})} \over {f_1^2 - f_2^2}} = \delta _1^{sat} - {{f_2^2DCB_{12}^{sat}} \over {f_1^2 - f_2^2}}
δIFsat=f12−f22f12δ1sat−f22δ2sat=f12−f22f12δ1sat−f22(δ1sat−DCB12sat)=δ1sat−f12−f22f22DCB12sat
对于个别系统来说,习惯性把
f
2
2
D
C
B
12
s
a
t
f
1
2
−
f
2
2
{{f_2^2DCB_{12}^{sat}} \over {f_1^2 - f_2^2}}
f12−f22f22DCB12sat看作TGD。
GPS广播星历中的钟差都是基于无电离层组合的钟差,故钟差关系为
δ
1
s
a
t
=
δ
I
F
s
a
t
−
T
G
D
=
δ
I
F
s
a
t
+
f
2
2
D
C
B
12
s
a
t
f
1
2
−
f
2
2
\delta _1^{sat} = \delta _{IF}^{sat} - TGD = \delta _{IF}^{sat} + {{f_2^2DCB_{12}^{sat}} \over {f_1^2 - f_2^2}}
δ1sat=δIFsat−TGD=δIFsat+f12−f22f22DCB12sat
δ
2
s
a
t
=
δ
I
F
s
a
t
−
(
f
1
f
2
)
2
T
G
D
=
δ
I
F
s
a
t
+
f
1
2
f
1
2
−
f
2
2
D
C
B
12
s
a
t
\delta _2^{sat} = \delta _{IF}^{sat} - {\left( {{{{f_1}} \over {{f_2}}}} \right)^2}TGD = \delta _{IF}^{sat} + {{f_1^2} \over {f_1^2 - f_2^2}}DCB_{12}^{sat}
δ2sat=δIFsat−(f2f1)2TGD=δIFsat+f12−f22f12DCB12sat
**需要注意的:**在DCB改正的时候都是基于什么频点,改正过程中频点的基准要确定。
上述讨论的时频率之间的DCB,在系统中还与不同的码(通道)有关,例如C1和P1码之间 D C B P 1 C 1 DCB_{P1C1} DCBP1C1
几种常用的频点转换公式
rtklib提供的DCB读取并未涉及到对标准格式(2016年后)的读取,通过格式说明编写了以下的DCB读取,格式中实际上提供了DSB、OSB、ISB三种偏差改正信息,只读取了DSB。
while (fgets(buff,sizeof(buff),fp)) {
if (strstr(buff, "-BIAS/SOLUTION ")) break;
setstr(Dsbias, buff + 24, 10);
if (strstr(Dsbias,"C1C C1W") || strstr(Dsbias, "C1X C5X")) type=1;
else if (strstr(Dsbias,"C2C C2W") || strstr(Dsbias, "C1P C5P")) type=2;
else if (strstr(Dsbias,"C2W C2S") || strstr(Dsbias, "C1D C5D")) type=3;
else if (strstr(Dsbias, "C2W C2L") || strstr(Dsbias, "C1X C6I")) type = 4;
else if (strstr(Dsbias, "C2W C2X") || strstr(Dsbias, "C1P C6I")) type = 5;
else if (strstr(Dsbias, "C1C C2W") || strstr(Dsbias, "C1D C6I")) type = 6;
else if (strstr(Dsbias, "C1C C5Q") || strstr(Dsbias, "C2I C6I")) type = 7;
else if (strstr(Dsbias, "C1C C5X") || strstr(Dsbias, "C1X C7Z")) type = 8;
else if (strstr(Dsbias, "C1W C2W") || strstr(Dsbias, "C1X C8X")) type = 9;
if (!type) continue;
setstr(str1, buff + 11, 3); setstr(str2, buff + 15, 4);
if ((cbias=str2num(buff,82,9))==0.0) continue;
if (sta&&(!strcmp(str1,"G")||!strcmp(str1,"R") || !strcmp(str1, "E") || !strcmp(str1, "C") || !strcmp(str1, "J"))) { /* receiver DCB */
for (i=0;i<MAXRCV;i++) {
if (!strcmp(sta[i].name,str2)) break;
}
if (i<MAXRCV) {
p=strchr(syscodesbias, str1[0]);
j=(int)(p-syscodesbias);
nav->rbias[i][j][type-1]=cbias*1E-9*CLIGHT; /* ns -> m */
}
}
else if ((sat=satid2no(str1))) { /* satellite dcb */
nav->cbias[sat-1][type-1]=cbias*1E-9*CLIGHT; /* ns -> m */
}
}
DCB格式代码下载:https://download.csdn.net/download/weixin_44994338/19022518