Example #1
0
    def __init__(self, rate, taps=None, flt_size=32, atten=100):
	gr.hier_block2.__init__(self, "pfb_arb_resampler_fff",
				gr.io_signature(1, 1, gr.sizeof_float), # Input signature
				gr.io_signature(1, 1, gr.sizeof_float)) # Output signature
        
        self._rate = rate
        self._size = flt_size

        if taps is not None:
            self._taps = taps
        else:
            # Create a filter that covers the full bandwidth of the input signal
            bw = 0.4
            tb = 0.2
            ripple = 0.1
            #self._taps = gr.firdes.low_pass_2(self._size, self._size, bw, tb, atten)
            made = False
            while not made:
                try:
                    self._taps = optfir.low_pass(self._size, self._size, bw, bw+tb, ripple, atten)
                    made = True
                except RuntimeError:
                    ripple += 0.01
                    made = False
                    print("Warning: set ripple to %.4f dB. If this is a problem, adjust the attenuation or create your own filter taps." % (ripple))

                    # Build in an exit strategy; if we've come this far, it ain't working.
                    if(ripple >= 1.0):
                        raise RuntimeError("optfir could not generate an appropriate filter.")

        self.pfb = gr.pfb_arb_resampler_fff(self._rate, self._taps, self._size)
        #print "PFB has %d taps\n" % (len(self._taps),)
        
        self.connect(self, self.pfb)
        self.connect(self.pfb, self)
    def test02 (self):
        # Test real BPSK sync
        excess_bw = 0.35

        sps = 4
        loop_bw = cmath.pi/100.0
        nfilts = 32
        init_phase = nfilts/2
        max_rate_deviation = 1.5
        osps = 1
        
        ntaps = 11 * int(sps*nfilts)
        #taps = gr.firdes.root_raised_cosine(nfilts, nfilts*sps,
        #                                    1.0, excess_bw, ntaps)
        taps = pfb_clock_sync_taps.taps

        self.test = digital.pfb_clock_sync_fff(sps, loop_bw, taps,
                                               nfilts, init_phase,
                                               max_rate_deviation,
                                               osps)
        
        data = 1000*[1, -1]
        self.src = gr.vector_source_f(data, False)

        # pulse shaping interpolation filter
        #rrc_taps = gr.firdes.root_raised_cosine(
        #    nfilts,          # gain
        #    nfilts,          # sampling rate based on 32 filters in resampler
        #    1.0,             # symbol rate
        #    excess_bw,       # excess bandwidth (roll-off factor)
        #    ntaps)
        rrc_taps = pfb_clock_sync_taps.rrc_taps
        self.rrc_filter = gr.pfb_arb_resampler_fff(sps, rrc_taps)

        self.snk = gr.vector_sink_f()

        self.tb.connect(self.src, self.rrc_filter, self.test, self.snk)
        self.tb.run()
        
        expected_result = 1000*[-1, 1]
        dst_data = self.snk.data()

        # Only compare last Ncmp samples
        Ncmp = 100
        len_e = len(expected_result)
        len_d = len(dst_data)
        expected_result = expected_result[len_e - Ncmp:]
        dst_data = dst_data[len_d - Ncmp:]

        #for e,d in zip(expected_result, dst_data):
        #    print e, d
        
        self.assertComplexTuplesAlmostEqual (expected_result, dst_data, 1)
    def test02(self):
        # Test real BPSK sync
        excess_bw = 0.35

        sps = 4
        loop_bw = cmath.pi / 100.0
        nfilts = 32
        init_phase = nfilts / 2
        max_rate_deviation = 1.5
        osps = 1

        ntaps = 11 * int(sps * nfilts)
        #taps = gr.firdes.root_raised_cosine(nfilts, nfilts*sps,
        #                                    1.0, excess_bw, ntaps)
        taps = pfb_clock_sync_taps.taps

        self.test = digital.pfb_clock_sync_fff(sps, loop_bw, taps, nfilts,
                                               init_phase, max_rate_deviation,
                                               osps)

        data = 1000 * [1, -1]
        self.src = gr.vector_source_f(data, False)

        # pulse shaping interpolation filter
        #rrc_taps = gr.firdes.root_raised_cosine(
        #    nfilts,          # gain
        #    nfilts,          # sampling rate based on 32 filters in resampler
        #    1.0,             # symbol rate
        #    excess_bw,       # excess bandwidth (roll-off factor)
        #    ntaps)
        rrc_taps = pfb_clock_sync_taps.rrc_taps
        self.rrc_filter = gr.pfb_arb_resampler_fff(sps, rrc_taps)

        self.snk = gr.vector_sink_f()

        self.tb.connect(self.src, self.rrc_filter, self.test, self.snk)
        self.tb.run()

        expected_result = 1000 * [-1, 1]
        dst_data = self.snk.data()

        # Only compare last Ncmp samples
        Ncmp = 100
        len_e = len(expected_result)
        len_d = len(dst_data)
        expected_result = expected_result[len_e - Ncmp:]
        dst_data = dst_data[len_d - Ncmp:]

        #for e,d in zip(expected_result, dst_data):
        #    print e, d

        self.assertComplexTuplesAlmostEqual(expected_result, dst_data, 1)