Combine source frequencies by skew
This commit is contained in:
parent
f8d609fee5
commit
707b857b68
1 changed files with 20 additions and 15 deletions
35
sources.c
35
sources.c
|
@ -433,13 +433,15 @@ combine_sources(int n_sel_sources, struct timeval *ref_time, double *offset,
|
||||||
struct timeval src_ref_time;
|
struct timeval src_ref_time;
|
||||||
double src_offset, src_offset_sd, src_frequency, src_skew;
|
double src_offset, src_offset_sd, src_frequency, src_skew;
|
||||||
double src_root_delay, src_root_dispersion, elapsed;
|
double src_root_delay, src_root_dispersion, elapsed;
|
||||||
double weight, sum_weight, sum_offset, sum2_offset_sd, sum_frequency, sum_skew;
|
double offset_weight, sum_offset_weight, sum_offset, sum2_offset_sd;
|
||||||
|
double frequency_weight, sum_frequency_weight, sum_frequency, 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_weight = sum_offset = sum2_offset_sd = sum_frequency = sum_skew = 0.0;
|
sum_offset_weight = sum_offset = sum2_offset_sd = 0.0;
|
||||||
|
sum_frequency_weight = sum_frequency = inv_sum2_skew = 0.0;
|
||||||
|
|
||||||
for (i = combined = 0; i < n_sel_sources; i++) {
|
for (i = combined = 0; i < n_sel_sources; i++) {
|
||||||
index = sel_sources[i];
|
index = sel_sources[i];
|
||||||
|
@ -467,28 +469,31 @@ combine_sources(int n_sel_sources, struct timeval *ref_time, double *offset,
|
||||||
|
|
||||||
UTI_DiffTimevalsToDouble(&elapsed, ref_time, &src_ref_time);
|
UTI_DiffTimevalsToDouble(&elapsed, ref_time, &src_ref_time);
|
||||||
src_offset += elapsed * src_frequency;
|
src_offset += elapsed * src_frequency;
|
||||||
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;
|
||||||
|
|
||||||
#ifdef TRACEON
|
#ifdef TRACEON
|
||||||
LOG(LOGS_INFO, LOGF_Sources, "combining index=%d weight=%e offset=%e sd=%e freq=%e skew=%e",
|
LOG(LOGS_INFO, LOGF_Sources, "combining index=%d oweight=%e offset=%e sd=%e fweight=%e freq=%e skew=%e",
|
||||||
index, weight, src_offset, src_offset_sd, src_frequency, src_skew);
|
index, offset_weight, src_offset, src_offset_sd, frequency_weight, src_frequency, src_skew);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
sum_weight += weight;
|
sum_offset_weight += offset_weight;
|
||||||
sum_offset += weight * src_offset;
|
sum_offset += offset_weight * src_offset;
|
||||||
sum2_offset_sd += weight * (src_offset_sd * src_offset_sd +
|
sum2_offset_sd += offset_weight * (src_offset_sd * src_offset_sd +
|
||||||
(src_offset - *offset) * (src_offset - *offset));
|
(src_offset - *offset) * (src_offset - *offset));
|
||||||
sum_frequency += weight * src_frequency;
|
|
||||||
sum_skew += weight * src_skew;
|
sum_frequency_weight += frequency_weight;
|
||||||
|
sum_frequency += frequency_weight * src_frequency;
|
||||||
|
inv_sum2_skew += 1.0 / (src_skew * src_skew);
|
||||||
|
|
||||||
combined++;
|
combined++;
|
||||||
}
|
}
|
||||||
|
|
||||||
assert(sum_weight > 0.0);
|
assert(combined);
|
||||||
*offset = sum_offset / sum_weight;
|
*offset = sum_offset / sum_offset_weight;
|
||||||
*offset_sd = sqrt(sum2_offset_sd / sum_weight);
|
*offset_sd = sqrt(sum2_offset_sd / sum_offset_weight);
|
||||||
*frequency = sum_frequency / sum_weight;
|
*frequency = sum_frequency / sum_frequency_weight;
|
||||||
*skew = sum_skew / sum_weight;
|
*skew = 1.0 / sqrt(inv_sum2_skew);
|
||||||
|
|
||||||
#ifdef TRACEON
|
#ifdef TRACEON
|
||||||
LOG(LOGS_INFO, LOGF_Sources, "combined result offset=%e sd=%e freq=%e skew=%e",
|
LOG(LOGS_INFO, LOGF_Sources, "combined result offset=%e sd=%e freq=%e skew=%e",
|
||||||
|
|
Loading…
Reference in a new issue