From cca2ef46498bf69ebf48c4bd36e6f41c26e4c62f Mon Sep 17 00:00:00 2001 From: Miroslav Lichvar Date: Fri, 17 Aug 2018 08:01:03 +0200 Subject: [PATCH] sourcestats: provide frequency SD in tracking data --- sources.c | 8 ++++---- sourcestats.c | 7 ++++++- sourcestats.h | 2 +- 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/sources.c b/sources.c index a517856..b5e7897 100644 --- a/sources.c +++ b/sources.c @@ -499,7 +499,7 @@ combine_sources(int n_sel_sources, struct timespec *ref_time, double *offset, double *offset_sd, double *frequency, double *skew) { struct timespec src_ref_time; - double src_offset, src_offset_sd, src_frequency, 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 offset_weight, sum_offset_weight, sum_offset, sum2_offset_sd; double frequency_weight, sum_frequency_weight, sum_frequency, inv_sum2_skew; @@ -519,7 +519,7 @@ combine_sources(int n_sel_sources, struct timespec *ref_time, double *offset, index = sel_sources[i]; SST_GetTrackingData(sources[index]->stats, &src_ref_time, &src_offset, &src_offset_sd, - &src_frequency, &src_skew, + &src_frequency, &src_frequency_sd, &src_skew, &src_root_delay, &src_root_dispersion); /* Don't include this source if its distance is longer than the distance of @@ -591,7 +591,7 @@ SRC_SelectSource(SRC_Instance updated_inst) int depth, best_depth, trust_depth, best_trust_depth; int combined, stratum, min_stratum, max_score_index; int orphan_stratum, orphan_source, leap_votes, leap_ins, leap_del; - double src_offset, src_offset_sd, src_frequency, src_skew; + double src_offset, src_offset_sd, src_frequency, src_frequency_sd, src_skew; double src_root_delay, src_root_dispersion; double best_lo, best_hi, distance, sel_src_distance, max_score; double first_sample_ago, max_reach_sample_ago; @@ -1062,7 +1062,7 @@ SRC_SelectSource(SRC_Instance updated_inst) SST_GetTrackingData(sources[selected_source_index]->stats, &ref_time, &src_offset, &src_offset_sd, - &src_frequency, &src_skew, + &src_frequency, &src_frequency_sd, &src_skew, &src_root_delay, &src_root_dispersion); combined = combine_sources(n_sel_sources, &ref_time, &src_offset, diff --git a/sourcestats.c b/sourcestats.c index e4a08d3..e13012a 100644 --- a/sourcestats.c +++ b/sourcestats.c @@ -132,6 +132,7 @@ struct SST_Stats_Record { source per unit local time. (Positive => local clock fast, negative => local clock slow) */ double estimated_frequency; + double estimated_frequency_sd; /* This is the assumed worst case bounds on the estimated frequency. We assume that the true frequency lies within +/- half this much @@ -245,6 +246,7 @@ SST_ResetInstance(SST_Stats inst) inst->best_single_sample = 0; inst->min_delay_sample = 0; inst->estimated_frequency = 0; + inst->estimated_frequency_sd = WORST_CASE_FREQ_BOUND; inst->skew = WORST_CASE_FREQ_BOUND; inst->estimated_offset = 0.0; inst->estimated_offset_sd = 86400.0; /* Assume it's at least within a day! */ @@ -571,6 +573,7 @@ SST_DoNewRegression(SST_Stats inst) old_freq = inst->estimated_frequency; inst->estimated_frequency = est_slope; + inst->estimated_frequency_sd = CLAMP(MIN_SKEW, est_slope_sd, MAX_SKEW); inst->skew = est_slope_sd * RGR_GetTCoef(degrees_of_freedom); inst->estimated_offset = est_intercept; inst->offset_time = inst->sample_times[inst->last_sample]; @@ -601,6 +604,7 @@ SST_DoNewRegression(SST_Stats inst) prune_register(inst, best_start); } else { inst->estimated_frequency = 0.0; + inst->estimated_frequency_sd = WORST_CASE_FREQ_BOUND; inst->skew = WORST_CASE_FREQ_BOUND; times_back_start = 0; } @@ -700,7 +704,7 @@ SST_GetSelectionData(SST_Stats inst, struct timespec *now, void SST_GetTrackingData(SST_Stats inst, struct timespec *ref_time, double *average_offset, double *offset_sd, - double *frequency, double *skew, + double *frequency, double *frequency_sd, double *skew, double *root_delay, double *root_dispersion) { int i, j; @@ -715,6 +719,7 @@ SST_GetTrackingData(SST_Stats inst, struct timespec *ref_time, *average_offset = inst->estimated_offset; *offset_sd = inst->estimated_offset_sd; *frequency = inst->estimated_frequency; + *frequency_sd = inst->estimated_frequency_sd; *skew = inst->skew; *root_delay = inst->root_delays[j]; diff --git a/sourcestats.h b/sourcestats.h index c991c65..a321d3a 100644 --- a/sourcestats.h +++ b/sourcestats.h @@ -82,7 +82,7 @@ SST_GetSelectionData(SST_Stats inst, struct timespec *now, extern void SST_GetTrackingData(SST_Stats inst, struct timespec *ref_time, double *average_offset, double *offset_sd, - double *frequency, double *skew, + double *frequency, double *frequency_sd, double *skew, double *root_delay, double *root_dispersion); /* This routine is called when the local machine clock parameters are