diff options
Diffstat (limited to 'gr-analog/lib/ctcss_squelch_ff_impl.cc')
-rw-r--r-- | gr-analog/lib/ctcss_squelch_ff_impl.cc | 70 |
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 */ |