summaryrefslogtreecommitdiff
path: root/gr-analog/lib/ctcss_squelch_ff_impl.cc
diff options
context:
space:
mode:
Diffstat (limited to 'gr-analog/lib/ctcss_squelch_ff_impl.cc')
-rw-r--r--gr-analog/lib/ctcss_squelch_ff_impl.cc70
1 files changed, 52 insertions, 18 deletions
diff --git a/gr-analog/lib/ctcss_squelch_ff_impl.cc b/gr-analog/lib/ctcss_squelch_ff_impl.cc
index 7714da3fe4..7edda64a1d 100644
--- a/gr-analog/lib/ctcss_squelch_ff_impl.cc
+++ b/gr-analog/lib/ctcss_squelch_ff_impl.cc
@@ -55,6 +55,36 @@ namespace gr {
return -1;
}
+ void
+ ctcss_squelch_ff_impl::compute_freqs(const float &freq,
+ float &f_l, float &f_r)
+ {
+ int i = find_tone(freq);
+
+ // Non-standard tones or edge tones get 2% guard band, otherwise
+ // guards are set at adjacent ctcss tone frequencies
+ if(i == -1 || i == 0)
+ f_l = freq*0.98;
+ else
+ f_l = ctcss_tones[i-1];
+
+ if(i == -1 || i == max_tone_index)
+ f_r = freq*1.02;
+ else
+ f_r = ctcss_tones[i+1];
+ }
+
+ void
+ ctcss_squelch_ff_impl::update_fft_params()
+ {
+ float f_l, f_r;
+ compute_freqs(d_freq, f_l, f_r);
+
+ d_goertzel_l->set_params(d_rate, d_len, f_l);
+ d_goertzel_c->set_params(d_rate, d_len, d_freq);
+ d_goertzel_r->set_params(d_rate, d_len, f_r);
+ }
+
ctcss_squelch_ff_impl::ctcss_squelch_ff_impl(int rate, float freq, float level,
int len, int ramp, bool gate)
: block("ctcss_squelch_ff",
@@ -64,31 +94,20 @@ namespace gr {
{
d_freq = freq;
d_level = level;
+ d_rate = rate;
// Default is 100 ms detection time
if(len == 0)
- d_len = (int)(rate/10.0);
+ d_len = (int)(d_rate/10.0);
else
- d_len = len;
+ d_len = len;
- int i = find_tone(freq);
-
- // Non-standard tones or edge tones get 2% guard band, otherwise
- // guards are set at adjacent ctcss tone frequencies
float f_l, f_r;
- if(i == -1 || i == 0)
- f_l = freq*0.98;
- else
- f_l = ctcss_tones[i-1];
-
- if(i == -1 || i == max_tone_index)
- f_r = freq*1.02;
- else
- f_r = ctcss_tones[i+1];
+ compute_freqs(d_freq, f_l, f_r);
- d_goertzel_l = new fft::goertzel(rate, d_len, f_l);
- d_goertzel_c = new fft::goertzel(rate, d_len, freq);
- d_goertzel_r = new fft::goertzel(rate, d_len, f_r);
+ d_goertzel_l = new fft::goertzel(d_rate, d_len, f_l);
+ d_goertzel_c = new fft::goertzel(d_rate, d_len, freq);
+ d_goertzel_r = new fft::goertzel(d_rate, d_len, f_r);
d_mute = true;
}
@@ -130,5 +149,20 @@ namespace gr {
}
}
+ void
+ ctcss_squelch_ff_impl::set_level(float level)
+ {
+ gr::thread::scoped_lock l(d_setlock);
+ d_level = level;
+ }
+
+ void
+ ctcss_squelch_ff_impl::set_frequency(float frequency)
+ {
+ gr::thread::scoped_lock l(d_setlock);
+ d_freq = frequency;
+ update_fft_params();
+ }
+
} /* namespace analog */
} /* namespace gr */