From 7381a5dcf266c532a490192ed229ac002d35f8b1 Mon Sep 17 00:00:00 2001 From: Nao Pross Date: Sat, 11 Dec 2021 16:05:41 +0100 Subject: Create new QPSK simulation --- simulation/QPSK/qpsk_nogui.py | 230 ------------------------------------------ 1 file changed, 230 deletions(-) delete mode 100755 simulation/QPSK/qpsk_nogui.py (limited to 'simulation/QPSK/qpsk_nogui.py') diff --git a/simulation/QPSK/qpsk_nogui.py b/simulation/QPSK/qpsk_nogui.py deleted file mode 100755 index 2b32473..0000000 --- a/simulation/QPSK/qpsk_nogui.py +++ /dev/null @@ -1,230 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- - -# -# SPDX-License-Identifier: GPL-3.0 -# -# GNU Radio Python Flow Graph -# Title: QPSK with IMGUI -# Author: Naoki Pross -# GNU Radio version: 3.8.2.0 - -from gnuradio import blocks -import numpy -from gnuradio import channels -from gnuradio.filter import firdes -from gnuradio import digital -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 - - -class qpsk_nogui(gr.top_block): - - def __init__(self): - gr.top_block.__init__(self, "QPSK with IMGUI") - - ################################################## - # Variables - ################################################## - self.sps = sps = 4 - self.nfilts = nfilts = 32 - self.timing_loop_bw = timing_loop_bw = 2 * 3.141592653589793 / 100 - self.time_offset = time_offset = 1 - self.samp_rate = samp_rate = 32000 - self.rrc_taps = rrc_taps = firdes.root_raised_cosine(nfilts, nfilts, 1.0/float(sps), 0.35, 45*nfilts) - self.qpsk_const = qpsk_const = digital.constellation_rect([0.707+0.707j, -0.707+0.707j, -0.707-0.707j, 0.707-0.707j], [0, 1, 3, 2], - 4, 2, 2, 1, 1).base() - self.phase_bw = phase_bw = 2 * 3.141592653589793 / 100 - self.noise_volt = noise_volt = 100e-6 - self.freq_offset = freq_offset = 0 - self.excess_bw = excess_bw = 350e-3 - self.eq_ntaps = eq_ntaps = 15 - self.eq_mod = eq_mod = 1 - self.eq_gain = eq_gain = .01 - self.chn_taps = chn_taps = [1.0 + 0.0j, ] - - ################################################## - # Blocks - ################################################## - self.digital_pfb_clock_sync_xxx_0 = digital.pfb_clock_sync_ccf(sps * 1.001, timing_loop_bw, rrc_taps, nfilts, nfilts/2, 1.5, 2) - self.digital_map_bb_0 = digital.map_bb([0, 1, 3, 2]) - self.digital_diff_decoder_bb_0 = digital.diff_decoder_bb(4) - self.digital_costas_loop_cc_0 = digital.costas_loop_cc(phase_bw, 4, False) - self.digital_constellation_modulator_0 = digital.generic_mod( - constellation=qpsk_const, - differential=True, - samples_per_symbol=sps, - pre_diff_code=True, - excess_bw=excess_bw, - verbose=False, - log=False) - self.digital_constellation_decoder_cb_0 = digital.constellation_decoder_cb(qpsk_const) - self.digital_cma_equalizer_cc_0 = digital.cma_equalizer_cc(eq_ntaps, eq_mod, eq_gain, 2) - self.channels_channel_model_0 = channels.channel_model( - noise_voltage=noise_volt, - frequency_offset=freq_offset, - epsilon=time_offset, - taps=chn_taps, - noise_seed=0, - block_tags=False) - self.blocks_unpack_k_bits_bb_0 = blocks.unpack_k_bits_bb(2) - self.blocks_throttle_0 = blocks.throttle(gr.sizeof_gr_complex*1, samp_rate,True) - self.blocks_null_sink_0 = blocks.null_sink(gr.sizeof_float*1) - self.blocks_char_to_float_0 = blocks.char_to_float(1, 1) - self.analog_random_source_x_0 = blocks.vector_source_b(list(map(int, numpy.random.randint(0, 256, 1000))), True) - - - - ################################################## - # Connections - ################################################## - self.connect((self.analog_random_source_x_0, 0), (self.digital_constellation_modulator_0, 0)) - self.connect((self.blocks_char_to_float_0, 0), (self.blocks_null_sink_0, 0)) - self.connect((self.blocks_throttle_0, 0), (self.channels_channel_model_0, 0)) - self.connect((self.blocks_unpack_k_bits_bb_0, 0), (self.blocks_char_to_float_0, 0)) - self.connect((self.channels_channel_model_0, 0), (self.digital_pfb_clock_sync_xxx_0, 0)) - self.connect((self.digital_cma_equalizer_cc_0, 0), (self.digital_costas_loop_cc_0, 0)) - self.connect((self.digital_constellation_decoder_cb_0, 0), (self.digital_diff_decoder_bb_0, 0)) - self.connect((self.digital_constellation_modulator_0, 0), (self.blocks_throttle_0, 0)) - self.connect((self.digital_costas_loop_cc_0, 0), (self.digital_constellation_decoder_cb_0, 0)) - self.connect((self.digital_diff_decoder_bb_0, 0), (self.digital_map_bb_0, 0)) - self.connect((self.digital_map_bb_0, 0), (self.blocks_unpack_k_bits_bb_0, 0)) - self.connect((self.digital_pfb_clock_sync_xxx_0, 0), (self.digital_cma_equalizer_cc_0, 0)) - - - def get_sps(self): - return self.sps - - def set_sps(self, sps): - self.sps = sps - self.set_rrc_taps(firdes.root_raised_cosine(self.nfilts, self.nfilts, 1.0/float(self.sps), 0.35, 45*self.nfilts)) - - def get_nfilts(self): - return self.nfilts - - def set_nfilts(self, nfilts): - self.nfilts = nfilts - self.set_rrc_taps(firdes.root_raised_cosine(self.nfilts, self.nfilts, 1.0/float(self.sps), 0.35, 45*self.nfilts)) - - def get_timing_loop_bw(self): - return self.timing_loop_bw - - def set_timing_loop_bw(self, timing_loop_bw): - self.timing_loop_bw = timing_loop_bw - self.digital_pfb_clock_sync_xxx_0.set_loop_bandwidth(self.timing_loop_bw) - - def get_time_offset(self): - return self.time_offset - - def set_time_offset(self, time_offset): - self.time_offset = time_offset - self.channels_channel_model_0.set_timing_offset(self.time_offset) - - 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_rrc_taps(self): - return self.rrc_taps - - def set_rrc_taps(self, rrc_taps): - self.rrc_taps = rrc_taps - self.digital_pfb_clock_sync_xxx_0.update_taps(self.rrc_taps) - - def get_qpsk_const(self): - return self.qpsk_const - - def set_qpsk_const(self, qpsk_const): - self.qpsk_const = qpsk_const - - def get_phase_bw(self): - return self.phase_bw - - def set_phase_bw(self, phase_bw): - self.phase_bw = phase_bw - self.digital_costas_loop_cc_0.set_loop_bandwidth(self.phase_bw) - - def get_noise_volt(self): - return self.noise_volt - - def set_noise_volt(self, noise_volt): - self.noise_volt = noise_volt - self.channels_channel_model_0.set_noise_voltage(self.noise_volt) - - 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_excess_bw(self): - return self.excess_bw - - def set_excess_bw(self, excess_bw): - self.excess_bw = excess_bw - - def get_eq_ntaps(self): - return self.eq_ntaps - - def set_eq_ntaps(self, eq_ntaps): - self.eq_ntaps = eq_ntaps - - def get_eq_mod(self): - return self.eq_mod - - def set_eq_mod(self, eq_mod): - self.eq_mod = eq_mod - self.digital_cma_equalizer_cc_0.set_modulus(self.eq_mod) - - def get_eq_gain(self): - return self.eq_gain - - def set_eq_gain(self, eq_gain): - self.eq_gain = eq_gain - self.digital_cma_equalizer_cc_0.set_gain(self.eq_gain) - - def get_chn_taps(self): - return self.chn_taps - - def set_chn_taps(self, chn_taps): - self.chn_taps = chn_taps - self.channels_channel_model_0.set_taps(self.chn_taps) - - - - - -def main(top_block_cls=qpsk_nogui, options=None): - if gr.enable_realtime_scheduling() != gr.RT_OK: - print("Error: failed to enable real-time scheduling.") - tb = top_block_cls() - - def sig_handler(sig=None, frame=None): - tb.stop() - tb.wait() - - sys.exit(0) - - signal.signal(signal.SIGINT, sig_handler) - signal.signal(signal.SIGTERM, sig_handler) - - tb.start() - - try: - input('Press Enter to quit: ') - except EOFError: - pass - tb.stop() - tb.wait() - - -if __name__ == '__main__': - main() -- cgit v1.2.1