コード例 #1
0
ファイル: basic_demod.py プロジェクト: bitglue/shinysdr
 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()
コード例 #2
0
    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()
コード例 #3
0
 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)
コード例 #4
0
ファイル: radio.py プロジェクト: alkyl1978/gr-scanner
 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)
コード例 #5
0
ファイル: basic_demod.py プロジェクト: kpreid/shinysdr
    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)
コード例 #6
0
    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)