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)