def test_006(self): ''' Test the complex AGC loop (attack and decay rate inputs) ''' tb = self.tb sampling_freq = 100 N = int(5 * sampling_freq) src1 = analog.sig_source_c(sampling_freq, analog.GR_SIN_WAVE, sampling_freq * 0.10, 100) dst1 = blocks.vector_sink_c() head = blocks.head(gr.sizeof_gr_complex, N) ref = 1 agc = analog.agc3_cc(1e-2, 1e-3, ref) tb.connect(src1, head) tb.connect(head, agc) tb.connect(agc, dst1) tb.run() dst_data = dst1.data() M = 100 result = map(lambda x: abs(x), dst_data[N - M:]) self.assertFloatTuplesAlmostEqual(result, M * [ ref, ], 4)
def test_000(self): N = 1000 # number of samples to use fs = 1000 # baseband sampling rate freq = 100 signal = analog.sig_source_c(fs, analog.GR_SIN_WAVE, freq, 1) head = blocks.head(gr.sizeof_gr_complex, N) op = channels.channel_model(0.0, 0.0, 1.0, [ 1, ], 0) snk = blocks.vector_sink_c() snk1 = blocks.vector_sink_c() op.set_noise_voltage(0.0) op.set_frequency_offset(0.0) op.set_taps([ 1, ]) op.set_timing_offset(1.0) self.tb.connect(signal, head, op, snk) self.tb.connect(op, snk1) self.tb.run() dst_data = snk.data() exp_data = snk1.data() self.assertComplexTuplesAlmostEqual(exp_data, dst_data, 5)
def test_sqr_c(self): tb = self.tb #arg6 is a bit before -PI/2 expected_result = (1j, 1j, 0, 0, 1, 1, 1+0j, 1+1j, 1j) src1 = analog.sig_source_c(8, analog.GR_SQR_WAVE, 1.0, 1.0) op = blocks.head(gr.sizeof_gr_complex, 9) dst1 = blocks.vector_sink_c() tb.connect(src1, op) tb.connect(op, dst1) tb.run() dst_data = dst1.data() self.assertEqual(expected_result, dst_data)
def test_saw_c(self): tb = self.tb expected_result = (.5+.25j, .625+.375j, .75+.5j, .875+.625j, 0+.75j, .125+.875j, .25+1j, .375+.125j, .5+.25j) src1 = analog.sig_source_c(8, analog.GR_SAW_WAVE, 1.0, 1.0) op = gr.head(gr.sizeof_gr_complex, 9) dst1 = gr.vector_sink_c() tb.connect(src1, op) tb.connect(op, dst1) tb.run() dst_data = dst1.data() self.assertComplexTuplesAlmostEqual(expected_result, dst_data, 5)
def test_tri_c(self): tb = self.tb expected_result = (1+.5j, .75+.75j, .5+1j, .25+.75j, 0+.5j, .25+.25j, .5+0j, .75+.25j, 1+.5j) src1 = analog.sig_source_c(8, analog.GR_TRI_WAVE, 1.0, 1.0) op = blocks.head(gr.sizeof_gr_complex, 9) dst1 = blocks.vector_sink_c() tb.connect(src1, op) tb.connect(op, dst1) tb.run() dst_data = dst1.data() self.assertComplexTuplesAlmostEqual(expected_result, dst_data, 5)
def test_saw_c(self): tb = self.tb expected_result = (.5 + .25j, .625 + .375j, .75 + .5j, .875 + .625j, 0 + .75j, .125 + .875j, .25 + 1j, .375 + .125j, .5 + .25j) src1 = analog.sig_source_c(8, analog.GR_SAW_WAVE, 1.0, 1.0) op = gr.head(gr.sizeof_gr_complex, 9) dst1 = gr.vector_sink_c() tb.connect(src1, op) tb.connect(op, dst1) tb.run() dst_data = dst1.data() self.assertComplexTuplesAlmostEqual(expected_result, dst_data, 5)
def test_004_connect (self): """ Advanced test: - Allocator -> IFFT -> Frequency offset -> FFT -> Serializer - FFT does shift (moves DC to middle) - Make sure input == output - Frequency offset is -2 carriers """ fft_len = 8 n_syms = 1 carr_offset = -2 freq_offset = 1.0 / fft_len * carr_offset # Normalized frequency occupied_carriers = ((-2, -1, 1, 2),) pilot_carriers = ((-3,),(3,)) pilot_symbols = ((1j,),(-1j,)) tx_data = (1, 2, 3, 4) tag_name = "len" tag = gr.tag_t() tag.offset = 0 tag.key = pmt.string_to_symbol(tag_name) tag.value = pmt.from_long(len(tx_data)) offsettag = gr.tag_t() offsettag.offset = 0 offsettag.key = pmt.string_to_symbol("ofdm_sync_carr_offset") offsettag.value = pmt.from_long(carr_offset) src = blocks.vector_source_c(tx_data, False, 1, (tag, offsettag)) alloc = digital.ofdm_carrier_allocator_cvc(fft_len, occupied_carriers, pilot_carriers, pilot_symbols, (), tag_name) tx_ifft = fft.fft_vcc(fft_len, False, (1.0/fft_len,)*fft_len, True) oscillator = analog.sig_source_c(1.0, analog.GR_COS_WAVE, freq_offset, 1.0/fft_len) mixer = blocks.multiply_cc() rx_fft = fft.fft_vcc(fft_len, True, (), True) sink2 = blocks.vector_sink_c(fft_len) self.tb.connect(rx_fft, sink2) serializer = digital.ofdm_serializer_vcc( alloc, "", 0, "ofdm_sync_carr_offset", True ) sink = blocks.vector_sink_c() self.tb.connect( src, alloc, tx_ifft, blocks.vector_to_stream(gr.sizeof_gr_complex, fft_len), (mixer, 0), blocks.stream_to_vector(gr.sizeof_gr_complex, fft_len), rx_fft, serializer, sink ) self.tb.connect(oscillator, (mixer, 1)) self.tb.run () self.assertComplexTuplesAlmostEqual(sink.data()[-len(occupied_carriers[0]):], tx_data, places=4)
def est_fmdet_cf_002(self): N = 100 src = analog.sig_source_c(1, analog.GR_SIN_WAVE, 0.2, 1) head = blocks.head(gr.sizeof_gr_complex, N) op = analog.fmdet_cf(1, 0.1, 0.3, 0.1) dst = blocks.vector_sink_f() self.tb.connect(src, head, op) self.tb.connect(op, dst) self.tb.run() result_data = dst.data()[4:N] expected_result = (100-4)*[-0.21755,] self.assertFloatTuplesAlmostEqual(expected_result, result_data, 4)
def test01(self): sps = 4 rolloff = 0.35 bw = 2 * math.pi / 100.0 ntaps = 45 # Create pulse shape filter rrc_taps = filter.firdes.root_raised_cosine(sps, sps, 1.0, rolloff, ntaps) # The frequency offset to correct foffset = 0.2 / (2.0 * math.pi) # Create a set of 1's and -1's, pulse shape and interpolate to sps random.seed(0) data = [2.0 * random.randint(0, 2) - 1.0 for i in xrange(200)] self.src = blocks.vector_source_c(data, False) self.rrc = filter.interp_fir_filter_ccf(sps, rrc_taps) # Mix symbols with a complex sinusoid to spin them self.nco = analog.sig_source_c(1, analog.GR_SIN_WAVE, foffset, 1) self.mix = blocks.multiply_cc() # FLL will despin the symbols to an arbitrary phase self.fll = digital.fll_band_edge_cc(sps, rolloff, ntaps, bw) # Create sinks for all outputs of the FLL # we will only care about the freq and error outputs self.vsnk_frq = blocks.vector_sink_f() self.nsnk_fll = blocks.null_sink(gr.sizeof_gr_complex) self.nsnk_phs = blocks.null_sink(gr.sizeof_float) self.nsnk_err = blocks.null_sink(gr.sizeof_float) # Connect the blocks self.tb.connect(self.nco, (self.mix, 1)) self.tb.connect(self.src, self.rrc, (self.mix, 0)) self.tb.connect(self.mix, self.fll, self.nsnk_fll) self.tb.connect((self.fll, 1), self.vsnk_frq) self.tb.connect((self.fll, 2), self.nsnk_phs) self.tb.connect((self.fll, 3), self.nsnk_err) self.tb.run() N = 700 dst_data = self.vsnk_frq.data()[N:] expected_result = len(dst_data) * [ -0.20, ] self.assertFloatTuplesAlmostEqual(expected_result, dst_data, 4)
def test_000(self): N = 1000 # number of samples to use fs = 1000 # baseband sampling rate freq = 100 fDTs = 0.01 K = 4 signal = analog.sig_source_c(fs, analog.GR_SIN_WAVE, freq, 1) head = blocks.head(gr.sizeof_gr_complex, N) op = channels.fading_model(8, fDTs=fDTs, LOS=True, K=K, seed=0) snk = blocks.vector_sink_c() snk1 = blocks.vector_sink_c() self.assertAlmostEqual(K, op.K(), 4) self.assertAlmostEqual(fDTs, op.fDTs(), 4)
def test01(self): sps = 4 rolloff = 0.35 bw = 2 * math.pi / 100.0 ntaps = 45 # Create pulse shape filter rrc_taps = filter.firdes.root_raised_cosine(sps, sps, 1.0, rolloff, ntaps) # The frequency offset to correct foffset = 0.2 / (2.0 * math.pi) # Create a set of 1's and -1's, pulse shape and interpolate to sps random.seed(0) data = [2.0 * random.randint(0, 2) - 1.0 for i in xrange(200)] self.src = blocks.vector_source_c(data, False) self.rrc = filter.interp_fir_filter_ccf(sps, rrc_taps) # Mix symbols with a complex sinusoid to spin them self.nco = analog.sig_source_c(1, analog.GR_SIN_WAVE, foffset, 1) self.mix = blocks.multiply_cc() # FLL will despin the symbols to an arbitrary phase self.fll = digital.fll_band_edge_cc(sps, rolloff, ntaps, bw) # Create sinks for all outputs of the FLL # we will only care about the freq and error outputs self.vsnk_frq = blocks.vector_sink_f() self.nsnk_fll = blocks.null_sink(gr.sizeof_gr_complex) self.nsnk_phs = blocks.null_sink(gr.sizeof_float) self.nsnk_err = blocks.null_sink(gr.sizeof_float) # Connect the blocks self.tb.connect(self.nco, (self.mix, 1)) self.tb.connect(self.src, self.rrc, (self.mix, 0)) self.tb.connect(self.mix, self.fll, self.nsnk_fll) self.tb.connect((self.fll, 1), self.vsnk_frq) self.tb.connect((self.fll, 2), self.nsnk_phs) self.tb.connect((self.fll, 3), self.nsnk_err) self.tb.run() N = 700 dst_data = self.vsnk_frq.data()[N:] expected_result = len(dst_data) * [-0.20] self.assertFloatTuplesAlmostEqual(expected_result, dst_data, 4)
def __init__(self, noise_voltage, freq, timing): gr.hier_block2.__init__(self, "channel_model", gr.io_signature(1, 1, gr.sizeof_gr_complex), gr.io_signature(1, 1, gr.sizeof_gr_complex)) timing_offset = filter.fractional_resampler_cc(0, timing) noise_adder = blocks.add_cc() noise = analog.noise_source_c(analog.GR_GAUSSIAN, noise_voltage, 0) freq_offset = analog.sig_source_c(1, analog.GR_SIN_WAVE, freq, 1.0, 0.0) mixer_offset = blocks.multiply_cc() self.connect(self, timing_offset) self.connect(timing_offset, (mixer_offset, 0)) self.connect(freq_offset, (mixer_offset, 1)) self.connect(mixer_offset, (noise_adder, 1)) self.connect(noise, (noise_adder, 0)) self.connect(noise_adder, self)
def __init__(self, noise_voltage, freq, timing): gr.hier_block2.__init__( self, "channel_model", gr.io_signature(1, 1, gr.sizeof_gr_complex), gr.io_signature(1, 1, gr.sizeof_gr_complex), ) timing_offset = filter.fractional_interpolator_cc(0, timing) noise_adder = blocks.add_cc() noise = analog.noise_source_c(analog.GR_GAUSSIAN, noise_voltage, 0) freq_offset = analog.sig_source_c(1, analog.GR_SIN_WAVE, freq, 1.0, 0.0) mixer_offset = blocks.multiply_cc() self.connect(self, timing_offset) self.connect(timing_offset, (mixer_offset, 0)) self.connect(freq_offset, (mixer_offset, 1)) self.connect(mixer_offset, (noise_adder, 1)) self.connect(noise, (noise_adder, 0)) self.connect(noise_adder, self)
def test_000(self): N = 1000 # number of samples to use fs = 1000 # baseband sampling rate freq = 100 signal = analog.sig_source_c(fs, analog.GR_SIN_WAVE, freq, 1) head = blocks.head(gr.sizeof_gr_complex, N) op = channels.channel_model(0.0, 0.0, 1.0, [1,], 0) snk = blocks.vector_sink_c() snk1 = blocks.vector_sink_c() op.set_noise_voltage(0.0) op.set_frequency_offset(0.0) op.set_taps([1,]) op.set_timing_offset(1.0) self.tb.connect(signal, head, op, snk) self.tb.connect(op, snk1) self.tb.run() dst_data = snk.data() exp_data = snk1.data() self.assertComplexTuplesAlmostEqual(exp_data, dst_data, 5)
def test_006(self): ''' Test the complex AGC loop (attack and decay rate inputs) ''' tb = self.tb sampling_freq = 100 N = int(5*sampling_freq) src1 = analog.sig_source_c(sampling_freq, analog.GR_SIN_WAVE, sampling_freq * 0.10, 100) dst1 = blocks.vector_sink_c() head = blocks.head(gr.sizeof_gr_complex, N) ref = 1 agc = analog.agc3_cc(1e-2, 1e-3, ref) tb.connect(src1, head) tb.connect(head, agc) tb.connect(agc, dst1) tb.run() dst_data = dst1.data() M = 100 result = map(lambda x: abs(x), dst_data[N-M:]) self.assertFloatTuplesAlmostEqual(result, M*[ref,], 4)
def test_005(self): ''' Test the complex AGC loop (attack and decay rate inputs) ''' tb = self.tb expected_result = \ ((100.000244140625+7.2191943445432116e-07j), (0.80881959199905396+0.58764183521270752j), (0.30894950032234192+0.95084899663925171j), (-0.30895623564720154+0.95086973905563354j), (-0.80887287855148315+0.58768033981323242j), (-0.99984413385391235+5.850709250410091e-09j), (-0.80889981985092163-0.58770018815994263j), (-0.30897706747055054-0.95093393325805664j), (0.30898112058639526-0.95094609260559082j), (0.80893135070800781-0.58772283792495728j), (0.99990922212600708-8.7766354184282136e-09j), (0.80894720554351807+0.58773452043533325j), (0.30899339914321899+0.95098406076431274j), (-0.30899572372436523+0.95099133253097534j), (-0.80896598100662231+0.58774799108505249j), (-0.99994778633117676+1.4628290578855285e-08j), (-0.80897533893585205-0.58775502443313599j), (-0.30900305509567261-0.95101380348205566j), (0.30900448560714722-0.95101797580718994j), (0.80898630619049072-0.58776277303695679j), (0.99997037649154663-1.7554345532744264e-08j), (0.80899184942245483+0.58776694536209106j), (0.30900871753692627+0.95103120803833008j), (-0.30900952219963074+0.95103377103805542j), (-0.8089984655380249+0.58777159452438354j), (-0.99998390674591064+2.3406109050938539e-08j), (-0.809001624584198-0.58777409791946411j), (-0.30901208519935608-0.95104163885116577j), (0.30901262164115906-0.95104306936264038j), (0.80900543928146362-0.587776780128479j), (0.99999171495437622-2.6332081404234486e-08j), (0.80900734663009644+0.58777821063995361j), (0.30901408195495605+0.95104765892028809j), (-0.30901429057121277+0.95104855298995972j), (-0.80900967121124268+0.58777981996536255j), (-0.99999648332595825+3.2183805842578295e-08j), (-0.80901080369949341-0.58778077363967896j), (-0.30901527404785156-0.95105135440826416j), (0.30901545286178589-0.95105189085006714j), (0.80901217460632324-0.58778166770935059j), (0.99999916553497314-3.5109700036173308e-08j), (0.809012770652771+0.58778214454650879j), (0.30901595950126648+0.9510534405708313j), (-0.30901598930358887+0.95105385780334473j), (-0.80901366472244263+0.58778274059295654j), (-1.0000008344650269+4.0961388947380328e-08j), (-0.8090139627456665-0.58778303861618042j), (-0.30901634693145752-0.95105475187301636j), (0.30901640653610229-0.95105493068695068j), (0.80901449918746948-0.5877833366394043j)) sampling_freq = 100 src1 = analog.sig_source_c(sampling_freq, analog.GR_SIN_WAVE, sampling_freq * 0.10, 100) dst1 = blocks.vector_sink_c() head = blocks.head(gr.sizeof_gr_complex, int(5 * sampling_freq * 0.10)) agc = analog.agc2_cc(1e-2, 1e-3, 1, 1) tb.connect(src1, head) tb.connect(head, agc) tb.connect(agc, dst1) tb.run() dst_data = dst1.data() self.assertComplexTuplesAlmostEqual(expected_result, dst_data, 4)
def test_001(self): ''' Test the complex AGC loop (single rate input) ''' tb = self.tb expected_result = ( (100.000244140625 + 7.2191943445432116e-07j), (72.892257690429688 + 52.959323883056641j), (25.089065551757812 + 77.216217041015625j), (-22.611061096191406 + 69.589706420898438j), (-53.357715606689453 + 38.766635894775391j), (-59.458671569824219 + 3.4792964243024471e-07j), (-43.373462677001953 - 31.512666702270508j), (-14.94139289855957 - 45.984889984130859j), (13.478158950805664 - 41.48150634765625j), (31.838506698608398 - 23.132022857666016j), (35.519271850585938 - 3.1176801940091536e-07j), (25.942903518676758 + 18.848621368408203j), (8.9492912292480469 + 27.5430908203125j), (-8.0852642059326172 + 24.883890151977539j), (-19.131628036499023 + 13.899936676025391j), (-21.383295059204102 + 3.1281737733479531e-07j), (-15.650330543518066 - 11.370632171630859j), (-5.4110145568847656 - 16.65339469909668j), (4.9008159637451172 - 15.083160400390625j), (11.628337860107422 - 8.4484796524047852j), (13.036135673522949 - 2.288476110834381e-07j), (9.5726661682128906 + 6.954948902130127j), (3.3216962814331055 + 10.223132133483887j), (-3.0204284191131592 + 9.2959251403808594j), (-7.1977195739746094 + 5.2294478416442871j), (-8.1072216033935547 + 1.8976157889483147e-07j), (-5.9838657379150391 - 4.3475332260131836j), (-2.0879747867584229 - 6.4261269569396973j), (1.9100792407989502 - 5.8786196708679199j), (4.5814824104309082 - 3.3286411762237549j), (5.1967458724975586 - 1.3684227440080576e-07j), (3.8647139072418213 + 2.8078789710998535j), (1.3594740629196167 + 4.1840314865112305j), (-1.2544282674789429 + 3.8607344627380371j), (-3.0366206169128418 + 2.2062335014343262j), (-3.4781389236450195 + 1.1194014604143376e-07j), (-2.6133756637573242 - 1.8987287282943726j), (-0.9293016791343689 - 2.8600969314575195j), (0.86727333068847656 - 2.6691930294036865j), (2.1243946552276611 - 1.5434627532958984j), (2.4633183479309082 - 8.6486437567145913e-08j), (1.8744727373123169 + 1.3618841171264648j), (0.67528903484344482 + 2.0783262252807617j), (-0.63866174221038818 + 1.965599536895752j), (-1.5857341289520264 + 1.152103066444397j), (-1.8640764951705933 + 7.6355092915036948e-08j), (-1.4381576776504517 - 1.0448826551437378j), (-0.52529704570770264 - 1.6166983842849731j), (0.50366902351379395 - 1.5501341819763184j), (1.26766037940979 - 0.92100900411605835j)) sampling_freq = 100 src1 = analog.sig_source_c(sampling_freq, analog.GR_SIN_WAVE, sampling_freq * 0.10, 100.0) dst1 = blocks.vector_sink_c() head = blocks.head(gr.sizeof_gr_complex, int(5 * sampling_freq * 0.10)) agc = analog.agc_cc(1e-3, 1, 1) tb.connect(src1, head) tb.connect(head, agc) tb.connect(agc, dst1) tb.run() dst_data = dst1.data() self.assertComplexTuplesAlmostEqual(expected_result, dst_data, 4)
def test_pll_freqdet(self): expected_result = (0.0, 4.33888922882e-08, 0.367369994515, 1.08135249597, 2.10983253908, 3.42221529438, 4.98940390402, 6.78379190842, 8.77923286024, 10.9510106794, 13.2758363182, 15.7317829127, 18.2982902299, 20.9561068599, 23.6755271122, 26.452952094, 29.2731265301, 32.1219053479, 34.9862418188, 37.8540971414, 40.7144315483, 43.5571390869, 46.3730179743, 49.1537231663, 51.8917218889, 54.58026103, 57.2015358514, 59.7513664199, 62.2380533124, 64.657612252, 67.006640002, 69.2822432184, 71.4820384499, 73.6041047056, 75.6469478817, 77.6094829742, 79.4909866472, 81.2911031615, 83.0097850853, 84.6355598352, 86.1820937186, 87.6504420946, 89.0418441206, 90.3577286819, 91.5996432431, 92.7692775646, 93.8684162704, 94.8989269904, 95.8627662892, 96.7619381633, 97.598505899, 98.362769679, 99.0579904444, 99.6992633875, 100.288805948, 100.828805921, 101.321421457, 101.76878699, 102.17300138, 102.536116055, 102.860158727, 103.147085962, 103.398830608, 103.617254366, 103.792467691, 103.939387906, 104.060030865, 104.15631756, 104.230085975, 104.283067372, 104.316933727, 104.333238432, 104.333440018, 104.318914008, 104.290941063, 104.250742554, 104.187634452, 104.103822339, 104.013227468, 103.916810336, 103.815448432, 103.709936239, 103.600997093, 103.489283183, 103.375351833, 103.259712936, 103.142828952, 103.025091195, 102.90686726, 102.776726069, 102.648078982, 102.521459607, 102.397294831, 102.275999684, 102.157882471, 102.043215927, 101.93218978, 101.824958181, 101.72159228, 101.622151366) sampling_freq = 10e3 freq = sampling_freq / 100 loop_bw = math.pi/100.0 maxf = 1 minf = -1 src = analog.sig_source_c(sampling_freq, analog.GR_COS_WAVE, freq, 1.0) pll = analog.pll_freqdet_cf(loop_bw, maxf, minf) head = blocks.head(gr.sizeof_float, int (freq)) dst = blocks.vector_sink_f() self.tb.connect(src, pll, head) self.tb.connect(head, dst) self.tb.run() dst_data = dst.data() # convert it from normalized frequency to absolute frequency (Hz) dst_data = [i*(sampling_freq/(2*math.pi)) for i in dst_data] self.assertFloatTuplesAlmostEqual(expected_result, dst_data, 3)
def test_pll_refout(self): expected_result = ((1+0j), (1+6.4087357643e-10j), (0.999985277653+0.00542619498447j), (0.999868750572+0.0162021834403j), (0.99948567152+0.0320679470897j), (0.99860727787+0.0527590736747j), (0.996953129768+0.0780025869608j), (0.994203746319+0.107512556016j), (0.990011692047+0.140985429287j), (0.984013140202+0.178095817566j), (0.975838363171+0.218493551016j), (0.965121984482+0.261800557375j), (0.95151245594+0.307610183954j), (0.934681296349+0.355486690998j), (0.914401650429+0.404808044434j), (0.890356600285+0.455263823271j), (0.862329125404+0.506348133087j), (0.830152392387+0.557536482811j), (0.793714106083+0.608290970325j), (0.752960026264+0.658066213131j), (0.707896590233+0.706316053867j), (0.658591926098+0.752500295639j), (0.605175673962+0.796091973782j), (0.547837555408+0.836584687233j), (0.48682525754+0.873499393463j), (0.42244040966+0.906390726566j), (0.355197101831+0.934791445732j), (0.285494059324+0.958380460739j), (0.213591173291+0.976923108101j), (0.139945343137+0.990159213543j), (0.065038472414+0.997882783413j), (-0.0106285437942+0.999943494797j), (-0.0865436866879+0.996248066425j), (-0.162189796567+0.986759603024j), (-0.23705175519+0.971496999264j), (-0.310622543097+0.950533330441j), (-0.38240903616+0.923993110657j), (-0.451937526464+0.89204955101j), (-0.518758952618+0.854920566082j), (-0.582311093807+0.812966048717j), (-0.642372369766+0.76639264822j), (-0.698591887951+0.715520322323j), (-0.750654160976+0.660695314407j), (-0.798280358315+0.602286040783j), (-0.841228663921+0.540679454803j), (-0.87929558754+0.476276367903j), (-0.912315964699+0.409486919641j), (-0.940161883831+0.340728074312j), (-0.962742805481+0.270418733358j), (-0.980004072189+0.198977485299j), (-0.991925954819+0.126818284392j), (-0.99851256609+0.0545223206282j), (-0.999846458435-0.0175215266645j), (-0.996021270752-0.0891158208251j), (-0.987133920193-0.159895718098j), (-0.973306238651-0.2295101583j), (-0.954683184624-0.297624111176j), (-0.931430280209-0.363919824362j), (-0.903732538223-0.428097635508j), (-0.871792256832-0.489875763655j), (-0.835827112198-0.548992812634j), (-0.796068251133-0.605206847191j), (-0.752758979797-0.658296227455j), (-0.706152498722-0.70805978775j), (-0.656641483307-0.754202902317j), (-0.604367733002-0.79670548439j), (-0.549597978592-0.835429251194j), (-0.492602348328-0.870254516602j), (-0.433654457331-0.901079237461j), (-0.373029649258-0.927819430828j), (-0.31100410223-0.950408577919j), (-0.247853919864-0.968797445297j), (-0.183855071664-0.982953369617j), (-0.119282215834-0.992860376835j), (-0.0544078871608-0.998518764973j), (0.0104992967099-0.999944865704j), (0.0749994292855-0.997183561325j), (0.138844624162-0.990314185619j), (0.201967850327-0.979392170906j), (0.264124274254-0.964488625526j), (0.325075358152-0.945688128471j), (0.3845885396-0.92308807373j), (0.442438393831-0.89679890871j), (0.498407125473-0.866943061352j), (0.552284479141-0.833655714989j), (0.603869199753-0.797083437443j), (0.652970373631-0.757383465767j), (0.69940674305-0.714723825455j), (0.743007957935-0.66928255558j), (0.78350687027-0.62138313055j), (0.820889055729-0.571087777615j), (0.855021059513-0.51859331131j), (0.885780930519-0.46410369873j), (0.913058102131-0.407829582691j), (0.936754107475-0.349988251925j), (0.956783294678-0.290801793337j), (0.973072886467-0.230497643352j), (0.985563337803-0.169307261705j), (0.9942086339-0.1074674353j), (0.9989772439-0.0452152714133j)) sampling_freq = 10e3 freq = sampling_freq / 100 loop_bw = math.pi/100.0 maxf = 1 minf = -1 src = analog.sig_source_c(sampling_freq, analog.GR_COS_WAVE, freq, 1.0) pll = analog.pll_refout_cc(loop_bw, maxf, minf) head = blocks.head(gr.sizeof_gr_complex, int (freq)) dst = blocks.vector_sink_c() self.tb.connect(src, pll, head) self.tb.connect(head, dst) self.tb.run() dst_data = dst.data() self.assertComplexTuplesAlmostEqual(expected_result, dst_data, 4)
def test_001(self): ''' Test the complex AGC loop (single rate input) ''' tb = self.tb expected_result = ( (100.000244140625+7.2191943445432116e-07j), (72.892257690429688+52.959323883056641j), (25.089065551757812+77.216217041015625j), (-22.611061096191406+69.589706420898438j), (-53.357715606689453+38.766635894775391j), (-59.458671569824219+3.4792964243024471e-07j), (-43.373462677001953-31.512666702270508j), (-14.94139289855957-45.984889984130859j), (13.478158950805664-41.48150634765625j), (31.838506698608398-23.132022857666016j), (35.519271850585938-3.1176801940091536e-07j), (25.942903518676758+18.848621368408203j), (8.9492912292480469+27.5430908203125j), (-8.0852642059326172+24.883890151977539j), (-19.131628036499023+13.899936676025391j), (-21.383295059204102+3.1281737733479531e-07j), (-15.650330543518066-11.370632171630859j), (-5.4110145568847656-16.65339469909668j), (4.9008159637451172-15.083160400390625j), (11.628337860107422-8.4484796524047852j), (13.036135673522949-2.288476110834381e-07j), (9.5726661682128906+6.954948902130127j), (3.3216962814331055+10.223132133483887j), (-3.0204284191131592+9.2959251403808594j), (-7.1977195739746094+5.2294478416442871j), (-8.1072216033935547+1.8976157889483147e-07j), (-5.9838657379150391-4.3475332260131836j), (-2.0879747867584229-6.4261269569396973j), (1.9100792407989502-5.8786196708679199j), (4.5814824104309082-3.3286411762237549j), (5.1967458724975586-1.3684227440080576e-07j), (3.8647139072418213+2.8078789710998535j), (1.3594740629196167+4.1840314865112305j), (-1.2544282674789429+3.8607344627380371j), (-3.0366206169128418+2.2062335014343262j), (-3.4781389236450195+1.1194014604143376e-07j), (-2.6133756637573242-1.8987287282943726j), (-0.9293016791343689-2.8600969314575195j), (0.86727333068847656-2.6691930294036865j), (2.1243946552276611-1.5434627532958984j), (2.4633183479309082-8.6486437567145913e-08j), (1.8744727373123169+1.3618841171264648j), (0.67528903484344482+2.0783262252807617j), (-0.63866174221038818+1.965599536895752j), (-1.5857341289520264+1.152103066444397j), (-1.8640764951705933+7.6355092915036948e-08j), (-1.4381576776504517-1.0448826551437378j), (-0.52529704570770264-1.6166983842849731j), (0.50366902351379395-1.5501341819763184j), (1.26766037940979-0.92100900411605835j)) sampling_freq = 100 src1 = analog.sig_source_c(sampling_freq, analog.GR_SIN_WAVE, sampling_freq * 0.10, 100.0) dst1 = blocks.vector_sink_c() head = blocks.head(gr.sizeof_gr_complex, int (5*sampling_freq * 0.10)) agc = analog.agc_cc(1e-3, 1, 1) tb.connect(src1, head) tb.connect(head, agc) tb.connect(agc, dst1) tb.run() dst_data = dst1.data() self.assertComplexTuplesAlmostEqual(expected_result, dst_data, 4)
def test_005(self): ''' Test the complex AGC loop (attack and decay rate inputs) ''' tb = self.tb expected_result = \ ((100.000244140625+7.2191943445432116e-07j), (0.80881959199905396+0.58764183521270752j), (0.30894950032234192+0.95084899663925171j), (-0.30895623564720154+0.95086973905563354j), (-0.80887287855148315+0.58768033981323242j), (-0.99984413385391235+5.850709250410091e-09j), (-0.80889981985092163-0.58770018815994263j), (-0.30897706747055054-0.95093393325805664j), (0.30898112058639526-0.95094609260559082j), (0.80893135070800781-0.58772283792495728j), (0.99990922212600708-8.7766354184282136e-09j), (0.80894720554351807+0.58773452043533325j), (0.30899339914321899+0.95098406076431274j), (-0.30899572372436523+0.95099133253097534j), (-0.80896598100662231+0.58774799108505249j), (-0.99994778633117676+1.4628290578855285e-08j), (-0.80897533893585205-0.58775502443313599j), (-0.30900305509567261-0.95101380348205566j), (0.30900448560714722-0.95101797580718994j), (0.80898630619049072-0.58776277303695679j), (0.99997037649154663-1.7554345532744264e-08j), (0.80899184942245483+0.58776694536209106j), (0.30900871753692627+0.95103120803833008j), (-0.30900952219963074+0.95103377103805542j), (-0.8089984655380249+0.58777159452438354j), (-0.99998390674591064+2.3406109050938539e-08j), (-0.809001624584198-0.58777409791946411j), (-0.30901208519935608-0.95104163885116577j), (0.30901262164115906-0.95104306936264038j), (0.80900543928146362-0.587776780128479j), (0.99999171495437622-2.6332081404234486e-08j), (0.80900734663009644+0.58777821063995361j), (0.30901408195495605+0.95104765892028809j), (-0.30901429057121277+0.95104855298995972j), (-0.80900967121124268+0.58777981996536255j), (-0.99999648332595825+3.2183805842578295e-08j), (-0.80901080369949341-0.58778077363967896j), (-0.30901527404785156-0.95105135440826416j), (0.30901545286178589-0.95105189085006714j), (0.80901217460632324-0.58778166770935059j), (0.99999916553497314-3.5109700036173308e-08j), (0.809012770652771+0.58778214454650879j), (0.30901595950126648+0.9510534405708313j), (-0.30901598930358887+0.95105385780334473j), (-0.80901366472244263+0.58778274059295654j), (-1.0000008344650269+4.0961388947380328e-08j), (-0.8090139627456665-0.58778303861618042j), (-0.30901634693145752-0.95105475187301636j), (0.30901640653610229-0.95105493068695068j), (0.80901449918746948-0.5877833366394043j)) sampling_freq = 100 src1 = analog.sig_source_c(sampling_freq, analog.GR_SIN_WAVE, sampling_freq * 0.10, 100) dst1 = blocks.vector_sink_c() head = blocks.head(gr.sizeof_gr_complex, int(5*sampling_freq * 0.10)) agc = analog.agc2_cc(1e-2, 1e-3, 1, 1) tb.connect(src1, head) tb.connect(head, agc) tb.connect(agc, dst1) tb.run() dst_data = dst1.data() self.assertComplexTuplesAlmostEqual(expected_result, dst_data, 4)
def test_pll_refout(self): expected_result = ( (1 + 0j), (1 + 6.4087357643e-10j), (0.999985277653 + 0.00542619498447j), (0.999868750572 + 0.0162021834403j), (0.99948567152 + 0.0320679470897j), (0.99860727787 + 0.0527590736747j), (0.996953129768 + 0.0780025869608j), (0.994203746319 + 0.107512556016j), (0.990011692047 + 0.140985429287j), (0.984013140202 + 0.178095817566j), (0.975838363171 + 0.218493551016j), (0.965121984482 + 0.261800557375j), (0.95151245594 + 0.307610183954j), (0.934681296349 + 0.355486690998j), (0.914401650429 + 0.404808044434j), (0.890356600285 + 0.455263823271j), (0.862329125404 + 0.506348133087j), (0.830152392387 + 0.557536482811j), (0.793714106083 + 0.608290970325j), (0.752960026264 + 0.658066213131j), (0.707896590233 + 0.706316053867j), (0.658591926098 + 0.752500295639j), (0.605175673962 + 0.796091973782j), (0.547837555408 + 0.836584687233j), (0.48682525754 + 0.873499393463j), (0.42244040966 + 0.906390726566j), (0.355197101831 + 0.934791445732j), (0.285494059324 + 0.958380460739j), (0.213591173291 + 0.976923108101j), (0.139945343137 + 0.990159213543j), (0.065038472414 + 0.997882783413j), (-0.0106285437942 + 0.999943494797j), (-0.0865436866879 + 0.996248066425j), (-0.162189796567 + 0.986759603024j), (-0.23705175519 + 0.971496999264j), (-0.310622543097 + 0.950533330441j), (-0.38240903616 + 0.923993110657j), (-0.451937526464 + 0.89204955101j), (-0.518758952618 + 0.854920566082j), (-0.582311093807 + 0.812966048717j), (-0.642372369766 + 0.76639264822j), (-0.698591887951 + 0.715520322323j), (-0.750654160976 + 0.660695314407j), (-0.798280358315 + 0.602286040783j), (-0.841228663921 + 0.540679454803j), (-0.87929558754 + 0.476276367903j), (-0.912315964699 + 0.409486919641j), (-0.940161883831 + 0.340728074312j), (-0.962742805481 + 0.270418733358j), (-0.980004072189 + 0.198977485299j), (-0.991925954819 + 0.126818284392j), (-0.99851256609 + 0.0545223206282j), (-0.999846458435 - 0.0175215266645j), (-0.996021270752 - 0.0891158208251j), (-0.987133920193 - 0.159895718098j), (-0.973306238651 - 0.2295101583j), (-0.954683184624 - 0.297624111176j), (-0.931430280209 - 0.363919824362j), (-0.903732538223 - 0.428097635508j), (-0.871792256832 - 0.489875763655j), (-0.835827112198 - 0.548992812634j), (-0.796068251133 - 0.605206847191j), (-0.752758979797 - 0.658296227455j), (-0.706152498722 - 0.70805978775j), (-0.656641483307 - 0.754202902317j), (-0.604367733002 - 0.79670548439j), (-0.549597978592 - 0.835429251194j), (-0.492602348328 - 0.870254516602j), (-0.433654457331 - 0.901079237461j), (-0.373029649258 - 0.927819430828j), (-0.31100410223 - 0.950408577919j), (-0.247853919864 - 0.968797445297j), (-0.183855071664 - 0.982953369617j), (-0.119282215834 - 0.992860376835j), (-0.0544078871608 - 0.998518764973j), (0.0104992967099 - 0.999944865704j), (0.0749994292855 - 0.997183561325j), (0.138844624162 - 0.990314185619j), (0.201967850327 - 0.979392170906j), (0.264124274254 - 0.964488625526j), (0.325075358152 - 0.945688128471j), (0.3845885396 - 0.92308807373j), (0.442438393831 - 0.89679890871j), (0.498407125473 - 0.866943061352j), (0.552284479141 - 0.833655714989j), (0.603869199753 - 0.797083437443j), (0.652970373631 - 0.757383465767j), (0.69940674305 - 0.714723825455j), (0.743007957935 - 0.66928255558j), (0.78350687027 - 0.62138313055j), (0.820889055729 - 0.571087777615j), (0.855021059513 - 0.51859331131j), (0.885780930519 - 0.46410369873j), (0.913058102131 - 0.407829582691j), (0.936754107475 - 0.349988251925j), (0.956783294678 - 0.290801793337j), (0.973072886467 - 0.230497643352j), (0.985563337803 - 0.169307261705j), (0.9942086339 - 0.1074674353j), (0.9989772439 - 0.0452152714133j)) sampling_freq = 10e3 freq = sampling_freq / 100 loop_bw = math.pi / 100.0 maxf = 1 minf = -1 src = analog.sig_source_c(sampling_freq, analog.GR_COS_WAVE, freq, 1.0) pll = analog.pll_refout_cc(loop_bw, maxf, minf) head = blocks.head(gr.sizeof_gr_complex, int(freq)) dst = blocks.vector_sink_c() self.tb.connect(src, pll, head) self.tb.connect(head, dst) self.tb.run() dst_data = dst.data() self.assertComplexTuplesAlmostEqual(expected_result, dst_data, 4)
def test_pll_carriertracking(self): expected_result = ((1.00000238419+7.21919457547e-09j), (0.998025715351+0.062790453434j), (0.992777824402+0.119947694242j), (0.985192835331+0.171441286802j), (0.976061582565+0.217501848936j), (0.966034710407+0.258409559727j), (0.95565611124+0.294477283955j), (0.945357382298+0.326030552387j), (0.935475051403+0.353395611048j), (0.926258146763+0.376889169216j), (0.917895197868+0.39681750536j), (0.910515546799+0.413470208645j), (0.904196679592+0.427117019892j), (0.898972511292+0.438006043434j), (0.894769787788+0.446523308754j), (0.891652584076+0.452715367079j), (0.8895829916+0.456773489714j), (0.888502895832+0.458873122931j), (0.888343691826+0.459175437689j), (0.889035582542+0.457833081484j), (0.890497922897+0.454985737801j), (0.892645597458+0.450762689114j), (0.895388305187+0.445282936096j), (0.898648142815+0.438664674759j), (0.902342617512+0.431016951799j), (0.906392872334+0.422441422939j), (0.910642921925+0.413191765547j), (0.915039420128+0.403358519077j), (0.919594764709+0.392864197493j), (0.92425006628+0.381792247295j), (0.928944349289+0.370217680931j), (0.933634519577+0.358220815659j), (0.938279032707+0.345874190331j), (0.942840516567+0.333247303963j), (0.947280526161+0.32040438056j), (0.951574921608+0.307409763336j), (0.955703914165+0.294323593378j), (0.959648966789+0.281201630831j), (0.963392794132+0.268095195293j), (0.966880619526+0.255221515894j), (0.970162451267+0.242447137833j), (0.973235487938+0.229809194803j), (0.97609680891+0.217341512442j), (0.978744983673+0.20507311821j), (0.981189727783+0.193033605814j), (0.983436584473+0.181248426437j), (0.985490739346+0.169738590717j), (0.987353682518+0.158523857594j), (0.989041447639+0.147622272372j), (0.990563035011+0.137049794197j), (0.991928339005+0.126818582416j), (0.993117690086+0.117111675441j), (0.994156062603+0.107930034399j), (0.995076179504+0.0990980416536j), (0.995887458324+0.0906178802252j), (0.996591091156+0.0824909061193j), (0.997202515602+0.0747182965279j), (0.997730851173+0.0672992765903j), (0.998185396194+0.0602316558361j), (0.99856698513+0.0535135567188j), (0.998885989189+0.0471420884132j), (0.99915266037+0.0411129891872j), (0.999372899532+0.0354214012623j), (0.999548316002+0.0300626158714j), (0.999680638313+0.0252036750317j), (0.999784469604+0.020652115345j), (0.999865531921+0.0163950324059j), (0.999923825264+0.0124222636223j), (0.999960243702+0.00872156023979j), (0.999983668327+0.00528120994568j), (0.999997138977+0.00209015607834j), (1.00000119209-0.00086285173893j), (0.999992132187-0.00358882546425j), (0.999979138374-0.00609711557627j), (0.999963641167-0.00839691981673j), (0.999947249889-0.0104993218556j), (0.999924004078-0.0122378543019j), (0.999904811382-0.0136305987835j), (0.999888062477-0.0148707330227j), (0.9998742342-0.0159679055214j), (0.999856114388-0.0169314742088j), (0.999839782715-0.0177700817585j), (0.999826967716-0.0184917747974j), (0.999818325043-0.0191045701504j), (0.999807476997-0.0196143388748j), (0.999797284603-0.0200265944004j), (0.999791204929-0.0203481912613j), (0.99978852272-0.0205836892128j), (0.99978530407-0.0207380950451j), (0.999785065651-0.0206423997879j), (0.999787807465-0.0204866230488j), (0.999794304371-0.0202808082104j), (0.999800384045-0.0200312435627j), (0.999803245068-0.0197458267212j), (0.9998087883-0.0194311738014j), (0.999816894531-0.0190933048725j), (0.999825954437-0.0187371373177j), (0.999829888344-0.0183679759502j), (0.999835848808-0.017987690866j), (0.999844014645-0.0176006518304j)) sampling_freq = 10e3 freq = sampling_freq / 100 loop_bw = math.pi/100.0 maxf = 1 minf = -1 src = analog.sig_source_c(sampling_freq, analog.GR_COS_WAVE, freq, 1.0) pll = analog.pll_carriertracking_cc(loop_bw, maxf, minf) head = blocks.head(gr.sizeof_gr_complex, int (freq)) dst = blocks.vector_sink_c() self.tb.connect(src, pll, head) self.tb.connect(head, dst) self.tb.run() dst_data = dst.data() self.assertComplexTuplesAlmostEqual(expected_result, dst_data, 5)