#!/usr/bin/env python2 # -*- coding: utf-8 -*- ################################################## # GNU Radio Python Flow Graph # Title: Digital Freq Lock # Generated: Tue Jan 31 11:06:46 2017 ################################################## if __name__ == '__main__': import ctypes import sys if sys.platform.startswith('linux'): try: x11 = ctypes.cdll.LoadLibrary('libX11.so') x11.XInitThreads() except: print "Warning: failed to XInitThreads()" from PyQt4 import Qt from gnuradio import blocks from gnuradio import channels from gnuradio import digital from gnuradio import eng_notation from gnuradio import gr from gnuradio import qtgui from gnuradio.eng_option import eng_option from gnuradio.filter import firdes from gnuradio.qtgui import Range, RangeWidget from optparse import OptionParser import numpy import sip import sys from gnuradio import qtgui class digital_freq_lock(gr.top_block, Qt.QWidget): def __init__(self): gr.top_block.__init__(self, "Digital Freq Lock") Qt.QWidget.__init__(self) self.setWindowTitle("Digital Freq Lock") qtgui.util.check_set_qss() try: self.setWindowIcon(Qt.QIcon.fromTheme('gnuradio-grc')) except: pass self.top_scroll_layout = Qt.QVBoxLayout() self.setLayout(self.top_scroll_layout) self.top_scroll = Qt.QScrollArea() self.top_scroll.setFrameStyle(Qt.QFrame.NoFrame) self.top_scroll_layout.addWidget(self.top_scroll) self.top_scroll.setWidgetResizable(True) self.top_widget = Qt.QWidget() self.top_scroll.setWidget(self.top_widget) self.top_layout = Qt.QVBoxLayout(self.top_widget) self.top_grid_layout = Qt.QGridLayout() self.top_layout.addLayout(self.top_grid_layout) self.settings = Qt.QSettings("GNU Radio", "digital_freq_lock") self.restoreGeometry(self.settings.value("geometry").toByteArray()) ################################################## # Variables ################################################## self.sps = sps = 4 self.samp_rate = samp_rate = 32000 self.rolloff = rolloff = 0.35 self.noise_amp = noise_amp = 0 self.freq_offset = freq_offset = 0 self.freq_bw = freq_bw = 0 ################################################## # Blocks ################################################## self.notebook = Qt.QTabWidget() self.notebook_widget_0 = Qt.QWidget() self.notebook_layout_0 = Qt.QBoxLayout(Qt.QBoxLayout.TopToBottom, self.notebook_widget_0) self.notebook_grid_layout_0 = Qt.QGridLayout() self.notebook_layout_0.addLayout(self.notebook_grid_layout_0) self.notebook.addTab(self.notebook_widget_0, 'Frequency') self.notebook_widget_1 = Qt.QWidget() self.notebook_layout_1 = Qt.QBoxLayout(Qt.QBoxLayout.TopToBottom, self.notebook_widget_1) self.notebook_grid_layout_1 = Qt.QGridLayout() self.notebook_layout_1.addLayout(self.notebook_grid_layout_1) self.notebook.addTab(self.notebook_widget_1, 'Time') self.top_grid_layout.addWidget(self.notebook, 2, 0, 1, 2) self._noise_amp_range = Range(0, 1, 0.01, 0, 200) self._noise_amp_win = RangeWidget(self._noise_amp_range, self.set_noise_amp, 'Channel Noise', "counter_slider", float) self.top_grid_layout.addWidget(self._noise_amp_win, 0, 0, 1, 1) self._freq_offset_range = Range(-.5, .5, 0.01, 0, 200) self._freq_offset_win = RangeWidget(self._freq_offset_range, self.set_freq_offset, 'Frequency Offset', "counter_slider", float) self.top_grid_layout.addWidget(self._freq_offset_win, 0, 1, 1, 1) self._freq_bw_range = Range(0, 0.1, 0.001, 0, 200) self._freq_bw_win = RangeWidget(self._freq_bw_range, self.set_freq_bw, "freq_bw", "counter_slider", float) self.top_grid_layout.addWidget(self._freq_bw_win, 1, 0, 1, 2) self.qtgui_time_sink_x_0_0 = Template error: #set $win = 'self._%s_win'%$id qtgui.$(type.fcn)( $size, \#size $srate, \#samp_rate $name, \#name #if $type.t == 'message' then 0 else $nconnections# \#number of inputs ) self.$(id).set_update_time($update_time) self.$(id).set_y_axis($ymin, $ymax) self.$(id).set_y_label($ylabel, $yunit) self.$(id).enable_tags(-1, $entags) self.$(id).set_trigger_mode($tr_mode, $tr_slope, $tr_level, $tr_delay, $tr_chan, $tr_tag) self.$(id).enable_autoscale($autoscale) self.$(id).enable_grid($grid) self.$(id).enable_axis_labels($axislabels) self.$(id).enable_control_panel($ctrlpanel) if not $legend: self.$(id).disable_legend() labels = [$label1, $label2, $label3, $label4, $label5, $label6, $label7, $label8, $label9, $label10] widths = [$width1, $width2, $width3, $width4, $width5, $width6, $width7, $width8, $width9, $width10] colors = [$color1, $color2, $color3, $color4, $color5, $color6, $color7, $color8, $color9, $color10] styles = [$style1, $style2, $style3, $style4, $style5, $style6, $style7, $style8, $style9, $style10] markers = [$marker1, $marker2, $marker3, $marker4, $marker5, $marker6, $marker7, $marker8, $marker9, $marker10] alphas = [$alpha1, $alpha2, $alpha3, $alpha4, $alpha5, $alpha6, $alpha7, $alpha8, $alpha9, $alpha10] #if($type() == "complex" or $type() == "msg_complex") for i in xrange(#if $type.t == 'message' then 2 else 2*$nconnections#): if len(labels[i]) == 0: if(i % 2 == 0): self.$(id).set_line_label(i, "Re{{Data {0}}}".format(i/2)) else: self.$(id).set_line_label(i, "Im{{Data {0}}}".format(i/2)) else: self.$(id).set_line_label(i, labels[i]) self.$(id).set_line_width(i, widths[i]) self.$(id).set_line_color(i, colors[i]) self.$(id).set_line_style(i, styles[i]) self.$(id).set_line_marker(i, markers[i]) self.$(id).set_line_alpha(i, alphas[i]) #else for i in xrange(#if $type.t == 'message' then 1 else $nconnections#): if len(labels[i]) == 0: self.$(id).set_line_label(i, "Data {0}".format(i)) else: self.$(id).set_line_label(i, labels[i]) self.$(id).set_line_width(i, widths[i]) self.$(id).set_line_color(i, colors[i]) self.$(id).set_line_style(i, styles[i]) self.$(id).set_line_marker(i, markers[i]) self.$(id).set_line_alpha(i, alphas[i]) #end if self._$(id)_win = sip.wrapinstance(self.$(id).pyqwidget(), Qt.QWidget) $(gui_hint()($win)) unsupported operand type(s) for *: 'int' and 'TemplateArg' self.qtgui_time_sink_x_0 = Template error: #set $win = 'self._%s_win'%$id qtgui.$(type.fcn)( $size, \#size $srate, \#samp_rate $name, \#name #if $type.t == 'message' then 0 else $nconnections# \#number of inputs ) self.$(id).set_update_time($update_time) self.$(id).set_y_axis($ymin, $ymax) self.$(id).set_y_label($ylabel, $yunit) self.$(id).enable_tags(-1, $entags) self.$(id).set_trigger_mode($tr_mode, $tr_slope, $tr_level, $tr_delay, $tr_chan, $tr_tag) self.$(id).enable_autoscale($autoscale) self.$(id).enable_grid($grid) self.$(id).enable_axis_labels($axislabels) self.$(id).enable_control_panel($ctrlpanel) if not $legend: self.$(id).disable_legend() labels = [$label1, $label2, $label3, $label4, $label5, $label6, $label7, $label8, $label9, $label10] widths = [$width1, $width2, $width3, $width4, $width5, $width6, $width7, $width8, $width9, $width10] colors = [$color1, $color2, $color3, $color4, $color5, $color6, $color7, $color8, $color9, $color10] styles = [$style1, $style2, $style3, $style4, $style5, $style6, $style7, $style8, $style9, $style10] markers = [$marker1, $marker2, $marker3, $marker4, $marker5, $marker6, $marker7, $marker8, $marker9, $marker10] alphas = [$alpha1, $alpha2, $alpha3, $alpha4, $alpha5, $alpha6, $alpha7, $alpha8, $alpha9, $alpha10] #if($type() == "complex" or $type() == "msg_complex") for i in xrange(#if $type.t == 'message' then 2 else 2*$nconnections#): if len(labels[i]) == 0: if(i % 2 == 0): self.$(id).set_line_label(i, "Re{{Data {0}}}".format(i/2)) else: self.$(id).set_line_label(i, "Im{{Data {0}}}".format(i/2)) else: self.$(id).set_line_label(i, labels[i]) self.$(id).set_line_width(i, widths[i]) self.$(id).set_line_color(i, colors[i]) self.$(id).set_line_style(i, styles[i]) self.$(id).set_line_marker(i, markers[i]) self.$(id).set_line_alpha(i, alphas[i]) #else for i in xrange(#if $type.t == 'message' then 1 else $nconnections#): if len(labels[i]) == 0: self.$(id).set_line_label(i, "Data {0}".format(i)) else: self.$(id).set_line_label(i, labels[i]) self.$(id).set_line_width(i, widths[i]) self.$(id).set_line_color(i, colors[i]) self.$(id).set_line_style(i, styles[i]) self.$(id).set_line_marker(i, markers[i]) self.$(id).set_line_alpha(i, alphas[i]) #end if self._$(id)_win = sip.wrapinstance(self.$(id).pyqwidget(), Qt.QWidget) $(gui_hint()($win)) unsupported operand type(s) for *: 'int' and 'TemplateArg' self.qtgui_freq_sink_x_1 = qtgui.freq_sink_c( 1024, #size firdes.WIN_BLACKMAN_hARRIS, #wintype 0, #fc samp_rate, #bw 'Frequency Corrected Signal', #name 1 #number of inputs ) self.qtgui_freq_sink_x_1.set_update_time(0.10) self.qtgui_freq_sink_x_1.set_y_axis(-120, -20) self.qtgui_freq_sink_x_1.set_y_label('Relative Gain', 'dB') self.qtgui_freq_sink_x_1.set_trigger_mode(qtgui.TRIG_MODE_FREE, 0.0, 0, "") self.qtgui_freq_sink_x_1.enable_autoscale(False) self.qtgui_freq_sink_x_1.enable_grid(False) self.qtgui_freq_sink_x_1.set_fft_average(0.1) self.qtgui_freq_sink_x_1.enable_axis_labels(True) self.qtgui_freq_sink_x_1.enable_control_panel(False) if not True: self.qtgui_freq_sink_x_1.disable_legend() if "complex" == "float" or "complex" == "msg_float": self.qtgui_freq_sink_x_1.set_plot_pos_half(not True) labels = ['', '', '', '', '', '', '', '', '', ''] widths = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1] colors = ["blue", "red", "green", "black", "cyan", "magenta", "yellow", "dark red", "dark green", "dark blue"] alphas = [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0] for i in xrange(1): if len(labels[i]) == 0: self.qtgui_freq_sink_x_1.set_line_label(i, "Data {0}".format(i)) else: self.qtgui_freq_sink_x_1.set_line_label(i, labels[i]) self.qtgui_freq_sink_x_1.set_line_width(i, widths[i]) self.qtgui_freq_sink_x_1.set_line_color(i, colors[i]) self.qtgui_freq_sink_x_1.set_line_alpha(i, alphas[i]) self._qtgui_freq_sink_x_1_win = sip.wrapinstance(self.qtgui_freq_sink_x_1.pyqwidget(), Qt.QWidget) self.notebook_layout_0.addWidget(self._qtgui_freq_sink_x_1_win) self.qtgui_freq_sink_x_0 = qtgui.freq_sink_c( 1024, #size firdes.WIN_BLACKMAN_hARRIS, #wintype 0, #fc samp_rate, #bw 'Signal into Receiver', #name 1 #number of inputs ) self.qtgui_freq_sink_x_0.set_update_time(0.10) self.qtgui_freq_sink_x_0.set_y_axis(-120, -20) self.qtgui_freq_sink_x_0.set_y_label('Relative Gain', 'dB') self.qtgui_freq_sink_x_0.set_trigger_mode(qtgui.TRIG_MODE_FREE, 0.0, 0, "") self.qtgui_freq_sink_x_0.enable_autoscale(False) self.qtgui_freq_sink_x_0.enable_grid(False) self.qtgui_freq_sink_x_0.set_fft_average(0.1) self.qtgui_freq_sink_x_0.enable_axis_labels(True) self.qtgui_freq_sink_x_0.enable_control_panel(False) if not True: self.qtgui_freq_sink_x_0.disable_legend() if "complex" == "float" or "complex" == "msg_float": self.qtgui_freq_sink_x_0.set_plot_pos_half(not True) labels = ['', '', '', '', '', '', '', '', '', ''] widths = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1] colors = ["blue", "red", "green", "black", "cyan", "magenta", "yellow", "dark red", "dark green", "dark blue"] alphas = [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0] for i in xrange(1): if len(labels[i]) == 0: self.qtgui_freq_sink_x_0.set_line_label(i, "Data {0}".format(i)) else: self.qtgui_freq_sink_x_0.set_line_label(i, labels[i]) self.qtgui_freq_sink_x_0.set_line_width(i, widths[i]) self.qtgui_freq_sink_x_0.set_line_color(i, colors[i]) self.qtgui_freq_sink_x_0.set_line_alpha(i, alphas[i]) self._qtgui_freq_sink_x_0_win = sip.wrapinstance(self.qtgui_freq_sink_x_0.pyqwidget(), Qt.QWidget) self.notebook_layout_0.addWidget(self._qtgui_freq_sink_x_0_win) self.digital_psk_mod_0 = digital.psk.psk_mod( constellation_points=2, mod_code="gray", differential=False, samples_per_symbol=sps, excess_bw=rolloff, verbose=False, log=False, ) self.digital_fll_band_edge_cc_0 = digital.fll_band_edge_cc(sps, rolloff, 44, freq_bw) self.channels_channel_model_0 = channels.channel_model( noise_voltage=noise_amp, frequency_offset=freq_offset, epsilon=1.0, taps=(1.0, ), noise_seed=42, block_tags=False ) self.blocks_throttle_0 = blocks.throttle(gr.sizeof_gr_complex*1, samp_rate,True) self.analog_random_source_x = blocks.vector_source_b(map(int, numpy.random.randint(0, 256, 10000000)), True) ################################################## # Connections ################################################## self.connect((self.analog_random_source_x, 0), (self.digital_psk_mod_0, 0)) self.connect((self.blocks_throttle_0, 0), (self.channels_channel_model_0, 0)) self.connect((self.channels_channel_model_0, 0), (self.digital_fll_band_edge_cc_0, 0)) self.connect((self.channels_channel_model_0, 0), (self.qtgui_freq_sink_x_0, 0)) self.connect((self.channels_channel_model_0, 0), (self.qtgui_time_sink_x_0_0, 0)) self.connect((self.digital_fll_band_edge_cc_0, 0), (self.qtgui_freq_sink_x_1, 0)) self.connect((self.digital_fll_band_edge_cc_0, 0), (self.qtgui_time_sink_x_0, 0)) self.connect((self.digital_psk_mod_0, 0), (self.blocks_throttle_0, 0)) def closeEvent(self, event): self.settings = Qt.QSettings("GNU Radio", "digital_freq_lock") self.settings.setValue("geometry", self.saveGeometry()) event.accept() def get_sps(self): return self.sps def set_sps(self, sps): self.sps = sps def get_samp_rate(self): return self.samp_rate def set_samp_rate(self, samp_rate): self.samp_rate = samp_rate self.qtgui_time_sink_x_0_0.set_samp_rate(self.samp_rate) self.qtgui_time_sink_x_0.set_samp_rate(self.samp_rate) self.qtgui_freq_sink_x_1.set_frequency_range(0, self.samp_rate) self.qtgui_freq_sink_x_0.set_frequency_range(0, self.samp_rate) self.blocks_throttle_0.set_sample_rate(self.samp_rate) def get_rolloff(self): return self.rolloff def set_rolloff(self, rolloff): self.rolloff = rolloff def get_noise_amp(self): return self.noise_amp def set_noise_amp(self, noise_amp): self.noise_amp = noise_amp self.channels_channel_model_0.set_noise_voltage(self.noise_amp) def get_freq_offset(self): return self.freq_offset def set_freq_offset(self, freq_offset): self.freq_offset = freq_offset self.channels_channel_model_0.set_frequency_offset(self.freq_offset) def get_freq_bw(self): return self.freq_bw def set_freq_bw(self, freq_bw): self.freq_bw = freq_bw self.digital_fll_band_edge_cc_0.set_loop_bandwidth(self.freq_bw) def main(top_block_cls=digital_freq_lock, options=None): from distutils.version import StrictVersion if StrictVersion(Qt.qVersion()) >= StrictVersion("4.5.0"): style = gr.prefs().get_string('qtgui', 'style', 'raster') Qt.QApplication.setGraphicsSystem(style) qapp = Qt.QApplication(sys.argv) tb = top_block_cls() tb.start() tb.show() def quitting(): tb.stop() tb.wait() qapp.connect(qapp, Qt.SIGNAL("aboutToQuit()"), quitting) qapp.exec_() if __name__ == '__main__': main()