summaryrefslogtreecommitdiff
path: root/gr-digital/lib/clock_tracking_loop.cc
diff options
context:
space:
mode:
Diffstat (limited to 'gr-digital/lib/clock_tracking_loop.cc')
-rw-r--r--gr-digital/lib/clock_tracking_loop.cc36
1 files changed, 31 insertions, 5 deletions
diff --git a/gr-digital/lib/clock_tracking_loop.cc b/gr-digital/lib/clock_tracking_loop.cc
index d74e4b2120..51a1db9e71 100644
--- a/gr-digital/lib/clock_tracking_loop.cc
+++ b/gr-digital/lib/clock_tracking_loop.cc
@@ -34,7 +34,8 @@ namespace gr {
clock_tracking_loop::clock_tracking_loop(float loop_bw,
float max_period, float min_period,
float nominal_period,
- float damping)
+ float damping,
+ float ted_gain)
: d_avg_period(nominal_period),
d_max_avg_period(max_period),
d_min_avg_period(min_period),
@@ -43,6 +44,7 @@ namespace gr {
d_phase(0.0f),
d_zeta(damping),
d_omega_n_norm(loop_bw),
+ d_ted_gain(ted_gain),
d_alpha(0.0f),
d_beta(0.0f),
d_prev_avg_period(nominal_period),
@@ -64,6 +66,10 @@ namespace gr {
throw std::out_of_range (
"clock_tracking_loop: loop bandwidth must be greater than 0.0");
+ if (d_ted_gain <= 0.0f)
+ throw std::out_of_range (
+ "clock_tracking_loop: expected ted gain must be greater than 0.0");
+
update_gains();
}
@@ -74,12 +80,15 @@ namespace gr {
void
clock_tracking_loop::update_gains()
{
- float omega_n_T, omega_d_T, zeta_omega_n_T, k1, cosx_omega_d_T;
+ float omega_n_T, omega_d_T, zeta_omega_n_T, cosx_omega_d_T;
+ float k0, k1, sinh_zeta_omega_n_T;
float alpha, beta;
omega_n_T = d_omega_n_norm;
zeta_omega_n_T = d_zeta * omega_n_T;
- k1 = 2.0f * expf(-zeta_omega_n_T);
+ k0 = 2.0f/d_ted_gain;
+ k1 = expf(-zeta_omega_n_T);
+ sinh_zeta_omega_n_T = sinhf(zeta_omega_n_T);
if (d_zeta > 1.0f) { // Over-damped (or critically-damped too)
@@ -100,8 +109,8 @@ namespace gr {
// cos ----------^^^
}
- alpha = k1 * sinhf(zeta_omega_n_T);
- beta = 2.0f - (alpha + k1 * cosx_omega_d_T);
+ alpha = k0 * k1 * sinh_zeta_omega_n_T;
+ beta = k0 * (1 - k1*(sinh_zeta_omega_n_T + cosx_omega_d_T));
set_alpha(alpha);
set_beta(beta);
@@ -180,6 +189,17 @@ namespace gr {
}
void
+ clock_tracking_loop::set_ted_gain(float ted_gain)
+ {
+ if (ted_gain <= 0.0f)
+ throw std::out_of_range (
+ "clock_tracking_loop: expected ted gain must be > 0.0");
+
+ d_ted_gain = ted_gain;
+ update_gains();
+ }
+
+ void
clock_tracking_loop::set_alpha(float alpha)
{
d_alpha = alpha;
@@ -256,6 +276,12 @@ namespace gr {
}
float
+ clock_tracking_loop::get_ted_gain() const
+ {
+ return d_ted_gain;
+ }
+
+ float
clock_tracking_loop::get_alpha() const
{
return d_alpha;