#!/usr/bin/env python3 # -*- coding: utf-8 -*- # # SPDX-License-Identifier: GPL-3.0 # # GNU Radio Python Flow Graph # Title: Not titled yet # Author: nick # GNU Radio version: 3.8.1.0 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 gnuradio import qtgui from gnuradio.filter import firdes import sip from gnuradio import analog import math from gnuradio import blocks from gnuradio import channels from gnuradio import digital from gnuradio import filter from gnuradio import gr import sys import signal from argparse import ArgumentParser from gnuradio.eng_arg import eng_float, intx from gnuradio import eng_notation from gnuradio import gr, digital, analog from gnuradio.qtgui import Range, RangeWidget from gnuradio import qtgui class gmsk_sync(gr.top_block, Qt.QWidget): def __init__(self): gr.top_block.__init__(self, "Not titled yet") Qt.QWidget.__init__(self) self.setWindowTitle("Not titled yet") 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", "gmsk_sync") try: if StrictVersion(Qt.qVersion()) < StrictVersion("5.0.0"): self.restoreGeometry(self.settings.value("geometry").toByteArray()) else: self.restoreGeometry(self.settings.value("geometry")) except: pass ################################################## # Variables ################################################## self.sps = sps = 4 self.threshold = threshold = 0.82 self.tedgain = tedgain = 0.5 self.samp_rate = samp_rate = 32000 self.modvec = modvec = digital.modulate_vector_bc(digital.cpmmod_bc(analog.cpm.GAUSSIAN, 0.5, sps, 4, 0.35) .to_basic_block(), [1,1,255,255]*7, [1]) self.maxdev = maxdev = 1.5 self.loopbw = loopbw = 0.113 self.damping = damping = 1.0 ################################################## # Blocks ################################################## self._threshold_range = Range(0, 1.0, 0.01, 0.82, 200) self._threshold_win = RangeWidget(self._threshold_range, self.set_threshold, 'Threshold', "counter_slider", float) self.top_grid_layout.addWidget(self._threshold_win) self._tedgain_range = Range(0, 20, 0.1, 0.5, 200) self._tedgain_win = RangeWidget(self._tedgain_range, self.set_tedgain, 'TED gain', "counter_slider", float) self.top_grid_layout.addWidget(self._tedgain_win) self._maxdev_range = Range(0, 4, 0.01, 1.5, 200) self._maxdev_win = RangeWidget(self._maxdev_range, self.set_maxdev, 'Max deviation', "counter_slider", float) self.top_grid_layout.addWidget(self._maxdev_win) self._loopbw_range = Range(0, 1, 0.001, 0.113, 200) self._loopbw_win = RangeWidget(self._loopbw_range, self.set_loopbw, 'Loop bandwidth', "counter_slider", float) self.top_grid_layout.addWidget(self._loopbw_win) self._damping_range = Range(0, 4, 0.01, 1.0, 200) self._damping_win = RangeWidget(self._damping_range, self.set_damping, 'Damping factor', "counter_slider", float) self.top_grid_layout.addWidget(self._damping_win) self.qtgui_time_sink_x_0_0_0_0 = qtgui.time_sink_f( 1024, #size samp_rate, #samp_rate "", #name 4 #number of inputs ) self.qtgui_time_sink_x_0_0_0_0.set_update_time(0.10) self.qtgui_time_sink_x_0_0_0_0.set_y_axis(-1, 1) self.qtgui_time_sink_x_0_0_0_0.set_y_label('Amplitude', "") self.qtgui_time_sink_x_0_0_0_0.enable_tags(True) self.qtgui_time_sink_x_0_0_0_0.set_trigger_mode(qtgui.TRIG_MODE_TAG, qtgui.TRIG_SLOPE_POS, 0.0, 0, 0, "corr_start") self.qtgui_time_sink_x_0_0_0_0.enable_autoscale(False) self.qtgui_time_sink_x_0_0_0_0.enable_grid(False) self.qtgui_time_sink_x_0_0_0_0.enable_axis_labels(True) self.qtgui_time_sink_x_0_0_0_0.enable_control_panel(True) self.qtgui_time_sink_x_0_0_0_0.enable_stem_plot(False) labels = ['Signal 1', 'Signal 2', 'Signal 3', 'Signal 4', 'Signal 5', 'Signal 6', 'Signal 7', 'Signal 8', 'Signal 9', 'Signal 10'] 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] styles = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1] markers = [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1] for i in range(4): if len(labels[i]) == 0: self.qtgui_time_sink_x_0_0_0_0.set_line_label(i, "Data {0}".format(i)) else: self.qtgui_time_sink_x_0_0_0_0.set_line_label(i, labels[i]) self.qtgui_time_sink_x_0_0_0_0.set_line_width(i, widths[i]) self.qtgui_time_sink_x_0_0_0_0.set_line_color(i, colors[i]) self.qtgui_time_sink_x_0_0_0_0.set_line_style(i, styles[i]) self.qtgui_time_sink_x_0_0_0_0.set_line_marker(i, markers[i]) self.qtgui_time_sink_x_0_0_0_0.set_line_alpha(i, alphas[i]) self._qtgui_time_sink_x_0_0_0_0_win = sip.wrapinstance(self.qtgui_time_sink_x_0_0_0_0.pyqwidget(), Qt.QWidget) self.top_grid_layout.addWidget(self._qtgui_time_sink_x_0_0_0_0_win) self.qtgui_time_sink_x_0 = qtgui.time_sink_f( 1024, #size samp_rate, #samp_rate "", #name 1 #number of inputs ) self.qtgui_time_sink_x_0.set_update_time(0.10) self.qtgui_time_sink_x_0.set_y_axis(-1, 1) self.qtgui_time_sink_x_0.set_y_label('Amplitude', "") self.qtgui_time_sink_x_0.enable_tags(True) self.qtgui_time_sink_x_0.set_trigger_mode(qtgui.TRIG_MODE_TAG, qtgui.TRIG_SLOPE_POS, 0.0, 0, 0, "corr_start") self.qtgui_time_sink_x_0.enable_autoscale(False) self.qtgui_time_sink_x_0.enable_grid(False) self.qtgui_time_sink_x_0.enable_axis_labels(True) self.qtgui_time_sink_x_0.enable_control_panel(True) self.qtgui_time_sink_x_0.enable_stem_plot(False) labels = ['Signal 1', 'Signal 2', 'Signal 3', 'Signal 4', 'Signal 5', 'Signal 6', 'Signal 7', 'Signal 8', 'Signal 9', 'Signal 10'] 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] styles = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1] markers = [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1] for i in range(1): if len(labels[i]) == 0: self.qtgui_time_sink_x_0.set_line_label(i, "Data {0}".format(i)) else: self.qtgui_time_sink_x_0.set_line_label(i, labels[i]) self.qtgui_time_sink_x_0.set_line_width(i, widths[i]) self.qtgui_time_sink_x_0.set_line_color(i, colors[i]) self.qtgui_time_sink_x_0.set_line_style(i, styles[i]) self.qtgui_time_sink_x_0.set_line_marker(i, markers[i]) self.qtgui_time_sink_x_0.set_line_alpha(i, alphas[i]) self._qtgui_time_sink_x_0_win = sip.wrapinstance(self.qtgui_time_sink_x_0.pyqwidget(), Qt.QWidget) self.top_grid_layout.addWidget(self._qtgui_time_sink_x_0_win) self.digital_symbol_sync_xx_0 = digital.symbol_sync_cc( digital.TED_DANDREA_AND_MENGALI_GEN_MSK, sps*1.02, loopbw, damping, tedgain, maxdev, 1, digital.constellation_bpsk().base(), digital.IR_MMSE_8TAP, 128, []) self.digital_cpmmod_bc_1 = digital.cpmmod_bc(analog.cpm.GAUSSIAN, 0.5, sps, 4, 0.35) self.digital_corr_est_cc_0 = digital.corr_est_cc(modvec, sps, 1, threshold, digital.THRESHOLD_ABSOLUTE) self.channels_channel_model_0 = channels.channel_model( noise_voltage=0.01, frequency_offset=0.0002, epsilon=1.0, taps=[1.0 + 1.0j], noise_seed=0, block_tags=False) self.blocks_vector_source_x_0 = blocks.vector_source_b([1,1,255,255]*8 + [1,255,1,255]*8 + [0,0,0,0]*8, True, 1, []) self.analog_quadrature_demod_cf_1 = analog.quadrature_demod_cf(math.pi/2) self.analog_quadrature_demod_cf_0 = analog.quadrature_demod_cf(sps*math.pi/2) self.analog_feedforward_agc_cc_0 = analog.feedforward_agc_cc(512, 1.0) ################################################## # Connections ################################################## self.connect((self.analog_feedforward_agc_cc_0, 0), (self.digital_corr_est_cc_0, 0)) self.connect((self.analog_quadrature_demod_cf_0, 0), (self.qtgui_time_sink_x_0, 0)) self.connect((self.analog_quadrature_demod_cf_1, 0), (self.qtgui_time_sink_x_0_0_0_0, 0)) self.connect((self.blocks_vector_source_x_0, 0), (self.digital_cpmmod_bc_1, 0)) self.connect((self.channels_channel_model_0, 0), (self.analog_feedforward_agc_cc_0, 0)) self.connect((self.digital_corr_est_cc_0, 0), (self.analog_quadrature_demod_cf_0, 0)) self.connect((self.digital_corr_est_cc_0, 0), (self.digital_symbol_sync_xx_0, 0)) self.connect((self.digital_cpmmod_bc_1, 0), (self.channels_channel_model_0, 0)) self.connect((self.digital_symbol_sync_xx_0, 0), (self.analog_quadrature_demod_cf_1, 0)) self.connect((self.digital_symbol_sync_xx_0, 1), (self.qtgui_time_sink_x_0_0_0_0, 1)) self.connect((self.digital_symbol_sync_xx_0, 2), (self.qtgui_time_sink_x_0_0_0_0, 2)) self.connect((self.digital_symbol_sync_xx_0, 3), (self.qtgui_time_sink_x_0_0_0_0, 3)) def closeEvent(self, event): self.settings = Qt.QSettings("GNU Radio", "gmsk_sync") self.settings.setValue("geometry", self.saveGeometry()) event.accept() def get_sps(self): return self.sps def set_sps(self, sps): self.sps = sps self.analog_quadrature_demod_cf_0.set_gain(self.sps*math.pi/2) def get_threshold(self): return self.threshold def set_threshold(self, threshold): self.threshold = threshold self.digital_corr_est_cc_0.set_threshold(self.threshold) def get_tedgain(self): return self.tedgain def set_tedgain(self, tedgain): self.tedgain = tedgain self.digital_symbol_sync_xx_0.set_ted_gain(self.tedgain) 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.set_samp_rate(self.samp_rate) self.qtgui_time_sink_x_0_0_0_0.set_samp_rate(self.samp_rate) def get_modvec(self): return self.modvec def set_modvec(self, modvec): self.modvec = modvec def get_maxdev(self): return self.maxdev def set_maxdev(self, maxdev): self.maxdev = maxdev def get_loopbw(self): return self.loopbw def set_loopbw(self, loopbw): self.loopbw = loopbw self.digital_symbol_sync_xx_0.set_loop_bandwidth(self.loopbw) def get_damping(self): return self.damping def set_damping(self, damping): self.damping = damping self.digital_symbol_sync_xx_0.set_damping_factor(self.damping) def main(top_block_cls=gmsk_sync, 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 sig_handler(sig=None, frame=None): Qt.QApplication.quit() signal.signal(signal.SIGINT, sig_handler) signal.signal(signal.SIGTERM, sig_handler) timer = Qt.QTimer() timer.start(500) timer.timeout.connect(lambda: None) def quitting(): tb.stop() tb.wait() qapp.aboutToQuit.connect(quitting) qapp.exec_() if __name__ == '__main__': main()