def __init__(self, mode, deviation=75000, demod_rate=48000, band_filter=None, band_filter_transition=None, tau=75e-6, no_audio_filter=False, # TODO kludge to support APRS demod looking for tones **kwargs): SimpleAudioDemodulator.__init__(self, mode=mode, demod_rate=demod_rate, band_filter=band_filter, band_filter_transition=band_filter_transition, **kwargs) self.__no_audio_filter = no_audio_filter self.__qdemod = analog.quadrature_demod_cf(demod_rate / (TWO_PI * deviation)) if tau > 0.0: self.__deemph = fm_emph.fm_deemph(demod_rate, tau) else: self.__deemph = None self.do_connect()
def __init__( self, mode, deviation=75000, demod_rate=48000, band_filter=None, band_filter_transition=None, tau=75e-6, no_audio_filter=False, # TODO kludge to support APRS demod looking for tones **kwargs): SimpleAudioDemodulator.__init__( self, mode=mode, demod_rate=demod_rate, band_filter=band_filter, band_filter_transition=band_filter_transition, **kwargs) self.__no_audio_filter = no_audio_filter self.__qdemod = analog.quadrature_demod_cf(demod_rate / (TWO_PI * deviation)) if tau > 0.0: self.__deemph = fm_emph.fm_deemph(demod_rate, tau) else: self.__deemph = None self.do_connect()
def __init__(self, rate, decim, gate=False): gr.hier_block2.__init__(self, "fm_demod", gr.io_signature(1, 1, gr.sizeof_gr_complex), gr.io_signature(1, 1, gr.sizeof_float)) tau = 75.e-6 deviation = 5.e3 k = rate / (2 * pi * deviation) self.rate = rate self.quad = analog.quadrature_demod_cf(k) self.squelch = scanner.standard_squelch_ff(gate=gate) self.deemph = fm_deemph(rate, tau) self.nfilts = 32 audio_taps = optfir.band_pass(self.nfilts, self.rate * self.nfilts, 250, 300, 3000, 4000, 0.2, 40) self.resamp = pfb.arb_resampler_fff(1. / decim, audio_taps) self.connect(self, self.quad, self.squelch, self.deemph, self.resamp, self)
def __init__(self, rate, decim, gate=False): gr.hier_block2.__init__(self, "fm_demod", gr.io_signature(1,1,gr.sizeof_gr_complex), gr.io_signature(1,1,gr.sizeof_float)) tau=75.e-6 deviation = 5.e3 k=rate/(2*pi*deviation) self.rate = rate self.quad = analog.quadrature_demod_cf(k) self.squelch = scanner.standard_squelch_ff(gate=gate) self.deemph = fm_deemph(rate, tau) self.nfilts = 32 audio_taps = optfir.band_pass(self.nfilts, self.rate*self.nfilts, 250, 300, 3000, 4000, 0.2, 40) self.resamp = pfb.arb_resampler_fff(1./decim, audio_taps) self.connect(self, self.quad, self.squelch, self.deemph, self.resamp, self)
def connect_audio_stage(self, input_port): stereo_rate = self.demod_rate normalizer = TWO_PI / stereo_rate pilot_tone = 19000 pilot_low = pilot_tone * 0.98 pilot_high = pilot_tone * 1.02 def make_audio_filter(): return grfilter.fir_filter_fff( stereo_rate // self.__audio_int_rate, # decimation firdes.low_pass( 1.0, stereo_rate, 15000, 5000, firdes.WIN_HAMMING)) stereo_pilot_filter = grfilter.fir_filter_fcc( 1, # decimation firdes.complex_band_pass( 1.0, stereo_rate, pilot_low, pilot_high, 300)) # TODO magic number from gqrx stereo_pilot_pll = analog.pll_refout_cc( loop_bw=0.001, max_freq=normalizer * pilot_high, min_freq=normalizer * pilot_low) stereo_pilot_doubler = blocks.multiply_cc() stereo_pilot_out = blocks.complex_to_real() difference_channel_mixer = blocks.multiply_ff() difference_channel_filter = make_audio_filter() mono_channel_filter = make_audio_filter() mixL = blocks.add_ff(1) mixR = blocks.sub_ff(1) # connections self.connect(input_port, mono_channel_filter) if self.__decode_stereo: # stereo pilot tone tracker self.connect( input_port, stereo_pilot_filter, stereo_pilot_pll) self.connect(stereo_pilot_pll, (stereo_pilot_doubler, 0)) self.connect(stereo_pilot_pll, (stereo_pilot_doubler, 1)) self.connect(stereo_pilot_doubler, stereo_pilot_out) # pick out stereo left-right difference channel (at stereo_rate) self.connect(input_port, (difference_channel_mixer, 0)) self.connect(stereo_pilot_out, (difference_channel_mixer, 1)) self.connect( difference_channel_mixer, blocks.multiply_const_ff(6), # TODO: Completely empirical fudge factor. This should not be necessary. I believe this is at least partly due to phase error in the pilot signal. difference_channel_filter) # recover left/right channels (at self.__audio_int_rate) self.connect(difference_channel_filter, (mixL, 1)) self.connect(difference_channel_filter, (mixR, 1)) self.connect(mono_channel_filter, (mixL, 0)) self.connect(mono_channel_filter, (mixR, 0)) resamplerL = self._make_resampler((mixL, 0), self.__audio_int_rate) resamplerR = self._make_resampler((mixR, 0), self.__audio_int_rate) deemphL = fm_emph.fm_deemph(self.__audio_int_rate, 75e-6) deemphR = fm_emph.fm_deemph(self.__audio_int_rate, 75e-6) self.connect(resamplerL, deemphL) self.connect(resamplerR, deemphR) self.connect_audio_output(deemphL, deemphR) else: resampler = self._make_resampler(mono_channel_filter, self.__audio_int_rate) deemph = fm_emph.fm_deemph(self.__audio_int_rate, 75e-6) self.connect(resampler, deemph) self.connect_audio_output(deemph, deemph)
def connect_audio_stage(self, input_port): stereo_rate = self.demod_rate normalizer = TWO_PI / stereo_rate pilot_tone = 19000 pilot_low = pilot_tone * 0.98 pilot_high = pilot_tone * 1.02 def make_audio_filter(): return grfilter.fir_filter_fff( stereo_rate // self.__audio_int_rate, # decimation firdes.low_pass(1.0, stereo_rate, 15000, 5000, firdes.WIN_HAMMING)) stereo_pilot_filter = grfilter.fir_filter_fcc( 1, # decimation firdes.complex_band_pass(1.0, stereo_rate, pilot_low, pilot_high, 300)) # TODO magic number from gqrx stereo_pilot_pll = analog.pll_refout_cc( loop_bw=0.001, max_freq=normalizer * pilot_high, min_freq=normalizer * pilot_low) stereo_pilot_doubler = blocks.multiply_cc() stereo_pilot_out = blocks.complex_to_real() difference_channel_mixer = blocks.multiply_ff() difference_channel_filter = make_audio_filter() mono_channel_filter = make_audio_filter() mixL = blocks.add_ff(1) mixR = blocks.sub_ff(1) # connections self.connect(input_port, mono_channel_filter) if self.__decode_stereo: # stereo pilot tone tracker self.connect(input_port, stereo_pilot_filter, stereo_pilot_pll) self.connect(stereo_pilot_pll, (stereo_pilot_doubler, 0)) self.connect(stereo_pilot_pll, (stereo_pilot_doubler, 1)) self.connect(stereo_pilot_doubler, stereo_pilot_out) # pick out stereo left-right difference channel (at stereo_rate) self.connect(input_port, (difference_channel_mixer, 0)) self.connect(stereo_pilot_out, (difference_channel_mixer, 1)) self.connect( difference_channel_mixer, blocks.multiply_const_ff( 6 ), # TODO: Completely empirical fudge factor. This should not be necessary. I believe this is at least partly due to phase error in the pilot signal. difference_channel_filter) # recover left/right channels (at self.__audio_int_rate) self.connect(difference_channel_filter, (mixL, 1)) self.connect(difference_channel_filter, (mixR, 1)) self.connect(mono_channel_filter, (mixL, 0)) self.connect(mono_channel_filter, (mixR, 0)) resamplerL = self._make_resampler((mixL, 0), self.__audio_int_rate) resamplerR = self._make_resampler((mixR, 0), self.__audio_int_rate) deemphL = fm_emph.fm_deemph(self.__audio_int_rate, 75e-6) deemphR = fm_emph.fm_deemph(self.__audio_int_rate, 75e-6) self.connect(resamplerL, deemphL) self.connect(resamplerR, deemphR) self.connect_audio_output(deemphL, deemphR) else: resampler = self._make_resampler(mono_channel_filter, self.__audio_int_rate) deemph = fm_emph.fm_deemph(self.__audio_int_rate, 75e-6) self.connect(resampler, deemph) self.connect_audio_output(deemph, deemph)