#!/usr/bin/env python """ Block to demodulate FSK via coherent PLL frequency estimation Not exactly hardcore but it works """ from gnuradio import gr, gru, blks2 from gnuradio import eng_notation from gnuradio.gr import firdes from math import pi from gnuradio import digital def euclid(numA, numB): while (numB != 0): numRem = (numA % numB) numA = numB numB = numRem return numA class fsk_demod(gr.hier_block2): __module__ = __name__ def __init__(self, options): gr.hier_block2.__init__(self, 'fsk_demod', gr.io_signature(1, 1, gr.sizeof_gr_complex), gr.io_signature(1, 1, gr.sizeof_char)) self._syms_per_sec = options.syms_per_sec self._samples_per_second = options.samples_per_second self._gain_mu = options.gain_mu self._mu = options.mu self._omega_relative_limit = options.omega_relative_limit self._freqoffset = options.offset self._filtdecim = 1 self._clockrec_oversample = 10 self._downsampletaps = gr.firdes.low_pass(1, self._samples_per_second, 10000, 1000, firdes.WIN_HANN) self._decim = int((self._samples_per_second / (self._syms_per_sec * self._clockrec_oversample))) self._demod_sample_rate = int((self._samples_per_second / self._decim)) print ('Demodulator decimation: %i' % (self._decim)) print ('Demodulator output sample rate: %i' % self._demod_sample_rate) self._downsample = gr.freq_xlating_fir_filter_ccc(self._decim, self._downsampletaps, self._freqoffset, self._samples_per_second) self._quad_demod = gr.quadrature_demod_cf(5.7000000000000002) self._lpfcoeffs = gr.firdes.low_pass(1000, self._demod_sample_rate, self._syms_per_sec, 100, firdes.WIN_HANN) self._lpf = gr.fir_filter_fff(self._filtdecim, self._lpfcoeffs) print ('Samples per symbol: %f' % ((self._demod_sample_rate / self._syms_per_sec))) self._softbits = digital.clock_recovery_mm_ff(((float(self._samples_per_second) / self._decim) / self._syms_per_sec), ((0.25 * self._gain_mu) * self._gain_mu), self._mu, self._gain_mu, self._omega_relative_limit) self._slicer = digital.binary_slicer_fb() self.connect(self, self._downsample, self._quad_demod, self._softbits, self._slicer, self)