From b6b1c2339390a694101315a60db349f0f07e872b Mon Sep 17 00:00:00 2001 From: robotastic Date: Sun, 15 Jan 2017 21:02:18 -0500 Subject: [PATCH] improved FSK decode Big thanks to Andy Walls for the code, from the gnuradio mailing list: http://lists.gnu.org/archive/html/discuss-gnuradio/2017-01/msg00070.html --- .gitignore | 2 ++ trunk-recorder/recorders/p25_recorder.cc | 36 +++++++++--------------- trunk-recorder/recorders/p25_recorder.h | 29 +++++++++++-------- 3 files changed, 33 insertions(+), 34 deletions(-) diff --git a/.gitignore b/.gitignore index dc9247d78..b609bcb76 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,8 @@ sys_*/ junk/ 2015/ 2016/ +fake/ +wmata/ CMakeFiles/ build/ debug/ diff --git a/trunk-recorder/recorders/p25_recorder.cc b/trunk-recorder/recorders/p25_recorder.cc index 97f97f1e9..31d797612 100644 --- a/trunk-recorder/recorders/p25_recorder.cc +++ b/trunk-recorder/recorders/p25_recorder.cc @@ -155,16 +155,15 @@ BOOST_LOG_TRIVIAL(error) << "Size of LPF: " << dest.size(); // convert from radians such that signal is in -3/-1/+1/+3 rescale = gr::blocks::multiply_const_ff::make((1 / (pi / 4))); - // fm demodulator (needed in fsk4 case) - double fm_demod_gain = system_channel_rate / (2.0 * pi * symbol_deviation); - fm_demod = gr::analog::quadrature_demod_cf::make(fm_demod_gain); - BOOST_LOG_TRIVIAL(info) << "p25_recorder.cc: fm_demod gain - " << fm_demod_gain; - - demod_agc = gr::analog::agc2_ff::make(0.1, 0.01, 1.0, 0.1); - pre_demod_agc = gr::analog::agc2_cc::make(0.1, 0.01, 1.0, 1.0); - - super_agc = make_rx_agc_cc(system_channel_rate, true, -90, 0, 0, 500, true); - + double freq_to_norm_radians = pi/(system_channel_rate/2.0); + double fc = 0.0; + double fd = 600.0; + double pll_demod_gain = 1.0/(fd*freq_to_norm_radians); + pll_freq_lock = gr::analog::pll_freqdet_cf::make ( (symbol_rate/2.0*1.2)*freq_to_norm_radians, (fc+(3*fd*1.9))*freq_to_norm_radians, (fc+(-3*fd*1.9))*freq_to_norm_radians); + pll_amp = gr::blocks::multiply_const_ff::make(pll_demod_gain); + + baseband_noise_filter_taps = gr::filter::firdes::low_pass_2(1.0, system_channel_rate, symbol_rate/2.0*1.175, symbol_rate/2.0*0.125, 20.0, gr::filter::firdes::WIN_KAISER, 6.76); + noise_filter = gr::filter::fft_filter_fff::make(1.0, baseband_noise_filter_taps); double symbol_decim = 1; valve = gr::blocks::copy::make(sizeof(gr_complex)); @@ -215,10 +214,10 @@ BOOST_LOG_TRIVIAL(error) << "Size of LPF: " << dest.size(); connect(self(), 0, valve, 0); connect(valve, 0, prefilter, 0); connect(prefilter, 0, arb_resampler, 0); - connect(arb_resampler, 0, pre_demod_agc, 0); - connect(pre_demod_agc, 0,fm_demod, 0); - connect(fm_demod, 0, baseband_amp, 0); - connect(baseband_amp, 0, sym_filter, 0); + connect(arb_resampler, 0, pll_freq_lock, 0); + connect(pll_freq_lock, 0, pll_amp, 0); + connect(pll_amp, 0, noise_filter, 0); + connect(noise_filter, 0, sym_filter, 0); connect(sym_filter, 0, fsk4_demod, 0); connect(fsk4_demod, 0, slicer, 0); connect(slicer, 0, op25_frame_assembler, 0); @@ -229,9 +228,6 @@ BOOST_LOG_TRIVIAL(error) << "Size of LPF: " << dest.size(); connect(self(), 0, valve, 0); connect(valve, 0, prefilter, 0); connect(prefilter, 0, arb_resampler, 0); - - // connect(prefilter, 0, tagger,0); - // connect(tagger,0, arb_resampler, 0); connect(arb_resampler, 0, agc, 0); connect(agc, 0, costas_clock, 0); connect(costas_clock, 0, diffdec, 0); @@ -239,15 +235,9 @@ BOOST_LOG_TRIVIAL(error) << "Size of LPF: " << dest.size(); connect(to_float, 0, rescale, 0); connect(rescale, 0, slicer, 0); connect(slicer, 0, op25_frame_assembler, 0); - - // connect(slicer,0, active_probe,0); - // connect(active_probe,0, op25_frame_assembler,0); connect(op25_frame_assembler, 0, converter, 0); connect(converter, 0, multiplier, 0); connect(multiplier, 0, wav_sink, 0); - - // connect(converter, 0, last_probe,0); - // connect(last_probe,0, wav_sink,0); } } diff --git a/trunk-recorder/recorders/p25_recorder.h b/trunk-recorder/recorders/p25_recorder.h index 0cdfb3a43..5345b7d28 100644 --- a/trunk-recorder/recorders/p25_recorder.h +++ b/trunk-recorder/recorders/p25_recorder.h @@ -21,16 +21,15 @@ #include #include #include +#include #include #include #include -#include #include #include -#include -#include +#include #include #include @@ -53,9 +52,17 @@ #include #include -#include +/*#include #include #include +#include +#include */ + + +#include "../../op25_repeater/include/op25_repeater/fsk4_demod_ff.h" +#include +#include "../../op25_repeater/include/op25_repeater/p25_frame_assembler.h" + #include #include #include @@ -70,9 +77,6 @@ #include "../../gr_blocks/latency_probe.h" #include "../../gr_blocks/latency_tagger.h" - -#include "../../gr_blocks/rx_agc_cc.h" - class Source; class p25_recorder; typedef boost::shared_ptr p25_recorder_sptr; @@ -131,6 +135,8 @@ class p25_recorder : public gr::hier_block2, public Recorder std::vector lpf_coeffs; std::vector arb_taps; std::vector sym_taps; + std::vector baseband_noise_filter_taps; + //gr::filter::freq_xlating_fir_filter_ccf::sptr prefilter; @@ -141,6 +147,8 @@ class p25_recorder : public gr::hier_block2, public Recorder /* GR blocks */ gr::filter::fir_filter_ccf::sptr lpf; gr::filter::fir_filter_fff::sptr sym_filter; + gr::filter::fft_filter_fff::sptr noise_filter; + gr::analog::sig_source_c::sptr lo; @@ -152,11 +160,9 @@ class p25_recorder : public gr::hier_block2, public Recorder gr::filter::pfb_arb_resampler_ccf::sptr arb_resampler; gr::filter::rational_resampler_base_ccf::sptr downsample_sig; gr::filter::rational_resampler_base_fff::sptr upsample_audio; - gr::analog::quadrature_demod_cf::sptr fm_demod; gr::analog::feedforward_agc_cc::sptr agc; - gr::analog::agc2_ff::sptr demod_agc; - gr::analog::agc2_cc::sptr pre_demod_agc; - rx_agc_cc_sptr super_agc; + gr::analog::pll_freqdet_cf::sptr pll_freq_lock; + gr::blocks::nonstop_wavfile_sink::sptr wav_sink; gr::blocks::short_to_float::sptr converter; @@ -165,6 +171,7 @@ class p25_recorder : public gr::hier_block2, public Recorder gr::blocks::multiply_const_ff::sptr multiplier; gr::blocks::multiply_const_ff::sptr rescale; gr::blocks::multiply_const_ff::sptr baseband_amp; + gr::blocks::multiply_const_ff::sptr pll_amp; gr::blocks::complex_to_arg::sptr to_float; gr::op25_repeater::fsk4_demod_ff::sptr fsk4_demod; gr::op25_repeater::p25_frame_assembler::sptr op25_frame_assembler;