#!/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)