diff options
author | Andreas Eversberg <jolly@eversberg.eu> | 2017-01-30 20:02:45 +0100 |
---|---|---|
committer | Andreas Eversberg <jolly@eversberg.eu> | 2017-02-18 21:01:19 +0100 |
commit | faa3dfb7d402f1dbd0ca4b0ac91ea268ed59df35 (patch) | |
tree | a2a6001e82f9628de9f24d0da1c899e2f1365a00 /src | |
parent | 5026e161aa61096e7f172131466e04966c340431 (diff) |
C-Netz: Make average to clock measurements for a quicker result
Diffstat (limited to 'src')
-rw-r--r-- | src/cnetz/cnetz.h | 5 | ||||
-rw-r--r-- | src/cnetz/dsp.c | 31 |
2 files changed, 30 insertions, 6 deletions
diff --git a/src/cnetz/cnetz.h b/src/cnetz/cnetz.h index e10a89a..01fcc9c 100644 --- a/src/cnetz/cnetz.h +++ b/src/cnetz/cnetz.h @@ -51,6 +51,11 @@ struct clock_speed { double start_ti[4]; /* time stamp for start of counting */ double last_ti[4]; /* time stamp of last received time */ uint64_t spl_count[4]; /* sample counter for sound card */ + /* making average of measurement values */ + double speed_ppm_rx[2][256]; /* history of clock speed measurements */ + double speed_ppm_tx[2][256]; + int idx; /* index of current value */ + int num; /* total num of values so far */ }; /* instance of cnetz sender */ diff --git a/src/cnetz/dsp.c b/src/cnetz/dsp.c index b5f9d53..e47bd7a 100644 --- a/src/cnetz/dsp.c +++ b/src/cnetz/dsp.c @@ -199,7 +199,8 @@ void calc_clock_speed(cnetz_t *cnetz, uint64_t samples, int tx, int result) { struct clock_speed *cs = &cnetz->clock_speed; double ti; - double speed_ppm_rx[2], speed_ppm_tx[2]; + double speed_ppm_rx_avg[2], speed_ppm_tx_avg[2]; + int i; if (!cnetz->measure_speed) return; @@ -235,11 +236,29 @@ void calc_clock_speed(cnetz_t *cnetz, uint64_t samples, int tx, int result) if (!cs->spl_count[2] || !cs->spl_count[3]) return; - speed_ppm_rx[0] = ((double)cs->spl_count[0] / (double)cnetz->sender.samplerate) / (cs->last_ti[0] - cs->start_ti[0]) * 1000000.0 - 1000000.0; - speed_ppm_tx[0] = ((double)cs->spl_count[1] / (double)cnetz->sender.samplerate) / (cs->last_ti[1] - cs->start_ti[1]) * 1000000.0 - 1000000.0; - speed_ppm_rx[1] = ((double)cs->spl_count[2] / (double)cnetz->sender.samplerate) / (cs->last_ti[2] - cs->start_ti[2]) * 1000000.0 - 1000000.0; - speed_ppm_tx[1] = ((double)cs->spl_count[3] / (double)cnetz->sender.samplerate) / (cs->last_ti[3] - cs->start_ti[3]) * 1000000.0 - 1000000.0; - PDEBUG_CHAN(DDSP, DEBUG_NOTICE, "Clock: RX=%.2f TX=%.2f; Signal: RX=%.2f TX=%.2f ppm\n", speed_ppm_rx[0], speed_ppm_tx[0], speed_ppm_rx[1], speed_ppm_tx[1]); + cs->speed_ppm_rx[0][cs->idx & 0xff] = ((double)cs->spl_count[0] / (double)cnetz->sender.samplerate) / (cs->last_ti[0] - cs->start_ti[0]) * 1000000.0 - 1000000.0; + cs->speed_ppm_tx[0][cs->idx & 0xff] = ((double)cs->spl_count[1] / (double)cnetz->sender.samplerate) / (cs->last_ti[1] - cs->start_ti[1]) * 1000000.0 - 1000000.0; + cs->speed_ppm_rx[1][cs->idx & 0xff] = ((double)cs->spl_count[2] / (double)cnetz->sender.samplerate) / (cs->last_ti[2] - cs->start_ti[2]) * 1000000.0 - 1000000.0; + cs->speed_ppm_tx[1][cs->idx & 0xff] = ((double)cs->spl_count[3] / (double)cnetz->sender.samplerate) / (cs->last_ti[3] - cs->start_ti[3]) * 1000000.0 - 1000000.0; + cs->idx++; + cs->num++; + if (cs->num > 30) + cs->num = 30; + speed_ppm_rx_avg[0] = 0.0; + speed_ppm_tx_avg[0] = 0.0; + speed_ppm_rx_avg[1] = 0.0; + speed_ppm_tx_avg[1] = 0.0; + for (i = 0; i < cs->num; i++) { + speed_ppm_rx_avg[0] += cs->speed_ppm_rx[0][(cs->idx - i - 1) & 0xff]; + speed_ppm_tx_avg[0] += cs->speed_ppm_tx[0][(cs->idx - i - 1) & 0xff]; + speed_ppm_rx_avg[1] += cs->speed_ppm_rx[1][(cs->idx - i - 1) & 0xff]; + speed_ppm_tx_avg[1] += cs->speed_ppm_tx[1][(cs->idx - i - 1) & 0xff]; + } + speed_ppm_rx_avg[0] /= (double)cs->num; + speed_ppm_tx_avg[0] /= (double)cs->num; + speed_ppm_rx_avg[1] /= (double)cs->num; + speed_ppm_tx_avg[1] /= (double)cs->num; + PDEBUG_CHAN(DDSP, DEBUG_NOTICE, "Clock: RX=%.2f TX=%.2f; Signal: RX=%.2f TX=%.2f ppm\n", speed_ppm_rx_avg[0], speed_ppm_tx_avg[0], speed_ppm_rx_avg[1], speed_ppm_tx_avg[1]); } static int fsk_testtone_encode(cnetz_t *cnetz) |