#!/usr/bin/env python # # Copyright 2004,2007,2010-2013 Free Software Foundation, Inc. # # This file is part of GNU Radio # # GNU Radio is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3, or (at your option) # any later version. # # GNU Radio is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with GNU Radio; see the file COPYING. If not, write to # the Free Software Foundation, Inc., 51 Franklin Street, # Boston, MA 02110-1301, USA. # import math from gnuradio import gr, gr_unittest, analog, blocks class test_pll_freqdet(gr_unittest.TestCase): def setUp (self): self.tb = gr.top_block() def tearDown (self): self.tb = None def test_pll_freqdet(self): expected_result = (0.0, 4.338889228818161e-08, 0.3776331578612825, 1.0993741049896133, 2.1332509128284287, 3.448827166947317, 5.017193050406445, 6.810936277840595, 8.804128662605573, 10.972292025122194, 13.292363360097312, 15.742678902380248, 18.302902979158944, 20.954030233328815, 23.678333003762834, 26.459293141999492, 29.2815901542755, 32.13105969864019, 34.99462836613535, 37.860284035876894, 40.71702547869386, 43.5548208542428, 46.364569172614004, 49.138038040003174, 51.86783994277676, 54.547378886619114, 57.17080592915505, 59.73298657053974, 62.229444428114014, 64.65634937843706, 67.01044048049889, 69.28902004673668, 71.48990028218192, 73.61137363954212, 75.65217724529884, 77.61146325478951, 79.48876920728905, 81.28396466515709, 82.9972452848542, 84.62912095897468, 86.18033873945902, 87.65188876657749, 89.0449983399466, 90.36106669970881, 91.6016768844999, 92.76854829957963, 93.86354857479924, 94.88865206171563, 95.84592204664062, 96.73751075064077, 97.56564154258655, 98.33257336525031, 99.04061259327368, 99.69208931723288, 100.28935141465512, 100.83475862103487, 101.33065881389933, 101.77937615484109, 102.18323480545271, 102.54452335342484, 102.8654948125462, 103.14836662270359, 103.39530879191456, 103.6084320383601, 103.78982336428665, 103.94148676616939, 104.06536695064705, 104.16337305045634, 104.23733119256288, 104.28900821409572, 104.32008794641274, 104.33220678900258, 104.32694185151738, 104.30578723783803, 104.27016590404165, 104.22144151636876, 104.16091845122337, 104.08982993720561, 104.00932619714447, 103.9205337379343, 103.82447234476369, 103.72213808688659, 103.6144440277858, 103.50225579907487, 103.38636788456353, 103.26755105212685, 103.14649306386876, 103.02383425002395, 102.90019122489248, 102.7761213129379, 102.65211069081985, 102.5286218192634, 102.40608158509168, 102.28486944325857, 102.16532927481605, 102.04778124488143, 101.93248622873554, 101.81969324369186, 101.70961573316195, 101.60243156665544) 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) if __name__ == '__main__': gr_unittest.run(test_pll_freqdet, "test_pll_freqdet.xml")