Skip to content

Commit

Permalink
improved FSK decode
Browse files Browse the repository at this point in the history
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
  • Loading branch information
robotastic committed Jan 16, 2017
1 parent f83a9d3 commit b6b1c23
Show file tree
Hide file tree
Showing 3 changed files with 33 additions and 34 deletions.
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ sys_*/
junk/
2015/
2016/
fake/
wmata/
CMakeFiles/
build/
debug/
Expand Down
36 changes: 13 additions & 23 deletions trunk-recorder/recorders/p25_recorder.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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));
Expand Down Expand Up @@ -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);
Expand All @@ -229,25 +228,16 @@ 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);
connect(diffdec, 0, to_float, 0);
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);
}
}

Expand Down
29 changes: 18 additions & 11 deletions trunk-recorder/recorders/p25_recorder.h
Original file line number Diff line number Diff line change
Expand Up @@ -21,16 +21,15 @@
#include <gnuradio/filter/firdes.h>
#include <gnuradio/filter/fir_filter_ccf.h>
#include <gnuradio/filter/fir_filter_fff.h>
#include <gnuradio/filter/fft_filter_fff.h>
#include <gnuradio/filter/freq_xlating_fir_filter_ccf.h>
#include <gnuradio/filter/firdes.h>
#include <gnuradio/filter/rational_resampler_base_ccc.h>

#include <gnuradio/analog/quadrature_demod_cf.h>

#include <gnuradio/analog/sig_source_c.h>
#include <gnuradio/analog/feedforward_agc_cc.h>
#include <gnuradio/analog/agc2_ff.h>
#include <gnuradio/analog/agc2_cc.h>
#include <gnuradio/analog/pll_freqdet_cf.h>
#include <gnuradio/digital/diff_phasor_cc.h>

#include <gnuradio/blocks/complex_to_arg.h>
Expand All @@ -53,9 +52,17 @@
#include <gnuradio/blocks/short_to_float.h>
#include <gnuradio/blocks/char_to_float.h>

#include <op25_repeater/fsk4_demod_ff.h>
/*#include <op25_repeater/fsk4_demod_ff.h>
#include <op25_repeater/fsk4_slicer_fb.h>
#include <op25_repeater/p25_frame_assembler.h>
#include <op25_repeater/gardner_costas_cc.h>
#include <op25_repeater/vocoder.h>*/


#include "../../op25_repeater/include/op25_repeater/fsk4_demod_ff.h"
#include <op25_repeater/fsk4_slicer_fb.h>
#include "../../op25_repeater/include/op25_repeater/p25_frame_assembler.h"

#include <op25_repeater/gardner_costas_cc.h>
#include <op25_repeater/vocoder.h>
#include <gnuradio/msg_queue.h>
Expand All @@ -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> p25_recorder_sptr;
Expand Down Expand Up @@ -131,6 +135,8 @@ class p25_recorder : public gr::hier_block2, public Recorder
std::vector<float> lpf_coeffs;
std::vector<float> arb_taps;
std::vector<float> sym_taps;
std::vector<float> baseband_noise_filter_taps;


//gr::filter::freq_xlating_fir_filter_ccf::sptr prefilter;

Expand All @@ -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;

Expand All @@ -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;
Expand All @@ -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;
Expand Down

0 comments on commit b6b1c23

Please sign in to comment.