sources: provide frequency SD to reference update

This commit is contained in:
Miroslav Lichvar 2018-08-17 08:34:14 +02:00
parent cca2ef4649
commit ca73e34f30
3 changed files with 17 additions and 11 deletions

View file

@ -947,6 +947,7 @@ REF_SetReference(int stratum,
double offset, double offset,
double offset_sd, double offset_sd,
double frequency, double frequency,
double frequency_sd,
double skew, double skew,
double root_delay, double root_delay,
double root_dispersion double root_dispersion
@ -1146,7 +1147,7 @@ REF_SetManualReference
only supposed to be used with the local source option, really. only supposed to be used with the local source option, really.
Log as MANU in the tracking log, packets will have NTP_REFID_LOCAL. */ Log as MANU in the tracking log, packets will have NTP_REFID_LOCAL. */
REF_SetReference(0, LEAP_Unsynchronised, 1, 0x4D414E55UL, NULL, REF_SetReference(0, LEAP_Unsynchronised, 1, 0x4D414E55UL, NULL,
ref_time, offset, 0.0, frequency, skew, 0.0, 0.0); ref_time, offset, 0.0, frequency, skew, skew, 0.0, 0.0);
} }
/* ================================================== */ /* ================================================== */

View file

@ -144,6 +144,7 @@ extern void REF_SetReference
double offset, double offset,
double offset_sd, double offset_sd,
double frequency, double frequency,
double frequency_sd,
double skew, double skew,
double root_delay, double root_delay,
double root_dispersion double root_dispersion

View file

@ -496,20 +496,21 @@ mark_ok_sources(SRC_Status status)
static int static int
combine_sources(int n_sel_sources, struct timespec *ref_time, double *offset, combine_sources(int n_sel_sources, struct timespec *ref_time, double *offset,
double *offset_sd, double *frequency, double *skew) double *offset_sd, double *frequency, double *frequency_sd, double *skew)
{ {
struct timespec src_ref_time; struct timespec src_ref_time;
double src_offset, src_offset_sd, src_frequency, src_frequency_sd, src_skew; double src_offset, src_offset_sd, src_frequency, src_frequency_sd, src_skew;
double src_root_delay, src_root_dispersion, sel_src_distance, elapsed; double src_root_delay, src_root_dispersion, sel_src_distance, elapsed;
double offset_weight, sum_offset_weight, sum_offset, sum2_offset_sd; double offset_weight, sum_offset_weight, sum_offset, sum2_offset_sd;
double frequency_weight, sum_frequency_weight, sum_frequency, inv_sum2_skew; double frequency_weight, sum_frequency_weight, sum_frequency;
double inv_sum2_frequency_sd, inv_sum2_skew;
int i, index, combined; int i, index, combined;
if (n_sel_sources == 1) if (n_sel_sources == 1)
return 1; return 1;
sum_offset_weight = sum_offset = sum2_offset_sd = 0.0; sum_offset_weight = sum_offset = sum2_offset_sd = 0.0;
sum_frequency_weight = sum_frequency = inv_sum2_skew = 0.0; sum_frequency_weight = sum_frequency = inv_sum2_frequency_sd = inv_sum2_skew = 0.0;
sel_src_distance = sources[selected_source_index]->sel_info.root_distance; sel_src_distance = sources[selected_source_index]->sel_info.root_distance;
if (sources[selected_source_index]->type == SRC_NTP) if (sources[selected_source_index]->type == SRC_NTP)
@ -550,8 +551,9 @@ combine_sources(int n_sel_sources, struct timespec *ref_time, double *offset,
offset_weight = 1.0 / sources[index]->sel_info.root_distance; offset_weight = 1.0 / sources[index]->sel_info.root_distance;
frequency_weight = 1.0 / src_skew; frequency_weight = 1.0 / src_skew;
DEBUG_LOG("combining index=%d oweight=%e offset=%e sd=%e fweight=%e freq=%e skew=%e", DEBUG_LOG("combining index=%d oweight=%e offset=%e osd=%e fweight=%e freq=%e fsd=%e skew=%e",
index, offset_weight, src_offset, src_offset_sd, frequency_weight, src_frequency, src_skew); index, offset_weight, src_offset, src_offset_sd,
frequency_weight, src_frequency, src_frequency_sd, src_skew);
sum_offset_weight += offset_weight; sum_offset_weight += offset_weight;
sum_offset += offset_weight * src_offset; sum_offset += offset_weight * src_offset;
@ -560,6 +562,7 @@ combine_sources(int n_sel_sources, struct timespec *ref_time, double *offset,
sum_frequency_weight += frequency_weight; sum_frequency_weight += frequency_weight;
sum_frequency += frequency_weight * src_frequency; sum_frequency += frequency_weight * src_frequency;
inv_sum2_frequency_sd += 1.0 / (src_frequency_sd * src_frequency_sd);
inv_sum2_skew += 1.0 / (src_skew * src_skew); inv_sum2_skew += 1.0 / (src_skew * src_skew);
combined++; combined++;
@ -569,10 +572,11 @@ combine_sources(int n_sel_sources, struct timespec *ref_time, double *offset,
*offset = sum_offset / sum_offset_weight; *offset = sum_offset / sum_offset_weight;
*offset_sd = sqrt(sum2_offset_sd / sum_offset_weight); *offset_sd = sqrt(sum2_offset_sd / sum_offset_weight);
*frequency = sum_frequency / sum_frequency_weight; *frequency = sum_frequency / sum_frequency_weight;
*frequency_sd = 1.0 / sqrt(inv_sum2_frequency_sd);
*skew = 1.0 / sqrt(inv_sum2_skew); *skew = 1.0 / sqrt(inv_sum2_skew);
DEBUG_LOG("combined result offset=%e sd=%e freq=%e skew=%e", DEBUG_LOG("combined result offset=%e osd=%e freq=%e fsd=%e skew=%e",
*offset, *offset_sd, *frequency, *skew); *offset, *offset_sd, *frequency, *frequency_sd, *skew);
return combined; return combined;
} }
@ -1065,15 +1069,15 @@ SRC_SelectSource(SRC_Instance updated_inst)
&src_frequency, &src_frequency_sd, &src_skew, &src_frequency, &src_frequency_sd, &src_skew,
&src_root_delay, &src_root_dispersion); &src_root_delay, &src_root_dispersion);
combined = combine_sources(n_sel_sources, &ref_time, &src_offset, combined = combine_sources(n_sel_sources, &ref_time, &src_offset, &src_offset_sd,
&src_offset_sd, &src_frequency, &src_skew); &src_frequency, &src_frequency_sd, &src_skew);
REF_SetReference(sources[selected_source_index]->sel_info.stratum, REF_SetReference(sources[selected_source_index]->sel_info.stratum,
leap_status, combined, leap_status, combined,
sources[selected_source_index]->ref_id, sources[selected_source_index]->ref_id,
sources[selected_source_index]->ip_addr, sources[selected_source_index]->ip_addr,
&ref_time, src_offset, src_offset_sd, &ref_time, src_offset, src_offset_sd,
src_frequency, src_skew, src_frequency, src_frequency_sd, src_skew,
src_root_delay, src_root_dispersion); src_root_delay, src_root_dispersion);
} }