#!/usr/bin/env python2 # -*- coding: utf-8 -*- ################################################## # GNU Radio Python Flow Graph # Title: Top Block # Generated: Wed Jan 30 00:37:24 2019 ################################################## from distutils.version import StrictVersion 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 PyQt5 import Qt from PyQt5 import Qt, QtCore from PyQt5.QtCore import QObject, pyqtSlot from PyQt5import Qt from gnuradio import analog from gnuradio import blocks from gnuradio import eng_notation from gnuradio import filter from gnuradio import gr from gnuradio import qtgui from gnuradio.eng_option import eng_option from gnuradio.filter import firdes from grc_gnuradio import blks2 as grc_blks2 from optparse import OptionParser import MyCustomBlock import math import numpy import sip import sys from gnuradio import qtgui class top_block(gr.top_block, Qt.QWidget): def __init__(self): gr.top_block.__init__(self, "Top Block") Qt.QWidget.__init__(self) self.setWindowTitle("Top Block") 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", "top_block") if StrictVersion(Qt.qVersion()) < StrictVersion("5.0.0"): self.restoreGeometry(self.settings.value("geometry").toByteArray()) else: self.restoreGeometry(self.settings.value("geometry", type=QtCore.QByteArray)) ################################################## # Variables ################################################## self.sps = sps = 8 self.nfilts = nfilts = 64 self.samp_rate = samp_rate = 32000 self.excess_bw = excess_bw = 0.35 self.bits_per_symbol = bits_per_symbol = 2 self.EbN0 = EbN0 = 16 self.Delay = Delay = nfilts/sps ################################################## # Blocks ################################################## self._EbN0_options = (10, 14, 16, 18, 30, ) self._EbN0_labels = (str(self._EbN0_options[0]), str(self._EbN0_options[1]), str(self._EbN0_options[2]), str(self._EbN0_options[3]), str(self._EbN0_options[4]), ) self._EbN0_tool_bar = Qt.QToolBar(self) self._EbN0_tool_bar.addWidget(Qt.QLabel('EbN0 (dB)'+": ")) self._EbN0_combo_box = Qt.QComboBox() self._EbN0_tool_bar.addWidget(self._EbN0_combo_box) for label in self._EbN0_labels: self._EbN0_combo_box.addItem(label) self._EbN0_callback = lambda i: Qt.QMetaObject.invokeMethod(self._EbN0_combo_box, "setCurrentIndex", Qt.Q_ARG("int", self._EbN0_options.index(i))) self._EbN0_callback(self.EbN0) self._EbN0_combo_box.currentIndexChanged.connect( lambda i: self.set_EbN0(self._EbN0_options[i])) self.top_layout.addWidget(self._EbN0_tool_bar) self.root_raised_cosine_filter_1 = filter.fir_filter_ccf(1, firdes.root_raised_cosine( 1, sps, 1.0, excess_bw, nfilts)) self.root_raised_cosine_filter_0 = filter.fir_filter_ccf(1, firdes.root_raised_cosine( 1, sps, 1.0, excess_bw, nfilts)) self.qtgui_number_sink_0 = qtgui.number_sink( gr.sizeof_float, 0, qtgui.NUM_GRAPH_HORIZ, 1 ) self.qtgui_number_sink_0.set_update_time(0.10) self.qtgui_number_sink_0.set_title("") labels = ['', '', '', '', '', '', '', '', '', ''] units = ['', '', '', '', '', '', '', '', '', ''] colors = [("black", "black"), ("black", "black"), ("black", "black"), ("black", "black"), ("black", "black"), ("black", "black"), ("black", "black"), ("black", "black"), ("black", "black"), ("black", "black")] factor = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1] for i in xrange(1): self.qtgui_number_sink_0.set_min(i, -1) self.qtgui_number_sink_0.set_max(i, 1) self.qtgui_number_sink_0.set_color(i, colors[i][0], colors[i][1]) if len(labels[i]) == 0: self.qtgui_number_sink_0.set_label(i, "Data {0}".format(i)) else: self.qtgui_number_sink_0.set_label(i, labels[i]) self.qtgui_number_sink_0.set_unit(i, units[i]) self.qtgui_number_sink_0.set_factor(i, factor[i]) self.qtgui_number_sink_0.enable_autoscale(False) self._qtgui_number_sink_0_win = sip.wrapinstance(self.qtgui_number_sink_0.pyqwidget(), Qt.QWidget) self.top_layout.addWidget(self._qtgui_number_sink_0_win) self.qtgui_bercurve_sink_0 = qtgui.ber_sink_b( numpy.arange(0.0, 4.0, .5), #range of esnos 1, #number of curves 100, #ensure at least -7.0, #cutoff [], #indiv. curve names ) self.qtgui_bercurve_sink_0.set_update_time(0.10) self.qtgui_bercurve_sink_0.set_y_axis(-10, 0) self.qtgui_bercurve_sink_0.set_x_axis(numpy.arange(0.0, 4.0, .5)[0], numpy.arange(0.0, 4.0, .5)[-1]) labels = ['', '', '', '', '', '', '', '', '', ''] widths = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1] colors = ["blue", "red", "green", "black", "cyan", "magenta", "yellow", "dark red", "dark green", "blue"] styles = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1] markers = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0] alphas = [.35, 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_bercurve_sink_0.set_line_label(i, "Data {0}".format(i)) else: self.qtgui_bercurve_sink_0.set_line_label(i, labels[i]) self.qtgui_bercurve_sink_0.set_line_width(i, widths[i]) self.qtgui_bercurve_sink_0.set_line_color(i, colors[i]) self.qtgui_bercurve_sink_0.set_line_style(i, styles[i]) self.qtgui_bercurve_sink_0.set_line_marker(i, markers[i]) self.qtgui_bercurve_sink_0.set_line_alpha(i, alphas[i]) self._qtgui_bercurve_sink_0_win = sip.wrapinstance(self.qtgui_bercurve_sink_0.pyqwidget(), Qt.QWidget) self.top_layout.addWidget(self._qtgui_bercurve_sink_0_win) self.blocks_throttle_0 = blocks.throttle(gr.sizeof_char*1, samp_rate,True) self.blocks_delay_0 = blocks.delay(gr.sizeof_char*1, Delay) self.blocks_add_xx_0 = blocks.add_vcc(1) self.blks2_error_rate_0 = grc_blks2.error_rate( type='BER', win_size=1000000, bits_per_symbol=2, ) self.analog_random_source_x_0 = blocks.vector_source_b(map(int, numpy.random.randint(0, 4, 1000000)), True) self.analog_noise_source_x_0 = analog.noise_source_c(analog.GR_GAUSSIAN, 1.0 / math.sqrt(bits_per_symbol * 10**(float(EbN0) / 10)), 0) self.MyCustomBlock_Sample_Down_0 = MyCustomBlock.Sample_Down(sps) self.MyCustomBlock_SampleUp2_0 = MyCustomBlock.SampleUp2(sps) self.MyCustomBlock_QPSK_Modulator_1 = MyCustomBlock.QPSK_Modulator(False) self.MyCustomBlock_QPSK_Demodulator_0 = MyCustomBlock.QPSK_Demodulator(False) ################################################## # Connections ################################################## self.connect((self.MyCustomBlock_QPSK_Demodulator_0, 0), (self.blks2_error_rate_0, 1)) self.connect((self.MyCustomBlock_QPSK_Demodulator_0, 0), (self.qtgui_bercurve_sink_0, 1)) self.connect((self.MyCustomBlock_QPSK_Demodulator_0, 0), (self.qtgui_bercurve_sink_0, 11)) self.connect((self.MyCustomBlock_QPSK_Demodulator_0, 0), (self.qtgui_bercurve_sink_0, 13)) self.connect((self.MyCustomBlock_QPSK_Demodulator_0, 0), (self.qtgui_bercurve_sink_0, 15)) self.connect((self.MyCustomBlock_QPSK_Demodulator_0, 0), (self.qtgui_bercurve_sink_0, 3)) self.connect((self.MyCustomBlock_QPSK_Demodulator_0, 0), (self.qtgui_bercurve_sink_0, 5)) self.connect((self.MyCustomBlock_QPSK_Demodulator_0, 0), (self.qtgui_bercurve_sink_0, 7)) self.connect((self.MyCustomBlock_QPSK_Demodulator_0, 0), (self.qtgui_bercurve_sink_0, 9)) self.connect((self.MyCustomBlock_QPSK_Modulator_1, 0), (self.MyCustomBlock_SampleUp2_0, 0)) self.connect((self.MyCustomBlock_SampleUp2_0, 0), (self.root_raised_cosine_filter_0, 0)) self.connect((self.MyCustomBlock_Sample_Down_0, 0), (self.MyCustomBlock_QPSK_Demodulator_0, 0)) self.connect((self.analog_noise_source_x_0, 0), (self.blocks_add_xx_0, 1)) self.connect((self.analog_random_source_x_0, 0), (self.blocks_delay_0, 0)) self.connect((self.analog_random_source_x_0, 0), (self.blocks_throttle_0, 0)) self.connect((self.analog_random_source_x_0, 0), (self.qtgui_bercurve_sink_0, 0)) self.connect((self.analog_random_source_x_0, 0), (self.qtgui_bercurve_sink_0, 10)) self.connect((self.analog_random_source_x_0, 0), (self.qtgui_bercurve_sink_0, 12)) self.connect((self.analog_random_source_x_0, 0), (self.qtgui_bercurve_sink_0, 14)) self.connect((self.analog_random_source_x_0, 0), (self.qtgui_bercurve_sink_0, 2)) self.connect((self.analog_random_source_x_0, 0), (self.qtgui_bercurve_sink_0, 4)) self.connect((self.analog_random_source_x_0, 0), (self.qtgui_bercurve_sink_0, 6)) self.connect((self.analog_random_source_x_0, 0), (self.qtgui_bercurve_sink_0, 8)) self.connect((self.blks2_error_rate_0, 0), (self.qtgui_number_sink_0, 0)) self.connect((self.blocks_add_xx_0, 0), (self.root_raised_cosine_filter_1, 0)) self.connect((self.blocks_delay_0, 0), (self.blks2_error_rate_0, 0)) self.connect((self.blocks_throttle_0, 0), (self.MyCustomBlock_QPSK_Modulator_1, 0)) self.connect((self.root_raised_cosine_filter_0, 0), (self.blocks_add_xx_0, 0)) self.connect((self.root_raised_cosine_filter_1, 0), (self.MyCustomBlock_Sample_Down_0, 0)) def closeEvent(self, event): self.settings = Qt.QSettings("GNU Radio", "top_block") self.settings.setValue("geometry", self.saveGeometry()) event.accept() def get_sps(self): return self.sps def set_sps(self, sps): self.sps = sps self.set_Delay(self.nfilts/self.sps) self.root_raised_cosine_filter_1.set_taps(firdes.root_raised_cosine(1, self.sps, 1.0, self.excess_bw, self.nfilts)) self.root_raised_cosine_filter_0.set_taps(firdes.root_raised_cosine(1, self.sps, 1.0, self.excess_bw, self.nfilts)) def get_nfilts(self): return self.nfilts def set_nfilts(self, nfilts): self.nfilts = nfilts self.set_Delay(self.nfilts/self.sps) self.root_raised_cosine_filter_1.set_taps(firdes.root_raised_cosine(1, self.sps, 1.0, self.excess_bw, self.nfilts)) self.root_raised_cosine_filter_0.set_taps(firdes.root_raised_cosine(1, self.sps, 1.0, self.excess_bw, self.nfilts)) def get_samp_rate(self): return self.samp_rate def set_samp_rate(self, samp_rate): self.samp_rate = samp_rate self.blocks_throttle_0.set_sample_rate(self.samp_rate) def get_excess_bw(self): return self.excess_bw def set_excess_bw(self, excess_bw): self.excess_bw = excess_bw self.root_raised_cosine_filter_1.set_taps(firdes.root_raised_cosine(1, self.sps, 1.0, self.excess_bw, self.nfilts)) self.root_raised_cosine_filter_0.set_taps(firdes.root_raised_cosine(1, self.sps, 1.0, self.excess_bw, self.nfilts)) def get_bits_per_symbol(self): return self.bits_per_symbol def set_bits_per_symbol(self, bits_per_symbol): self.bits_per_symbol = bits_per_symbol self.analog_noise_source_x_0.set_amplitude(1.0 / math.sqrt(self.bits_per_symbol * 10**(float(self.EbN0) / 10))) def get_EbN0(self): return self.EbN0 def set_EbN0(self, EbN0): self.EbN0 = EbN0 self._EbN0_callback(self.EbN0) self.analog_noise_source_x_0.set_amplitude(1.0 / math.sqrt(self.bits_per_symbol * 10**(float(self.EbN0) / 10))) def get_Delay(self): return self.Delay def set_Delay(self, Delay): self.Delay = Delay self.blocks_delay_0.set_dly(self.Delay) def main(top_block_cls=top_block, options=None): if StrictVersion("4.5.0") <= StrictVersion(Qt.qVersion()) < StrictVersion("5.0.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.aboutToQuit.connect(quitting) qapp.exec_() if __name__ == '__main__': main()