aboutsummaryrefslogtreecommitdiffstats
path: root/flowgraphs/qpsk_sim.py
diff options
context:
space:
mode:
authorsara <sara.halter@gmx.ch>2021-12-17 19:44:51 +0100
committersara <sara.halter@gmx.ch>2021-12-17 19:44:51 +0100
commit38576cd7fc8992a6ae86e7213e62842f7a101849 (patch)
tree9adefd05cb8a96eb169f7f399e5e868787d609db /flowgraphs/qpsk_sim.py
parentUpdate fading table (diff)
downloadFading-38576cd7fc8992a6ae86e7213e62842f7a101849.tar.gz
Fading-38576cd7fc8992a6ae86e7213e62842f7a101849.zip
Doku exemple real
Diffstat (limited to '')
-rwxr-xr-xflowgraphs/qpsk_sim.py147
1 files changed, 127 insertions, 20 deletions
diff --git a/flowgraphs/qpsk_sim.py b/flowgraphs/qpsk_sim.py
index a7820ae..3c2b288 100755
--- a/flowgraphs/qpsk_sim.py
+++ b/flowgraphs/qpsk_sim.py
@@ -9,6 +9,21 @@
# Author: Naoki Sean Pross, Sara Cinzia Halter
# GNU Radio version: 3.8.2.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
+import sip
from gnuradio import blocks
import numpy
from gnuradio import channels
@@ -23,16 +38,45 @@ from gnuradio import eng_notation
import fadingui
import numpy as np
+from gnuradio import qtgui
-class qpsk_sim(gr.top_block):
+class qpsk_sim(gr.top_block, Qt.QWidget):
def __init__(self):
gr.top_block.__init__(self, "QPSK Sim")
+ Qt.QWidget.__init__(self)
+ self.setWindowTitle("QPSK Sim")
+ 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", "qpsk_sim")
+
+ 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.testvec = testvec = [0x1f, 0x35] + [0x12, 0x48, 0x12, 0x45]
+ self.testvec = testvec = [0x1f, 0x35] + [0x12, 0x48]
self.sps = sps = 4
self.nfilts = nfilts = 32
self.excess_bw = excess_bw = 0.35
@@ -46,6 +90,46 @@ class qpsk_sim(gr.top_block):
##################################################
# Blocks
##################################################
+ self.qtgui_const_sink_x_1 = qtgui.const_sink_c(
+ 1024, #size
+ "", #name
+ 2 #number of inputs
+ )
+ self.qtgui_const_sink_x_1.set_update_time(0.10)
+ self.qtgui_const_sink_x_1.set_y_axis(-2, 2)
+ self.qtgui_const_sink_x_1.set_x_axis(-2, 2)
+ self.qtgui_const_sink_x_1.set_trigger_mode(qtgui.TRIG_MODE_FREE, qtgui.TRIG_SLOPE_POS, 0.0, 0, "")
+ self.qtgui_const_sink_x_1.enable_autoscale(False)
+ self.qtgui_const_sink_x_1.enable_grid(False)
+ self.qtgui_const_sink_x_1.enable_axis_labels(True)
+
+
+ labels = ['', '', '', '', '',
+ '', '', '', '', '']
+ widths = [1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1]
+ colors = ["blue", "red", "red", "red", "red",
+ "red", "red", "red", "red", "red"]
+ styles = [0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0]
+ markers = [0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0]
+ alphas = [1.0, 1.0, 1.0, 1.0, 1.0,
+ 1.0, 1.0, 1.0, 1.0, 1.0]
+
+ for i in range(2):
+ if len(labels[i]) == 0:
+ self.qtgui_const_sink_x_1.set_line_label(i, "Data {0}".format(i))
+ else:
+ self.qtgui_const_sink_x_1.set_line_label(i, labels[i])
+ self.qtgui_const_sink_x_1.set_line_width(i, widths[i])
+ self.qtgui_const_sink_x_1.set_line_color(i, colors[i])
+ self.qtgui_const_sink_x_1.set_line_style(i, styles[i])
+ self.qtgui_const_sink_x_1.set_line_marker(i, markers[i])
+ self.qtgui_const_sink_x_1.set_line_alpha(i, alphas[i])
+
+ self._qtgui_const_sink_x_1_win = sip.wrapinstance(self.qtgui_const_sink_x_1.pyqwidget(), Qt.QWidget)
+ self.top_grid_layout.addWidget(self._qtgui_const_sink_x_1_win)
self.fadingui_phasecorrection_0 = fadingui.phasecorrection(frame_len)
self.fadingui_netsink_4 = fadingui.netsink(address='udp://localhost:31417', dtype="complex", vlen=1)
self.fadingui_netsink_3 = fadingui.netsink(address='udp://localhost:31419', dtype="complex", vlen=1)
@@ -65,20 +149,21 @@ class qpsk_sim(gr.top_block):
log=False)
self.digital_constellation_decoder_cb_0 = digital.constellation_decoder_cb(qpsk_const)
self.digital_cma_equalizer_cc_0 = digital.cma_equalizer_cc(15, 1, 2e-3, 1)
- self.channels_selective_fading_model_0 = channels.selective_fading_model( 8, ((2*carrier_freq)/(3*10e8))/samp_rate, False, 4.0, 21, (0,1.8), (1,0.12), 8 )
- self.channels_channel_model_0 = channels.channel_model(
- noise_voltage=100e-3,
- frequency_offset=2e-3,
- epsilon=1.0,
- taps=[np.exp(1j * 30 / 180 * np.pi)],
- noise_seed=243,
- block_tags=False)
+ self.channels_selective_fading_model_0 = channels.selective_fading_model( 8, 5/samp_rate, True, 5, 0, (0,0.05e-6/samp_rate,0.12e-6/samp_rate,0.2e-6/samp_rate,0.23e-6/samp_rate,0.5e-6/samp_rate,1.6e-6/samp_rate,2.3e-6/samp_rate,5e-6/samp_rate), (0.7943282347242815,0.7943282347242815,0.7943282347242815,1,1,1,0.5011872336272722,0.31622776601683794,0.19952623149688797), 9 )
self.blocks_vector_source_x_0 = blocks.vector_source_b(testvec, True, 1, [])
self.blocks_throttle_0 = blocks.throttle(gr.sizeof_gr_complex*1, samp_rate,True)
self.blocks_tagged_stream_align_0 = blocks.tagged_stream_align(gr.sizeof_char*1, 'frame_start')
self.blocks_stream_to_vector_0 = blocks.stream_to_vector(gr.sizeof_char*1, frame_len)
self.blocks_stream_mux_0 = blocks.stream_mux(gr.sizeof_char*1, [len(testvec), 4])
self.blocks_repack_bits_bb_0 = blocks.repack_bits_bb(2, 8, "", False, gr.GR_LSB_FIRST)
+ self.blocks_file_sink_3 = blocks.file_sink(gr.sizeof_gr_complex*1, 'data/qpsk_equalized.dat', False)
+ self.blocks_file_sink_3.set_unbuffered(False)
+ self.blocks_file_sink_2 = blocks.file_sink(gr.sizeof_gr_complex*1, 'data/qpsk_sync.dat', False)
+ self.blocks_file_sink_2.set_unbuffered(False)
+ self.blocks_file_sink_1 = blocks.file_sink(gr.sizeof_gr_complex*1, 'data/qpsk_locked.dat', False)
+ self.blocks_file_sink_1.set_unbuffered(False)
+ self.blocks_file_sink_0 = blocks.file_sink(gr.sizeof_gr_complex*1, 'data/qpsk_channel.dat', False)
+ self.blocks_file_sink_0.set_unbuffered(False)
self.blocks_complex_to_mag_0 = blocks.complex_to_mag(1)
self.analog_random_source_x_0 = blocks.vector_source_b(list(map(int, numpy.random.randint(0, 255, 400))), True)
@@ -93,23 +178,33 @@ class qpsk_sim(gr.top_block):
self.connect((self.blocks_stream_mux_0, 0), (self.digital_constellation_modulator_0, 0))
self.connect((self.blocks_stream_to_vector_0, 0), (self.fadingui_ber_0, 0))
self.connect((self.blocks_tagged_stream_align_0, 0), (self.blocks_repack_bits_bb_0, 0))
- self.connect((self.blocks_throttle_0, 0), (self.channels_channel_model_0, 0))
+ self.connect((self.blocks_throttle_0, 0), (self.channels_selective_fading_model_0, 0))
self.connect((self.blocks_vector_source_x_0, 0), (self.blocks_stream_mux_0, 0))
- self.connect((self.channels_channel_model_0, 0), (self.channels_selective_fading_model_0, 0))
+ self.connect((self.channels_selective_fading_model_0, 0), (self.blocks_file_sink_0, 0))
self.connect((self.channels_selective_fading_model_0, 0), (self.digital_pfb_clock_sync_xxx_0, 0))
self.connect((self.channels_selective_fading_model_0, 0), (self.fadingui_netsink_0, 0))
+ self.connect((self.digital_cma_equalizer_cc_0, 0), (self.blocks_file_sink_3, 0))
self.connect((self.digital_cma_equalizer_cc_0, 0), (self.digital_corr_est_cc_0, 0))
self.connect((self.digital_cma_equalizer_cc_0, 0), (self.fadingui_netsink_1, 0))
self.connect((self.digital_constellation_decoder_cb_0, 0), (self.blocks_tagged_stream_align_0, 0))
self.connect((self.digital_constellation_modulator_0, 0), (self.blocks_throttle_0, 0))
self.connect((self.digital_corr_est_cc_0, 1), (self.blocks_complex_to_mag_0, 0))
self.connect((self.digital_corr_est_cc_0, 0), (self.fadingui_phasecorrection_0, 0))
+ self.connect((self.digital_pfb_clock_sync_xxx_0, 0), (self.blocks_file_sink_2, 0))
self.connect((self.digital_pfb_clock_sync_xxx_0, 0), (self.digital_cma_equalizer_cc_0, 0))
self.connect((self.digital_pfb_clock_sync_xxx_0, 0), (self.fadingui_netsink_4, 0))
+ self.connect((self.digital_pfb_clock_sync_xxx_0, 0), (self.qtgui_const_sink_x_1, 1))
+ self.connect((self.fadingui_phasecorrection_0, 0), (self.blocks_file_sink_1, 0))
self.connect((self.fadingui_phasecorrection_0, 0), (self.digital_constellation_decoder_cb_0, 0))
self.connect((self.fadingui_phasecorrection_0, 0), (self.fadingui_netsink_3, 0))
+ self.connect((self.fadingui_phasecorrection_0, 0), (self.qtgui_const_sink_x_1, 0))
+ def closeEvent(self, event):
+ self.settings = Qt.QSettings("GNU Radio", "qpsk_sim")
+ self.settings.setValue("geometry", self.saveGeometry())
+ event.accept()
+
def get_testvec(self):
return self.testvec
@@ -145,7 +240,7 @@ class qpsk_sim(gr.top_block):
def set_samp_rate(self, samp_rate):
self.samp_rate = samp_rate
self.blocks_throttle_0.set_sample_rate(self.samp_rate)
- self.channels_selective_fading_model_0.set_fDTs(((2*self.carrier_freq)/(3*10e8))/self.samp_rate)
+ self.channels_selective_fading_model_0.set_fDTs(5/self.samp_rate)
def get_rrc_taps(self):
return self.rrc_taps
@@ -171,7 +266,6 @@ class qpsk_sim(gr.top_block):
def set_carrier_freq(self, carrier_freq):
self.carrier_freq = carrier_freq
- self.channels_selective_fading_model_0.set_fDTs(((2*self.carrier_freq)/(3*10e8))/self.samp_rate)
def get_access_code_symbols(self):
return self.access_code_symbols
@@ -187,21 +281,34 @@ class qpsk_sim(gr.top_block):
def main(top_block_cls=qpsk_sim, options=None):
if gr.enable_realtime_scheduling() != gr.RT_OK:
print("Error: failed to enable real-time scheduling.")
+
+ 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()
- def sig_handler(sig=None, frame=None):
- tb.stop()
- tb.wait()
+ tb.start()
- sys.exit(0)
+ tb.show()
+
+ def sig_handler(sig=None, frame=None):
+ Qt.QApplication.quit()
signal.signal(signal.SIGINT, sig_handler)
signal.signal(signal.SIGTERM, sig_handler)
- tb.start()
+ timer = Qt.QTimer()
+ timer.start(500)
+ timer.timeout.connect(lambda: None)
- tb.wait()
+ def quitting():
+ tb.stop()
+ tb.wait()
+ qapp.aboutToQuit.connect(quitting)
+ qapp.exec_()
if __name__ == '__main__':
main()