1
0
mirror of https://github.com/gnss-sdr/gnss-sdr synced 2025-09-13 00:06:02 +00:00

Changed DPE to use cosine local replica

Previously used a BOC local replica (square wave). This approach gives
a marginal gain of ~ 0.7 dB in C/N0
This commit is contained in:
Cillian O'Driscoll
2015-11-20 21:13:42 +00:00
parent 1b0dadd91f
commit 5b8cc60540

View File

@@ -500,15 +500,8 @@ void galileo_e1_prs_de_tracking_cc::update_local_code_prs()
int64_t prompt_code_phase_fxp = double_to_fxpt64( tcode_chips );
int64_t late_code_phase_fxp = double_to_fxpt64( tcode_chips - d_early_late_code_spc_chips);
int64_t early_subcarrier_phase_fxp = double_to_fxpt64(
tsubcarrier_phase_halfcyles + early_late_subcarrier_spc_halfcycles );
int64_t prompt_subcarrier_phase_fxp = double_to_fxpt64(
tsubcarrier_phase_halfcyles );
int64_t late_subcarrier_phase_fxp = double_to_fxpt64(
tsubcarrier_phase_halfcyles - early_late_subcarrier_spc_halfcycles );
int64_t code_phase_step_fxp = double_to_fxpt64( code_phase_step_chips );
int64_t subcarrier_phase_step_fxp = double_to_fxpt64( subcarrier_phase_step_halfcycles );
for (int i = 0; i < d_current_prn_length_samples; i++)
{
@@ -516,20 +509,51 @@ void galileo_e1_prs_de_tracking_cc::update_local_code_prs()
d_prompt_code_prs[i] = d_prs_code[ (prompt_code_phase_fxp >> 32 )];
d_late_code_prs[i] = d_prs_code[ (late_code_phase_fxp >> 32 )];
d_early_subcarrier_prs[i] = (1.0 - 2.0*( (early_subcarrier_phase_fxp>>32)&0x01 ) );
d_prompt_subcarrier_prs[i] = (1.0 - 2.0*( (prompt_subcarrier_phase_fxp>>32)&0x01 ) );
d_late_subcarrier_prs[i] = (1.0 - 2.0*( (late_subcarrier_phase_fxp>>32)&0x01 ) );
early_code_phase_fxp += code_phase_step_fxp;
prompt_code_phase_fxp += code_phase_step_fxp;
late_code_phase_fxp += code_phase_step_fxp;
early_subcarrier_phase_fxp += subcarrier_phase_step_fxp;
prompt_subcarrier_phase_fxp += subcarrier_phase_step_fxp;
late_subcarrier_phase_fxp += subcarrier_phase_step_fxp;
}
if( d_prs_sinusoidal_subcarrier )
{
float phase_step_rad = subcarrier_phase_step_halfcycles * M_PI;
float phase_rad = tsubcarrier_phase_halfcyles * M_PI;
int phase_step_rad_i = gr::fxpt::float_to_fixed(phase_step_rad);
int phase_rad_i = gr::fxpt::float_to_fixed(phase_rad);
float sin_f, cos_f;
for(int i = 0; i < d_current_prn_length_samples; i++)
{
gr::fxpt::sincos(phase_rad_i, &sin_f, &cos_f);
d_prompt_subcarrier_prs[i] = std::complex<float>(cos_f, 0.0);
d_early_subcarrier_prs[i] = std::complex<float>(sin_f, 0.0);
phase_rad_i += phase_step_rad_i;
}
}
else
{
int64_t early_subcarrier_phase_fxp = double_to_fxpt64(
tsubcarrier_phase_halfcyles + early_late_subcarrier_spc_halfcycles );
int64_t prompt_subcarrier_phase_fxp = double_to_fxpt64(
tsubcarrier_phase_halfcyles );
int64_t late_subcarrier_phase_fxp = double_to_fxpt64(
tsubcarrier_phase_halfcyles - early_late_subcarrier_spc_halfcycles );
int64_t subcarrier_phase_step_fxp = double_to_fxpt64( subcarrier_phase_step_halfcycles );
for (int i = 0; i < d_current_prn_length_samples; i++)
{
d_early_subcarrier_prs[i] = (1.0 - 2.0*( (early_subcarrier_phase_fxp>>32)&0x01 ) );
d_prompt_subcarrier_prs[i] = (1.0 - 2.0*( (prompt_subcarrier_phase_fxp>>32)&0x01 ) );
d_late_subcarrier_prs[i] = (1.0 - 2.0*( (late_subcarrier_phase_fxp>>32)&0x01 ) );
early_subcarrier_phase_fxp += subcarrier_phase_step_fxp;
prompt_subcarrier_phase_fxp += subcarrier_phase_step_fxp;
late_subcarrier_phase_fxp += subcarrier_phase_step_fxp;
}
}
// Check for propagation:
//double code_phase_at_end = d_code_phase_chips_prs + d_current_prn_length_samples*code_phase_step_chips;