Introduction

With the development of the third-generation BeiDou system (BDS-3), the availability of the new BeiDou civil B1C and B2a signals along with existing B1I and B3I signals will greatly benefit the design of BeiDou multi-frequency receivers (Yang et al. 2019). For instance, multi-frequency signals can provide signal observations at multiple frequencies to form flexible design strategies of advanced receiver baseband signal processing such as inner-band aiding and joint tracking and form a linear combination of observations used for different purpose like ionospheric-free, wide-lane and narrow-lane combinations. Also, the availability, accuracy and robustness in both tracking and navigation solutions can be improved through redundancy of multiple signal frequencies from the same satellite. The new signals B1C and B2a can share two frequencies at 1575.42 MHz and 1176.45 MHz, respectively, with the modernized GPS L1C/L5 and Galileo E1/E5 signals, as well as some modern navigation signal features like binary offset carrier (BOC) modulation and pilot/data components (Lu et al. 2019; CSNO 2017a, b), to improve the ranging performance and the interoperability (Yao and Lu 2016). From the above, the use of B1C and B2a signals presents new opportunities to increase the performance of a receiver.

The ideas of collaboration across pilot and data channels from the same carrier frequency and even across different frequencies transmitted from the same satellite have been presented in many works of literature for tracking purposes. For signal tracking collaborations on the same carrier frequency (e.g., data and pilot channels), the output of individual channels has been combined using the optimal linear combined standard tracking loop (denoted here as OLC-STL) either at the correlator level (Spilker and Dierendonck 1999; Mongrédien et al. 2006) or at the discriminator level (Tran 2004; Muthuraman et al. 2008) for GPS L5 and L2C signals and at the discriminator level for BeiDou B2a and B1C signals (Li et al. 2018, 2019; Wu et al. 2019). But all research discussed to date uses the same integration time for signals coming from pilot and data channels at different frequency bands, which, however, is limited by navigation symbol bits in the data channel. Compared to the data channel, the pilot channel can use a longer integration time to track signals more robustly since it is not modulated by the navigation data and thus allowing satellite signals to be tracked in challenging environments (Kaplan and Hegarty 2017; Yao and Lu 2016).

Research on signal tracking collaborations across different carrier frequency bands from the same satellite can be divided into two categories, i.e., the inter-band Doppler-aided and Kalman filter technologies. The inter-band Doppler-aided dual-frequency tracking technologies are explored using the optimal linear combined Doppler-aided tracking loop, denoted here as OLC-DATL, for GPS L1 CA/L5 (Ries et al. 2002; Bolla and Lohan 2018; Bolla and Borre 2019), L1 CA/L2C (Qaisar 2009) and BeiDou B1C/B2a (Wu et al. 2019) signals which explore the inherent linear relationship among different signal frequencies from the same satellite and improve the tracking performance of the aided signal. However, the overall performance of the structure depends on the band to provide the Doppler information. Therefore, this structure is susceptible to the selective frequency signal attenuation present in the signal band that provides Doppler-aiding information. For selective frequency signal attenuation, this is the case when a single-frequency band is affected by interference and only one signal is severely attenuated, such as the L5 band attenuation. Kalman filter-based technologies are designed for GPS L1 CA/L5 (Megahed et al. 2009) and L1 CA/L1C (Macchi 2010) signals at correlator-level measurements and GPS L1 CA/L2C (Gernot et al. 2011) signals at discriminator-level measurements. Compared to the Doppler-aided method, the Kalman filter method can improve the tracking accuracy using advanced filtering theory and can fuse the measurements from different carrier frequency bands, which can provide benefits to the tracking of each band. Several problems, however, still exist. The first one is the limitation of the integration time. The existing Kalman filter-based methods combine the traditional GPS L1 C/A signal with one of the modernized pilot signals such as GPS L5, L2C and L1C, and the integration time of these combinations is still limited by the navigation symbol bit period of the GPS L1 C/A (20 ms) signal. Moreover, this problem will be more severe for BeiDou B1C and B2a signals (10 ms and 5 ms, respectively). Therefore, the tracking sensitivity will be greatly limited. Second, since the Kalman filter-based technology fuses the information from two frequency signals, it can enhance the tracking performance of each band and has the potential to better withstand the selective frequency signal attenuation problem. This, however, has not been discussed.

We propose an adaptive Kalman filter-based B1C/B2a joint tracking architecture for BDS-3 receivers. The non-coherent processing of the phase lock loop (PLL) proposed by Borio and Lachapelle (2009) is first used to design the B2a data channel tracking loop to extend the integration time and to avoid the limitation of the navigation symbol bits, while the pure PLL discriminator is used to extend the integration time of the B1C and B2a pilot channels. Then, a joint Kalman filter is explored to combine the B1C and B2a signals in detail.

The signal properties of the B1C and B2a signals are first reviewed, followed, by gives a detailed description of the design of an adaptive Kalman filter-based B1C/B2a joint tracking architecture for a BDS-3 dual-frequency receiver. We then address the field experiments conducted using live BDS-3 signals to evaluate the proposed architecture. Finally, conclusions and future work are provided.

B1C and B2a civil signal specifications

As shown in Table 1, the BOC(1, 1) and quadrature multiplexed binary offset carrier (6, 1, 4/33) (QMBOC(6, 1, 4/33)) modulations are used for the B1C data and pilot components, respectively. The received B1C signal to be processed by baseband functions of the receiver can be expressed as (Gao et al. 2019):

$$r_{{{\text{B1C}}}} = s_{{\text{d,n}}}^{{{\text{B1C}}}} { + }s_{{\text{p61,n}}}^{{{\text{B1C}}}} + j \cdot s_{{\text{p11,n}}}^{{{\text{B1C}}}} + \eta$$
(1)
Table 1 BeiDou B1C and B2a civil signal specifications

where \(s_{{\text{d,n}}}^{{{\text{B1C}}}}\) is the data component, \(s_{{\text{p61,n}}}^{{{\text{B1C}}}}\) and \(s_{{\text{p11,n}}}^{{{\text{B1C}}}}\) denote the BOC(6,1) and BOC(1,1) components of the pilot channel, respectively. \(\eta\) is the additive white Gaussian noise. The details of \(s_{{\text{d,n}}}^{{{\text{B1C}}}}\), \(s_{{\text{p61,n}}}^{{{\text{B1C}}}}\) and \(s_{{\text{p11,n}}}^{{{\text{B1C}}}}\) can be referred to Gao et al. (2019).

Also, a binary phase shift keying (10) (BPSK(10)) modulation is used for both B2a data and pilot components. The received B2a signal to be processed by baseband functions of the receiver is expressed as (Gao et al. 2019):

$$r_{{{\text{B2a}}}} = s_{{\text{d,n}}}^{{{\text{B2a}}}} { + }j \cdot s_{{\text{p,n}}}^{{{\text{B2a}}}} + \xi$$
(2)

where \(s_{{\text{d,n}}}^{{{\text{B2a}}}}\) is the data component, \(s_{{\text{p,n}}}^{{{\text{B2a}}}}\) is the pilot component and \(\xi\) is the additive white Gaussian noise. For details of \(s_{{\text{d,n}}}^{{{\text{B2a}}}}\) and \(s_{{\text{p,n}}}^{{{\text{B2a}}}}\) refer to Gao et al. (2019). It is noted that the two noise terms on B1C and B2a are statistically independent with different variances.

It can be seen that the B2a signal has a higher transmit power, lower carrier frequency and higher primary code frequency compared to the B1C signal. This makes the B2a signal have potentially stronger signal carrier-to-noise power spectral density ratio (C/N0), slower carrier Doppler dynamics and better signal tracking noises, especially for the code tracking accuracy. According to the interface control documents (ICDs) of B1C (CSNO 2017a) and B2a (CSNO 2017b), the ephemeris data of each satellite can be decoded from either B1C or B2a data channels. Again, the B1C data component has a much lower transmit power compared to other components of B1C and B2a. Therefore, as for the BDS-3 dual-frequency receiver, the B2a data channel is chosen here instead of the B1C data channel to receive the ephemeris data, and the B1C data channel can be ignored to reduce the complexity of the dual-frequency receiver and will not be discussed in the following sections.

Adaptive Kalman filter-based B1C/B2a joint tracking architecture

In order to achieve more mutual benefits between B1C and B2a signals and overcome the integration time limitation caused by the data channel, an adaptive Kalman filter-based B1C/B2a joint tracking loop (KF-JTL) is proposed in this research.

As shown in Fig. 1, the B1C and B2a signals are received by the antenna, digitized and down-converted by the radio frequency (RF) front-end board, and sent to the acquisition block. The signal acquisition is implemented with joint process of data and pilot components of B1C and B2a signals, respectively, to get the coarse code phase and Doppler estimation. At the beginning of the tracking, we use shorter integrated time to help the tracking loop finish the pull-in stage. The longer integrated time is used after the tracking loop becomes stable and keeps lock. The details of the acquisition block can be referred to Li et al. (2019).

Fig. 1
figure 1

Block diagram of the B1C/B2a KF-JTL. Non-coherent processing is applied to the B2a data channel and all B1C and B2a channels fuse into a joint Kalman filter

In the tracking loop, the B2a data channel is processed with non-coherent integrations as suggested by Borio and Lachapelle (2009), which can extend the integration time to avoid the limitation of the navigation symbol bits. Then, the KF-JTL fuses the data and pilot channels of B1C and B2a into a joint Kalman filter with the same but long integration time in order to explore the collaboration of B1C and B2a in the tracking loop. The details of the KF-JTL architecture are designed in the following subsections.

Dynamic system model of the KF-JTL architecture

As discussed above, the Doppler shift between B1C and B2a signals are correlated. Therefore, similar to Xie et al. (2017), the system state vector of the Kalman filter which includes both B1C and B2a state vectors is defined as:

$${\mathbf{X}} = \left[ {\delta \tau_{{{\text{B1C}}}} ,\;\delta \tau_{B2a} ,\;\delta \phi_{{\text{0,B1C}}} ,\;\delta \phi_{0,B2a} ,\;\delta f_{{\text{0,B2a}}} ,\;\delta a_{{{\text{B2a}}}} } \right]$$
(3)

where \(\delta \tau_{{{\text{B1C}}}}\) and \(\delta \tau_{B2a}\) are the code phase errors between the local replica code and the incoming signals for B1C and B2a, respectively. \(\delta \phi_{{\text{0,B1C}}}\) and \(\delta \phi_{0,B2a}\) indicate the initial phase errors of B1C and B2a, respectively, at the start of the integration interval. In addition, the frequency error and acceleration error of B2a signal are chosen as the common carrier Doppler frequency and acceleration error states for B1C and B2a signals due to their inherent relations in carrier Doppler frequency.

Then, the discrete system model for this implementation is written as follow (Kaplan and Hegarty 2017):

$${\mathbf{X}}_{{\text{k } + \text{ 1}}} = {{\varvec{\Phi}}}_{{\text{k}}} \cdot {\mathbf{X}}_{{\text{k}}} + {\mathbf{w}}_{{\text{k}}}$$
(4)

where \({\mathbf{w}}\) is the additive white Gaussian noise sequences which represent the process noises with covariance values of \({\mathbf{Q}}\). \({{\varvec{\Phi}}}_{{\text{k}}}\) is the state transition matrix which can be expressed as (Xie et al. 2017):

$${{\varvec{\Phi}}}_{{\text{k}}} { = }\left[ {\begin{array}{*{20}c} 1 & 0 & 0 & 0 & {\beta_{1} T} & 0 \\ 0 & 1 & 0 & 0 & {\beta_{2} T} & 0 \\ 0 & 0 & 1 & 0 & {\alpha T} & {{{\alpha T^{2} } \mathord{\left/ {\vphantom {{\alpha T^{2} } 2}} \right. \kern-\nulldelimiterspace} 2}} \\ 0 & 0 & 0 & 1 & T & {{{T^{2} } \mathord{\left/ {\vphantom {{T^{2} } 2}} \right. \kern-\nulldelimiterspace} 2}} \\ 0 & 0 & 0 & 0 & 1 & T \\ 0 & 0 & 0 & 0 & 0 & 1 \\ \end{array} } \right]$$
(5)

where \(\beta_{1} = {{f_{{\text{code,B1C}}} } \mathord{\left/ {\vphantom {{f_{{\text{code,B1C}}} } {f_{{{\text{B2a}}}} }}} \right. \kern-\nulldelimiterspace} {f_{{{\text{B2a}}}} }}\), \(\beta_{2} = {{f_{{\text{code,B2a}}} } \mathord{\left/ {\vphantom {{f_{{\text{code,B2a}}} } {f_{{{\text{B2a}}}} }}} \right. \kern-\nulldelimiterspace} {f_{{{\text{B2a}}}} }}\) and \(\alpha = {{f_{{{\text{B1C}}}} } \mathord{\left/ {\vphantom {{f_{{{\text{B1C}}}} } {f_{{{\text{B2a}}}} }}} \right. \kern-\nulldelimiterspace} {f_{{{\text{B2a}}}} }}\). Further, \(f_{{{\text{B1C}}}}\) and \(f_{{{\text{B2a}}}}\) are the nominalized carrier frequency for B1C and B2a signals, respectively, \(f_{{\text{ca,B1C}}}\) and \(f_{{\text{ca,B2a}}}\) are the nominalized code frequency for B1C and B2a signals, respectively, and \(T\) is the update rate of the KF, which is equal to the update interval of the loop denoted as \(T_{{{\text{loop}}}}\). In addition, the total integration time of all channels is denoted as \(T_{{\text{int}}}\). As for the B2a data channel, \(T_{{\text{int}}}\) equals to the max coherent integration time, i.e., 5 ms multiplied by the number of non-coherent integrations.

The noise associated with the dynamic model can be written as (Macchi 2010):

$${\mathbf{w}} = [w_{{\text{code,B1C}}} , \, w_{{\text{code,B2a}}} {, }w_{{{\text{clk}}}} , \, w_{{{\text{clk}}}} , \, w_{{{\text{freq}}}} , \, w_{{{\text{acc}}}} ]^{T}$$
(6)

where \(w_{{\text{code,B1C}}}\) and \(w_{{\text{code,B2a}}}\) are the ionospheric divergence effect, i.e., delay for the code and advance for the phase, for B1C and B2a signals, respectively. Further, \(w_{{{\text{clk}}}}\) and \(w_{{{\text{freq}}}}\) are the process noise of the clock bias and the clock drift caused by the oscillator, and \(w_{{{\text{acc}}}}\) is the process noise of the LOS acceleration noise which is related to the receiver’s dynamics.

Hence, the covariance matrix \({\mathbf{Q}}\) of \({\mathbf{w}}\) transformed in the discrete domain can be written as (Brown and Hwang 2011):

$$\begin{gathered} {\mathbf{Q}}_{{\text{k}}} = E\left[ {{\mathbf{w}}_{{\text{k}}} \cdot {\mathbf{w}}_{{\text{k}}}^{T} } \right] \hfill \\ \, = \left[ {\begin{array}{*{20}c} {S_{{{\text{c1}}}} T + \frac{{S_{{\text{d}}} \beta_{1}^{2} T^{3} }}{3}} & {\frac{{S_{{\text{d}}} \beta_{1} \beta_{2} T^{3} }}{3}} & {\frac{{S_{{\text{d}}} \alpha \beta_{1} T^{3} }}{3}} & {\frac{{S_{{\text{d}}} \beta_{1} T^{3} }}{3}} & {\frac{{S_{{\text{d}}} \beta_{1} T^{2} }}{2}} & 0 \\ {\frac{{S_{{\text{d}}} \beta_{1} \beta_{2} T^{3} }}{3}} & {S_{{{\text{c2}}}} T + \frac{{S_{{\text{d}}} \beta_{2}^{2} T^{3} }}{3}} & {\frac{{S_{{\text{d}}} \alpha \beta_{2} T^{3} }}{3}} & {\frac{{S_{{\text{d}}} \beta_{2} T^{3} }}{3}} & {\frac{{S_{{\text{d}}} \beta_{2} T^{2} }}{2}} & 0 \\ {\frac{{S_{{\text{d}}} \alpha \beta_{1} T^{3} }}{3}} & {\frac{{S_{{\text{d}}} \alpha \beta_{2} T^{3} }}{3}} & {S_{{{\text{b1}}}} T + \frac{{S_{{\text{d}}} \alpha^{2} T^{3} }}{3} + \frac{{S_{{\text{a}}} \alpha^{2} T^{5} }}{20}} & {\frac{{S_{{\text{d}}} \alpha T^{3} }}{3} + \frac{{S_{{\text{a}}} \alpha T^{5} }}{20}} & {\frac{{S_{{\text{d}}} \alpha T^{2} }}{2} + \frac{{S_{{\text{a}}} \alpha T^{4} }}{8}} & {\frac{{S_{{\text{a}}} \alpha T^{3} }}{6}} \\ {\frac{{S_{{\text{d}}} \beta_{1} T^{3} }}{3}} & {\frac{{S_{{\text{d}}} \beta_{2} T^{3} }}{3}} & {\frac{{S_{{\text{d}}} \alpha T^{3} }}{3} + \frac{{S_{{\text{a}}} \alpha T^{5} }}{20}} & {S_{{{\text{b2}}}} T + \frac{{S_{{\text{d}}} T^{3} }}{3} + \frac{{S_{{\text{a}}} T^{5} }}{20}} & {\frac{{S_{{\text{d}}} T^{2} }}{2} + \frac{{S_{{\text{a}}} T^{4} }}{8}} & {\frac{{S_{{\text{a}}} T^{3} }}{6}} \\ {\frac{{S_{{\text{d}}} \beta_{1} T^{2} }}{2}} & {\frac{{S_{{\text{d}}} \beta_{2} T^{2} }}{2}} & {\frac{{S_{{\text{d}}} \alpha T^{2} }}{2} + \frac{{S_{{\text{a}}} \alpha T^{4} }}{8}} & {\frac{{S_{{\text{d}}} T^{2} }}{2} + \frac{{S_{{\text{a}}} T^{4} }}{8}} & {S_{{\text{d}}} T + \frac{{S_{{\text{a}}} T^{3} }}{3}} & {\frac{{S_{{\text{a}}} T^{2} }}{2}} \\ 0 & 0 & {\frac{{S_{{\text{a}}} \alpha T^{3} }}{6}} & {\frac{{S_{{\text{a}}} T^{3} }}{6}} & {\frac{{S_{{\text{a}}} T^{2} }}{2}} & {S_{{\text{a}}} T} \\ \end{array} } \right] \hfill \\ \end{gathered}$$
(7)

where \(S_{{{\text{c1}}}}\) and \(S_{{{\text{c2}}}}\) correspond to the difference between the divergence of the ionospheric delay for the code and the phase over time for B1C and B2a signals, respectively. \(S_{{\text{b1}}}\) is the product of nominal B1C carrier frequency squared value \(f_{{{\text{B1C}}}}^{2}\) and the power spectral density (PSD) of \(w_{{{\text{clk}}}}\), \(S_{{\text{b2}}}\) is the product of nominal B2a carrier frequency squared value \(f_{{{\text{B2a}}}}^{2}\) and the PSD of \(w_{{{\text{clk}}}}\), \(S_{{\text{d}}}\) is the product of nominal B2a carrier frequency squared value \(f_{{{\text{B2a}}}}^{2}\) and the PSD of \(w_{{{\text{freq}}}}\), and \(S_{{\text{a}}}\) is the PSD of \(w_{{{\text{acc}}}}\). The products \(S_{{\text{b1}}}\), \(S_{{\text{b2}}}\) and \(S_{{\text{d}}}\) are calculated as follows (Brown and Hwang 2011):

$$\left\{ {\begin{array}{l} {S_{{{\text{b1}}}} = f_{{{\text{B1C}}}}^{2} \cdot h_{0} /2} \\ {S_{{{\text{b2}}}} = f_{{{\text{B2a}}}}^{2} \cdot h_{0} /2} \\ {S_{{\text{d}}} = f_{{{\text{B2a}}}}^{2} \cdot 2 \cdot \pi^{2} \cdot h_{ - 2} } \\ \end{array} } \right. \,$$
(8)

where \(h_{0}\) and \(h_{ - 2}\) are the oscillator \(h\)-parameters. The typical \(h\)-parameters of temperature compensated crystal oscillator (TCXO) and oven-controlled crystal oscillator (OCXO) are listed in Table 2 (Brown and Hwang 2011).

Table 2 Typical \(h\)-parameters of TCXO and OCXO

Measurement model of the KF-JTL architecture

As shown in Fig. 1, all the discriminator outputs are used as the measurement information of the Kalman filter. The measurement equation of the Kalman filter is modeled as (Kaplan and Hegarty 2017):

$${\mathbf{Z}}_{{\text{k}}} = {\mathbf{H}}_{{\text{k}}} \cdot {\mathbf{X}}_{{\text{k}}} + {{\varvec{\upnu}}}_{{\text{k}}}$$
(9)

where \({\mathbf{Z}}_{{\text{k}}}\) is the input measurement, \({\mathbf{H}}_{{\text{k}}}\) is the measurement matrix, \({{\varvec{\upnu}}}_{{\text{k}}}\) is the noise item in the input measurement. The details of the input measurement model are given below.

Measurement outputs of the B2a data channel

As shown in Fig. 2, the non-coherent integration processing of the JTL method suggested by Borio and Lachapelle (2009) is used here for the B2a data channel.

Fig. 2
figure 2

Non-coherent processing of the B2a data channel

The sampled B2a signal is first passed through a bank of correlators to produce I/Q correlator outputs for the data component. Then, the navigation symbol bits are removed by the squaring operation. After that, the bit removal results are accumulated and sent to the non-coherent carrier discriminator and the modified-normalized early-late magnitude (NELM) code discriminator to estimate the carrier phase error and code phase error, which can be described as follows (Borio and Lachapelle 2009):

$$\delta_{{{\text{d,}}\varphi }}^{{{\text{B2a}}}} = \frac{1}{2}ATAN2\left[ {2\sum\limits_{k = 0}^{K - 1} {I_{{\text{P,k}}} Q_{{\text{P,k}}} } \, , \, \sum\limits_{k = 0}^{K - 1} {\left( {I_{{\text{P,k}}}^{2} - Q_{{\text{P,k}}}^{2} } \right)} } \right]$$
(10)
$$\delta_{{{\text{d },\tau}}}^{{{\text{B2a}}}} = \left( {1 - \Delta } \right)\frac{{\sqrt {\sum\nolimits_{{{\text{k}} = 0}}^{K - 1} {\left| {E_{{\text{k}}} } \right|^{2} } } - \sqrt {\sum\nolimits_{{{\text{k}} = 0}}^{K - 1} {\left| {L_{{\text{k}}} } \right|^{2} } } }}{{\sqrt {\sum\nolimits_{{{\text{k}} = 0}}^{K - 1} {\left| {E_{{\text{k}}} } \right|^{2} } } + \sqrt {\sum\nolimits_{{{\text{k}} = 0}}^{K - 1} {\left| {L_{{\text{k}}} } \right|^{2} } } }}$$
(11)

where \(E_{{\text{k}}} = \sqrt {I_{{\text{E,k}}}^{2} + Q_{{\text{E,k}}}^{2} }\) and \(L_{{\text{k}}} = \sqrt {I_{{\text{L,k}}}^{2} + Q_{{\text{L,k}}}^{2} }\), IP, QP, IE, QE, IL and QL denote the correlator outputs of in-phase and quadra-phase prompt, early and late. \(\Delta\) is the code correlator spacing.

Measurement outputs of B2a and B1C pilot channels

Benefiting from the data-less characteristic, both pilot channels of B2a and B1C use the pure PLL discriminator after secondary code wipe-off to acquire better noise mitigation performance due to its absence of squaring loss and larger linearity region compared to Costas discriminator. The carrier phase error of B2a and B1C can be estimated using pure PLL discriminator as (Kaplan and Hegarty 2017):

$$\delta_{{{\text{p,}}\varphi }}^{{{\text{B2a}}}} \, or \, \delta_{{{\text{p,}}\varphi }}^{{{\text{B1C}}}} = ATAN2(Q_{{\text{P}}} ,I_{{\text{P}}} )$$
(12)

Also, the NELM code discriminator is used in B2a pilot channel to estimate the code tracking error (Kaplan and Hegarty 2017):

$$\delta_{{{\text{p},\tau}}}^{{{\text{B2a}}}}= \left( {1 - \Delta } \right) \cdot \frac{E - L}{{E + L}}$$
(13)

where \(E = \sqrt {I_{{\text{E}}}^{2} + Q_{{\text{E}}}^{2} }\) and \(L = \sqrt {I_{{\text{L}}}^{2} + Q_{{\text{L}}}^{2} }\).

As shown in Fig. 3, the mismatched tracking mode, also called narrowband (NB) tracking mode, is adopted for the B1C pilot channel, which ignores the wideband BOC(6,1) component, and only the BOC(1,1) component of B1C pilot component is tracked (Li et al. 2019; Gao et al. 2019).

Fig. 3
figure 3

Mismatched tracking of the B1C pilot channel

Also, in order to cancel the ambiguous problem of the code tracking, the autocorrelation side-peak cancelation technique (ASPeCT)-based dot-product (DP) discriminator proposed in Julien et al. (2007) for BOC signals is used for the B1C pilot channel. The code phase error of the B1C pilot channel can be obtained by:

$$\delta_{{{\text{p,}}\tau }}^{{{\text{B1C}}}} \left( \tau \right) = \frac{{\left( \begin{gathered} [\left( {I_{{{\text{E}}_{{\text{B}}} }} - I_{{{\text{L}}_{{\text{B}}} }} } \right) \cdot I_{{{\text{P}}_{{\text{B}}} }} + \left( {Q_{{{\text{E}}_{{\text{B}}} }} - Q_{{{\text{L}}_{{\text{B}}} }} } \right) \cdot Q_{{{\text{P}}_{{\text{B}}} }} ] \hfill \\ - \beta [\left( {I_{{{\text{E}}_{{\text{B/P}}} }} - I_{{{\text{L}}_{{\text{B/P}}} }} } \right) \cdot I_{{{\text{P}}_{{\text{B/P}}} }} + \left( {Q_{{{\text{E}}_{{\text{B/P}}} }} - Q_{{{\text{L}}_{{\text{B/P}}} }} } \right) \cdot Q_{{{\text{P}}_{{\text{B/P}}} }} ] \hfill \\ \end{gathered} \right)}}{{\left( {6 + \beta \cdot \Delta } \right) \cdot \left( {I_{{{\text{P}}_{{\text{B}}} }}^{2} + Q_{{{\text{P}}_{{\text{B}}} }}^{2} } \right)}}$$
(14)

where \(I_{{{\text{P}}_{{\text{B}}} }}\), \(Q_{{{\text{P}}_{{\text{B}}} }}\), \(I_{{{\text{E}}_{{\text{B}}} }}\), \(Q_{{{\text{E}}_{{\text{B}}} }}\), \(I_{{{\text{L}}_{{\text{B}}} }}\) and \(Q_{{{\text{L}}_{{\text{B}}} }}\) denote the correlator outputs of in-phase and quadra-phase prompt, early and late for BOC(1,1) in B1C pilot channel with spreading code (pseudo random noise (PRN) code \(\times\) square wave subcarrier). \(I_{{{\text{P}}_{{\text{B/P}}} }}\), \(Q_{{{\text{P}}_{{\text{B/P}}} }}\), \(I_{{{\text{E}}_{{\text{B/P}}} }}\), \(Q_{{{\text{E}}_{{\text{B/P}}} }}\), \(I_{{{\text{L}}_{{\text{B/P}}} }}\) and \(Q_{{{\text{L}}_{{\text{B/P}}} }}\) denote the correlator outputs of in-phase and quadra-phase prompt, early and late for BOC(1,1) in B1C pilot channel with PRN code only. \(\beta\) is a coefficient in the combination of the two squared correlation functions to eliminate any small remaining peak caused by the impact of the front-end filter. \(\Delta\) is the code correlator spacing.

Measurement model and adaptive measurement noise covariance

According to the measurements of B1C and B2a described above, in analogy with the model shown in Xie et al. (2017), the measurement model of the joint Kalman filter can be written as:

$${\mathbf{Z}}_{{\text{k}}} = \left[ {\delta_{{{\text{p},\tau}}}^{{{\text{B1C}}}} ;\delta_{{{\text{p,}}\varphi }}^{{{\text{B1C}}}} ;\delta_{{{\text{d },\tau}}}^{{{\text{B2a}}}} ;\delta_{{{\text{d,}}\varphi }}^{{{\text{B2a}}}} ;\delta_{{{\text{p},\tau}}}^{{{\text{B2a}}}};\delta_{{{\text{p,}}\varphi }}^{{{\text{B2a}}}} } \right]$$
(15)
$${\mathbf{H}}_{{\text{k}}} { = }\left[ {\begin{array}{*{20}c} 1 & 0 & 0 & 0 & {\beta_{1} {T \mathord{\left/ {\vphantom {T 2}} \right. \kern-\nulldelimiterspace} 2}} & 0 \\ 0 & 0 & 1 & 0 & {\alpha {T \mathord{\left/ {\vphantom {T 2}} \right. \kern-\nulldelimiterspace} 2}} & {\alpha {{T^{2} } \mathord{\left/ {\vphantom {{T^{2} } 6}} \right. \kern-\nulldelimiterspace} 6}} \\ 0 & 1 & 0 & 0 & {\beta_{2} {T \mathord{\left/ {\vphantom {T 2}} \right. \kern-\nulldelimiterspace} 2}} & 0 \\ 0 & 0 & 0 & 1 & {{T \mathord{\left/ {\vphantom {T 2}} \right. \kern-\nulldelimiterspace} 2}} & {{{T^{2} } \mathord{\left/ {\vphantom {{T^{2} } 6}} \right. \kern-\nulldelimiterspace} 6}} \\ 0 & 1 & 0 & 0 & {\beta_{2} {T \mathord{\left/ {\vphantom {T 2}} \right. \kern-\nulldelimiterspace} 2}} & 0 \\ 0 & 0 & 0 & 1 & {{T \mathord{\left/ {\vphantom {T 2}} \right. \kern-\nulldelimiterspace} 2}} & {{{T^{2} } \mathord{\left/ {\vphantom {{T^{2} } 6}} \right. \kern-\nulldelimiterspace} 6}} \\ \end{array} } \right]$$
(16)
$${\mathbf{R}}_{{\text{k}}} = \left[ {\begin{array}{*{20}c} {R_{{{\text{p},\tau}}}^{{{\text{B1C}}}} } & 0 & 0 & 0 & 0 & 0 \\ 0 & {R_{{{\text{p,}}\varphi }}^{{{\text{B1C}}}} } & 0 & 0 & 0 & 0 \\ 0 & 0 & {R_{{{\text{d },\tau}}}^{{{\text{B2a}}}} } & 0 & 0 & 0 \\ 0 & 0 & 0 & {R_{{{\text{d,}}\varphi }}^{{{\text{B2a}}}} } & 0 & 0 \\ 0 & 0 & 0 & 0 & {R_{{{\text{p,}\tau}}}^{{{\text{B2a}}}} } & 0 \\ 0 & 0 & 0 & 0 & 0 & {R_{{{\text{p,}}\varphi }}^{{{\text{B2a}}}} } \\ \end{array} } \right]$$
(17)

where \(\delta_{{{\text{p},\tau}}}^{{{\text{B1C}}}}\), \(\delta_{{{\text{d },\tau}}}^{{{\text{B2a}}}}\) and \(\delta_{{{\text{p},\tau}}}^{{{\text{B2a}}}}\) are the code phase discriminator of B1C pilot, B2a data and B2a pilot channels, respectively. Further, \(\delta_{{{\text{p,}}\varphi }}^{{{\text{B1C}}}}\), \(\delta_{{{\text{d,}}\varphi }}^{{{\text{B2a}}}}\) and \(\delta_{{{\text{p,}}\varphi }}^{{{\text{B2a}}}}\) are the carrier phase discriminator of the B1C pilot, B2a data and B2a pilot channels, respectively. The variables of \(R_{{{\text{p},\tau}}}^{{{\text{B1C}}}}\), \(R_{{{\text{p,}}\varphi }}^{{{\text{B1C}}}}\), \(R_{{{\text{d },\tau}}}^{{{\text{B2a}}}}\), \(R_{{{\text{d,}}\varphi }}^{{{\text{B2a}}}}\), \(R_{{{\text{p,}\tau}}}^{{{\text{B2a}}}}\) and \(R_{{{\text{p,}}\varphi }}^{{{\text{B2a}}}}\) are co-variances of \(\delta_{{{\text{p},\tau}}}^{{{\text{B1C}}}}\), \(\delta_{{{\text{p,}}\varphi }}^{{{\text{B1C}}}}\), \(\delta_{{{\text{d },\tau}}}^{{{\text{B2a}}}}\), \(\delta_{{{\text{d,}}\varphi }}^{{{\text{B2a}}}}\), \(\delta_{{{\text{p},\tau}}}^{{{\text{B2a}}}}\) and \(\delta_{{{\text{p,}}\varphi }}^{{{\text{B2a}}}}\), respectively, which can be calculated directly by:

$$R_{{\text{ii,k}}} = \sigma_{{\text{ii,k}}}^{2} = \frac{1}{{N_{{\text{w}}} }}\sum\limits_{n}^{{N_{{\text{w}}} }} {\left( {\delta_{{\text{k } - \text{ n}}} - \overline{\delta }_{{\text{k}}} } \right)^{2} }$$
(18)

where \(\delta_{{\text{k}}}\) denotes the discriminator output, \(\sigma_{{\text{ii,k}}}^{2}\) is the co-covariance, \(N_{{\text{w}}}\) is the estimator window length, and \(\overline{\delta }_{{\text{k}}}\) is the average value of the \(\delta_{{\text{k}}}\).

By using (18), the measurement noise covariance of the Kalman filter is calculated according to the signal qualification to get best measurement weights, especially to reduce and even block the attenuated signals.

NCO feedback and sliding average window

The numerically controlled oscillator (NCO) feedback values of B1C and B2a can be calculated as follows:

$$\left\{ \begin{gathered} {\text{NCO}}_{{f_{{{\text{IF}}}} }}^{{{\text{B1C}}}} = \alpha \cdot \delta f_{{\text{0,B2a}}} + \alpha \cdot \delta a_{{{\text{B2a}}}} \cdot T \hfill \\ {\text{NCO}}_{\phi }^{{{\text{B1C}}}} = \delta \phi_{{\text{0,B1C}}} + \alpha \cdot \delta f_{{\text{0,B2a}}} \cdot T + \frac{1}{2} \cdot \alpha \cdot \delta a_{{{\text{B2a}}}} \cdot T^{2} \hfill \\ {\text{NCO}}_{{f_{{{\text{code}}}} }}^{{{\text{B1C}}}} = \beta_{1} \cdot NCO_{{f_{{{\text{IF}}}} }}^{{{\text{B2a}}}} \hfill \\ {\text{NCO}}_{\tau }^{{{\text{B1C}}}} = \delta \tau_{{{\text{B1C}}}} \hfill \\ \end{gathered} \right.$$
(19)
$$\left\{ \begin{gathered} {\text{NCO}}_{{f_{{{\text{IF}}}} }}^{{{\text{B2a}}}} = \delta f_{{\text{0,B2a}}} + \delta a_{{{\text{B2a}}}} \cdot T \hfill \\ {\text{NCO}}_{\phi }^{{{\text{B2a}}}} = \delta \phi_{{\text{0,B2a}}} + \delta f_{{\text{0,B2a}}} \cdot T + \frac{1}{2} \cdot \delta a_{{{\text{B2a}}}} \cdot T^{2} \hfill \\ {\text{NCO}}_{{f_{{{\text{code}}}} }}^{{{\text{B2a}}}} = \beta_{2} \cdot NCO_{{f_{{{\text{IF}}}} }}^{{{\text{B2a}}}} \hfill \\ {\text{NCO}}_{\tau }^{{{\text{B2a}}}} = \delta \tau_{{{\text{B2a}}}} \hfill \\ \end{gathered} \right.$$
(20)

where \({\text{NCO}}_{{f_{{{\text{IF}}}} }}^{{{\text{B2a}}}}\) and \({\text{NCO}}_{\phi }^{{{\text{B2a}}}}\) are the NCO values of B2a’s carrier frequency and carrier phase, respectively, \({\text{NCO}}_{{f_{{{\text{code}}}} }}^{{{\text{B2a}}}}\) and \({\text{NCO}}_{\tau }^{{{\text{B2a}}}}\) are the NCO values of B2a’s code frequency and code phase, respectively, \({\text{NCO}}_{{f_{{{\text{IF}}}} }}^{{{\text{B1C}}}}\) and \({\text{NCO}}_{\phi }^{{{\text{B1C}}}}\) are the NCO values of B1C’s carrier frequency and carrier phase, respectively, and \({\text{NCO}}_{{f_{{{\text{code}}}} }}^{{{\text{B1C}}}}\) and \({\text{NCO}}_{\tau }^{{{\text{B1C}}}}\) are the NCO values of B1C’s code frequency and code phase, respectively.

In addition, as discussed before, the total integration time of B1C pilot, B2a pilot, and data channels can be chosen to be the same and long time to improve the tracking sensitivity, especially for attenuated signals. But a longer integration time will reduce the update interval of the loop and increase the latency of the estimation, which would further reduce the dynamic and robustness of the loop. Therefore, a sliding average window is introduced to increase the update rate of the loop while keep the integration time of the loop (Borio and Lachapelle 2009; Borio et al. 2009). The diagram of the sliding average window is shown in Fig. 4.

Fig. 4
figure 4

Diagram of the sliding average window

As shown in Fig. 4, \(T_{{\text{int}}}\) is the total integration time of all channels, and \(T_{{{\text{loop}}}}\) is the update interval of the loop. At \(T_{k}\) time, the correlator outputs or their squaring values from \(T_{k} - T_{{\text{int}}}\) to \(T_{k}\) will be used as the discriminators’ inputs so as to generate the measurements of the joint Kalman filter. The NCOs will be updated in the following with the update interval of \(T_{{{\text{loop}}}}\) and wait for the next time \(T_{k + 1}\) to be updated again, namely \(T_{k + 1} = T_{k} + T_{{{\text{loop}}}}\). This means that the measurements of the Kalman filter are generated with the correlator outputs or their squaring values and the length is always \(T_{{\text{int}}}\), i.e., the sliding average window length. Meanwhile, the loop updates with a relatively faster interval of \(T_{{{\text{loop}}}}\), i.e., the window’s sliding step.

Results and discussions

Static and dynamic field experiments were conducted at Harbin Engineering University (HEU), China. As shown in Fig. 5, the BDS-3 signals of the static experiment were collected by a NUT4NT (Amungo 2017) RF front-end board on the roof of the #16 building at HEU on December 19, 2018, while the BDS-3 signals of the dynamic vehicle experiment were also received by the NUT4NT at HEU campus on December 22, 2018. Also, the NovAtel SPAN-CPT navigation system is used as a reference system. The detailed configurations of the NUT4NT are shown in Table 3.

Fig. 5
figure 5

Open-sky station of the static experiment (left) and the experiment platform of the dynamic vehicle experiment (right)

Table 3 Configurations of the NUT4NT RF front-end

Static test results and discussions

Figure 6 shows the sky plot of the BDS-3 satellites and the C/N0 values of PRN 23 in the static experiment. All C/N0 values of B1C and B2a channels are of good quality.

Fig. 6
figure 6

Sky plot of the BDS-3 satellites (left) and the C/N0 values of PRN 23 (right) of the static experiment

Table 4 shows the details of the bandwidths (BWs) for OLC-STL and OLC-DATL methods in the static test. Also, the \(T_{{\text{int}}}\) is set as 50 ms and the \(T_{{{\text{loop}}}}\) is set as 20 ms for both B1C and B2a’s tracking loop for all methods.

Table 4 The detail BWs of OLC-STL and OLC-DATL

Weak signal condition test

As shown in Fig. 7, an additive white Gaussian noise (AWGN) with progressively increasing power was artificially added using Matlab to the open-sky field static data to further explore the weak signal tracking performance of the proposed algorithm. In this case, the signal C/N0 of the field static data is reduced after 2 s of the start of the experiment by a step value of about 2 dB-Hz/s. PRN 23 is chosen as an example here to analyze the performance.

Fig. 7
figure 7

Block diagram of the AWGN noise with progressively increasing variance added to the open-sky field static data

Figure 8 shows the range rate and C/N0 values of PRN 23 for the B2a signal using different tracking strategies. Compared to the traditional B2a data channel with maximum integration time 5 ms, denoted as (pure data, 5 ms), the B2a data channel with the non-coherent processing method, denoted as (pure data, 50 ms), can extend the total integration time to 50 ms and improve the tracking sensitivity by about 5.97 dB-Hz and reach closely to the performance of the B2a pilot channel using the pure PLL, denoted as (pure pilot, 50 ms). Finally, the B2a data and pilot channels’ linear combination denoted as (pilot + data, 50 ms) with the non-coherent processing method used in the B2a data channel can get the best tracking sensitivity up to 14.42 dB-Hz. The non-coherent processing method is proven to help extend the integration time and improve the tracking sensitivity, so the B2a data channel in OLC-STL and OLC-DATL is modified hereinafter with the non-coherent processing in order to provide a fair comparison with the proposed KF-JTL.

Fig. 8
figure 8

Range rate and C/N0 values of PRN 23 for B2a signal only under the continuously stronger AWGN noise

Figure 9 shows the range rate and C/N0 values of PRN 23 for B1C and B2a signals using different tracking methods. The carrier loop tracking C/N0 threshold statistics of PRN 23 for B1C and B2a signals using different methods are summarized in Table 5.

Fig. 9
figure 9

Range rate and C/N0 values of PRN 23 for B1C and B2a under the continuously stronger AWGN noise

Table 5 Carrier loop tracking C/N0 thresholds of PRN 23

It can be seen that the OLC-DATL gets a better tracking sensitivity for B1C signal than the OLC-STL method due to the Doppler aiding information from the B2a tracking loop. But the B1C loop is still limited by the B2a tracking performance and is lost immediately when the B2a loop looses lock. However, in the KF-JTL method, both the B1C and B2a tracking sensitivity are improved distinctly, and the tracking errors of the KF-JTL method are much lower than other methods, especially when the C/N0 decreases. The results indicate that the KF-JTL can fuse B1C and B2a tracking information together and achieve better tracking sensitivity and robustness compared to OLC-STL and OLC-DATL methods.

Selective frequency signal attenuation test

As shown in Fig. 10, in this test, either B1C signal or B2a signal is deeply attenuated in a selective frequency way. This is performed by adding considerable Matlab AWGN noise suddenly to the open-sky field static data. This causes sudden C/N0 drops in different periods of the test before signal recovery.

Fig. 10
figure 10

Block diagram of the selective frequency signal with sudden attenuation with AWGN noise added to the open-sky field static data

As shown in Fig. 11, the B1C and B2a signals are deeply attenuated during the period 3–8 s and 13–18 s, respectively. Also, the C/N0 values of both B1C and B2a signals are attenuated by at least 34 dB during the attenuation period.

Fig. 11
figure 11

Range rate (left) and Doppler error values (right) of PRN 23 for B1C and B2a under the selective frequency signal attenuation test using OLC-STL (top), OLC-DATL (middle) and KF-JTL (bottom) methods

In the top panel of Fig. 11, the B1C loop looses lock in the OLC-STL method when the B1C signal attenuation occurs, and the B2a Doppler errors increase vastly during B2a signal attenuation. In the middle panel, the B1C loop keeps lock with the aiding of the B2a signal, although the B1C Doppler values are noisier than the un-attenuated signal during B1C signal attenuation. However, both B1C and B2a Doppler errors increase vastly during B2a signal attenuation. In the bottom panel, the Doppler values of B1C and B2a fluctuate slightly at the beginning of their attenuation, but the tracking loops recover rapidly and keep tracking with much smaller noise compared to the traditional methods.

The results indicate that the proposed KF-JTL gets the mutual benefit of B1C and B2a signals and improves the receiver’s resistance to selective frequency signal attenuation in either L1 band or L5 band.

Dynamic vehicle test results and discussions

As shown in Fig. 12, the vehicle starts from an open-sky location and then enters a foliage and residential environment. There are 6 visible satellites in the sky plot.

Fig. 12
figure 12

Trajectory (left) and the sky plot of the BDS-3 satellites (right) in the dynamic vehicle experiment

Table 6 provides the BWs for OLC-STL and OLC-DATL methods in the dynamic experiment. Also, the \(T_{{\text{int}}}\) is set as 30 ms and the \(T_{{{\text{loop}}}}\) is set as 5 ms for all methods.

Table 6 Detail BWs of OLC-STL and OLC-DATL

Figure 13 shows C/N0 values of B1C and B2a during the dynamic experiment using different methods. In the top panel, the B2a signal achieves better tracking robustness with the OLC-STL method compared to B1C, while the B1C signal gets better tracking by the aiding of the B2a signal using the OLC-DATL method as shown in the middle panel. In the bottom panel, the KF-JTL achieves the best C/N0 values compared to OLC-STL and OLC-DATL, especially for PRN 29 and 35, which can keep tracking until the end of the dynamic experiment.

Fig. 13
figure 13

C/N0 values of B1C and B2a signals during the dynamic experiment using OLC-STL (top), OLC-DATL (middle) and KF-JTL (bottom) methods

Figure 14 shows carrier and code Doppler values of B1C and B2a using different methods for PRN 35. The B2a signals achieve better tracking robustness performance compared to B1C signals in both OLC-STL and OLC-DATL methods, while the B1C tracking accuracy gets better by the aiding of the B2a signal in the OLC-DATL method, especially for the code Doppler. Compared to OLC-STL and OLC-DATL methods, the KF-JTL method gets the best tracking performance, especially for the lower C/N0 signals during the period of 75–100 s, which indicates that the KF-JTL achieves the best tracking accuracy and robustness performance, especially in the challenging environment.

Fig. 14
figure 14

Carrier Doppler (top) and code Doppler (bottom) values of B1C (left) and B2a (right) for PRN 35 during the dynamic experiment

Table 7 gives the statistics of the number of times loss of locks occurred for all satellites. The instances of loss of B1C or B2a carrier loop lock are counted from the beginning of the experiment. The total tracking time is 100 s, and N/A indicates that the satellite keeps lock until the end of the test.

Table 7 Statistics of the time of loss of locks for all satellites

Figure 15 shows the numbers of satellites generating measurements during the dynamic experiment. The start time is BDS time 523,170.1 s, and the total number of PRNs at the beginning is 6. When the vehicle enters the foliage and residential area, the number of available satellites in the OLC-STL method gradually decreases and becomes less than 4 satellites at about 66.3 s. The number of available satellites in the OLC-DATL method is less than 4 at about 79.8 s, while the proposed KF-JTL keeps at least 4 satellites most of the time.

Fig. 15
figure 15

Number of satellites generating measurements during the dynamic experiment

The position and velocity errors using different methods are shown in Figs. 16 and 17, respectively. It can be seen that during the first 66.3 s which is with relatively good propagation conditions, the KF-JTL method gets smaller position and velocity errors compared to the OLC-STL and OLC-DATL methods. After 66.3 s, the number of satellites in the OLC-STL method is lower than 4 satellites; hence, no navigation solutions are generated. The navigation errors increase vastly, and the navigation solutions are outputted until about 79.8 s, in the OLC-DATL method. However, the KF-JTL method can work until the end of the test with a relatively slight increasing error compared to OLC-DATL.

Fig. 16
figure 16

Position errors of the dynamic vehicle experiment

Fig. 17
figure 17

Velocity errors of the dynamic vehicle experiment

The navigation error statistics shown in Table 8 indicate that the KF-JTL method reduces the position errors about 24%, 1% and 36% compared to the OLC-STL method, 7%, 0% and 28% compared to the OLC-DATL method, and reduces the velocity errors about 46%, 52% and 53% (OLC-STL method), 46%, 50% and 53% (OLC-DATL method) in east, north and up directions, respectively, during the first 66.3 s. During 66.4–86 s, which covers the severe foliage and residential area, the KF-JTL method reduces the position errors about 94%, 74% and 96% and velocity errors around 84%, 70% and 86% compared to the OLC-DATL method in east, north and up directions, respectively.

Table 8 RMS position and velocity error statistics

The dynamic vehicle experiment results dedicate that the proposed KF-JTL method achieves an optimal availability, accuracy and robustness performance in both tracking and navigation compared to traditional OLC-STL and OLC-DATL methods.

Conclusions and future work

An adaptive Kalman filter-based B1C/B2a joint tracking architecture (KF-JTL) for the BDS-3 dual-frequency receiver is proposed to improve the tracking sensitivity and robustness, especially in challenging environments. The proposed KF-JTL uses a non-coherent processing architecture to extend the integration time for B2a data channel to avoid the limitation of the navigation symbol bits and compensates the difference of the tracking sensitivity between B2a data and pilot channels. A joint Kalman filter has been equipped with common carrier Doppler frequency and acceleration error states to fuse signals of B1C pilot channel and the B2a data/pilot channels using longer integration time, adaptive measurement noise covariance and a sliding average window to get the mutual benefit between these two signals. The field experiment results show that, compared to the modified traditional OLC-STL and OLC-DATL architectures, the proposed KF-JTL can achieve optimal availability, accuracy and robustness performance in both tracking and navigation solutions.

In the future, more field experiments should be conducted given the rapid development of the BDS-3 system. Also, some other non-coherent processing technologies such as the power difference (PD) non-coherent discriminator can be used in the Kalman filter-based B1C/ B2a joint tracking architecture to further extend the tracking performance, especially in dense fading environments.