def qpsk_awgn_generator(batch_size = 4500, EbN0s = range(-20, 10, 2)): data = {} ntaps = 45 N_BITS = 1000000 nvecs_per_key = batch_size vec_length = 128 for EbN0 in EbN0s: data[("busy", EbN0)] = np.zeros([nvecs_per_key, 2, vec_length], dtype=np.float32) data[("idle", EbN0)] = np.zeros([nvecs_per_key, 2, vec_length], dtype=np.float32) tb = gr.top_block() const = digital.qpsk_constellation() rrc_taps = firdes.root_raised_cosine(1, 4, 1, 0.35, ntaps) src = blocks.vector_source_b(map(int, np.random.randint(0, const.arity(), N_BITS/const.bits_per_symbol())), False) mod = digital.chunks_to_symbols_bc((const.points()), 1) match_filter = filter.interp_fir_filter_ccc(4, (rrc_taps)) amplitude = blocks.multiply_const_vcc((4, )) #noise_amplitude = 1.0 / math.sqrt(const.bits_per_symbol()* 10**(float(EbN0)/10)) noise_amplitude = 1.0 / math.sqrt(10**(float(EbN0)/10)) noise = analog.noise_source_c(analog.GR_GAUSSIAN, noise_amplitude, 0) add = blocks.add_vcc(1) sink = blocks.vector_sink_c() noise_sink = blocks.vector_sink_c() tb.connect(src, mod, match_filter, amplitude, (add, 0), sink) tb.connect(noise, (add, 1)) tb.connect(noise, noise_sink) tb.run() raw_output_vector = np.array(sink.data(), dtype=np.complex64) raw_noise_vector = np.array(noise_sink.data(), dtype=np.complex64) sampler_indx = random.randint(50, 500) vec_indx = 0 while sampler_indx + vec_length < len(raw_output_vector) and vec_indx < nvecs_per_key: sampled_vector = raw_output_vector[sampler_indx:sampler_indx+vec_length] data[("busy", EbN0)][vec_indx, 0,:] = np.real(sampled_vector) data[("busy", EbN0)][vec_indx, 1,:] = np.imag(sampled_vector) sampled_noise_vector = raw_noise_vector[sampler_indx:sampler_indx+vec_length] data[("idle", EbN0)][vec_indx, 0,:] = np.real(sampled_noise_vector) data[("idle", EbN0)][vec_indx, 1,:] = np.imag(sampled_noise_vector) sampler_indx += vec_length vec_indx += 1 return data
def __init__(self, EbN0): gr.top_block.__init__(self) self.const = digital.qpsk_constellation() # Source is N_BITS bits, non-repeated data = list(map(int, numpy.random.randint(0, self.const.arity(), N_BITS / self.const.bits_per_symbol()))) src = blocks.vector_source_b(data, False) mod = digital.chunks_to_symbols_bc((self.const.points()), 1) add = blocks.add_vcc() noise = analog.noise_source_c(analog.GR_GAUSSIAN, self.EbN0_to_noise_voltage(EbN0), RAND_SEED) demod = digital.constellation_decoder_cb(self.const.base()) ber = BitErrors(self.const.bits_per_symbol()) self.sink = blocks.vector_sink_f() self.connect(src, mod, add, demod, ber, self.sink) self.connect(noise, (add, 1)) self.connect(src, (ber, 1))
def __init__(self, EbN0): gr.top_block.__init__(self) self.const = digital.qpsk_constellation() # Source is N_BITS bits, non-repeated data = list(map(int, numpy.random.randint(0, self.const.arity(), int(N_BITS / self.const.bits_per_symbol())))) src = blocks.vector_source_b(data, False) mod = digital.chunks_to_symbols_bc((self.const.points()), 1) add = blocks.add_vcc() noise = analog.noise_source_c(analog.GR_GAUSSIAN, self.EbN0_to_noise_voltage(EbN0), RAND_SEED) demod = digital.constellation_decoder_cb(self.const.base()) ber = BitErrors(self.const.bits_per_symbol()) self.sink = blocks.vector_sink_f() self.connect(src, mod, add, demod, ber, self.sink) self.connect(noise, (add, 1)) self.connect(src, (ber, 1))
def test_tag(self): # Send data through bpsk receiver # followed by qpsk receiver data = [0.9 + 0j, 0.1 + 0.9j, -1 - 0.1j, -0.1 - 0.6j] * 2 bpsk_data = [1, 1, 0, 0] qpsk_data = [1, 3, 0, 0] first_tag = gr.tag_t() first_tag.key = pmt.intern("set_constellation") first_tag.value = digital.bpsk_constellation().as_pmt() first_tag.offset = 0 second_tag = gr.tag_t() second_tag.key = pmt.intern("set_constellation") second_tag.value = digital.qpsk_constellation().as_pmt() second_tag.offset = 4 src = blocks.vector_source_c(data, False, 1, [first_tag, second_tag]) decoder = digital.constellation_receiver_cb( digital.bpsk_constellation().base(), 0, 0, 0) snk = blocks.vector_sink_b() tb = gr.top_block() tb.connect(src, decoder, snk) tb.run() self.assertEqual(list(snk.data()), bpsk_data + qpsk_data)
def test_tag(self): # Send data through bpsk receiver # followed by qpsk receiver data = [0.9+0j, 0.1+0.9j, -1-0.1j, -0.1-0.6j]*2 bpsk_data = [1, 1, 0, 0] qpsk_data = [1, 3, 0, 0] first_tag = gr.tag_t() first_tag.key = pmt.intern("set_constellation") first_tag.value = digital.bpsk_constellation().as_pmt() first_tag.offset = 0 second_tag = gr.tag_t() second_tag.key = pmt.intern("set_constellation") second_tag.value = digital.qpsk_constellation().as_pmt() second_tag.offset = 4 src = blocks.vector_source_c(data, False, 1, [first_tag, second_tag]) decoder = digital.constellation_receiver_cb( digital.bpsk_constellation().base(), 0, 0, 0) snk = blocks.vector_sink_b() tb = gr.top_block() tb.connect(src, decoder, snk) tb.run() self.assertEqual(list(snk.data()), bpsk_data+qpsk_data)
def __init__(self): grc_wxgui.top_block_gui.__init__(self, title="Pam Timing") _icon_path = "/usr/share/icons/hicolor/32x32/apps/gnuradio-grc.png" self.SetIcon(wx.Icon(_icon_path, wx.BITMAP_TYPE_ANY)) ################################################## # Variables ################################################## self.time_bw = time_bw = 0 self.spb = spb = 4.2563 self.sig_amp = sig_amp = 1 self.samp_rate = samp_rate = 32000 self.rolloff = rolloff = .35 self.noise_amp = noise_amp = 0 self.nfilts = nfilts = 32 self.interpratio = interpratio = 1.00 self.freq_offset = freq_offset = 0 self.const = const = digital.qpsk_constellation() ################################################## # Blocks ################################################## _time_bw_sizer = wx.BoxSizer(wx.VERTICAL) self._time_bw_text_box = forms.text_box( parent=self.GetWin(), sizer=_time_bw_sizer, value=self.time_bw, callback=self.set_time_bw, label="Timing Loop BW", converter=forms.float_converter(), proportion=0, ) self._time_bw_slider = forms.slider( parent=self.GetWin(), sizer=_time_bw_sizer, value=self.time_bw, callback=self.set_time_bw, minimum=0, maximum=0.1, num_steps=1000, style=wx.SL_HORIZONTAL, cast=float, proportion=1, ) self.GridAdd(_time_bw_sizer, 1, 2, 1, 1) self.notebook_0 = self.notebook_0 = wx.Notebook(self.GetWin(), style=wx.NB_TOP) self.notebook_0.AddPage(grc_wxgui.Panel(self.notebook_0), "error") self.notebook_0.AddPage(grc_wxgui.Panel(self.notebook_0), "phase") self.notebook_0.AddPage(grc_wxgui.Panel(self.notebook_0), "freq") self.notebook_0.AddPage(grc_wxgui.Panel(self.notebook_0), "Resampled Signal") self.notebook_0.AddPage(grc_wxgui.Panel(self.notebook_0), "Scope") self.GridAdd(self.notebook_0, 1, 1, 5, 1) _noise_amp_sizer = wx.BoxSizer(wx.VERTICAL) self._noise_amp_text_box = forms.text_box( parent=self.GetWin(), sizer=_noise_amp_sizer, value=self.noise_amp, callback=self.set_noise_amp, label="Channel Noise", converter=forms.float_converter(), proportion=0, ) self._noise_amp_slider = forms.slider( parent=self.GetWin(), sizer=_noise_amp_sizer, value=self.noise_amp, callback=self.set_noise_amp, minimum=0, maximum=1.0, num_steps=1000, style=wx.SL_HORIZONTAL, cast=float, proportion=1, ) self.GridAdd(_noise_amp_sizer, 3, 2, 1, 1) _interpratio_sizer = wx.BoxSizer(wx.VERTICAL) self._interpratio_text_box = forms.text_box( parent=self.GetWin(), sizer=_interpratio_sizer, value=self.interpratio, callback=self.set_interpratio, label="Timing Offset", converter=forms.float_converter(), proportion=0, ) self._interpratio_slider = forms.slider( parent=self.GetWin(), sizer=_interpratio_sizer, value=self.interpratio, callback=self.set_interpratio, minimum=0.99, maximum=1.01, num_steps=1000, style=wx.SL_HORIZONTAL, cast=float, proportion=1, ) self.GridAdd(_interpratio_sizer, 2, 2, 1, 1) _freq_offset_sizer = wx.BoxSizer(wx.VERTICAL) self._freq_offset_text_box = forms.text_box( parent=self.GetWin(), sizer=_freq_offset_sizer, value=self.freq_offset, callback=self.set_freq_offset, label="Frequency Offset", converter=forms.float_converter(), proportion=0, ) self._freq_offset_slider = forms.slider( parent=self.GetWin(), sizer=_freq_offset_sizer, value=self.freq_offset, callback=self.set_freq_offset, minimum=-0.5, maximum=0.5, num_steps=1000, style=wx.SL_HORIZONTAL, cast=float, proportion=1, ) self.GridAdd(_freq_offset_sizer, 4, 2, 1, 1) self.wxgui_scopesink2_0_0_1 = scopesink2.scope_sink_c( self.notebook_0.GetPage(3).GetWin(), title="Error", sample_rate=samp_rate, v_scale=.5, v_offset=0, t_scale=0, ac_couple=False, xy_mode=False, num_inputs=1, trig_mode=wxgui.TRIG_MODE_AUTO, y_axis_label="Counts", ) self.notebook_0.GetPage(3).Add(self.wxgui_scopesink2_0_0_1.win) self.wxgui_scopesink2_0_0_0_0 = scopesink2.scope_sink_f( self.notebook_0.GetPage(2).GetWin(), title="Scope Plot", sample_rate=samp_rate, v_scale=1.25, v_offset=0, t_scale=0, ac_couple=False, xy_mode=False, num_inputs=1, trig_mode=wxgui.TRIG_MODE_AUTO, y_axis_label="Counts", ) self.notebook_0.GetPage(2).Add(self.wxgui_scopesink2_0_0_0_0.win) self.wxgui_scopesink2_0_0_0 = scopesink2.scope_sink_f( self.notebook_0.GetPage(1).GetWin(), title="Scope Plot", sample_rate=samp_rate, v_scale=9, v_offset=0, t_scale=0, ac_couple=False, xy_mode=False, num_inputs=1, trig_mode=wxgui.TRIG_MODE_AUTO, y_axis_label="Counts", ) self.notebook_0.GetPage(1).Add(self.wxgui_scopesink2_0_0_0.win) self.wxgui_scopesink2_0_0 = scopesink2.scope_sink_f( self.notebook_0.GetPage(0).GetWin(), title="Error", sample_rate=samp_rate, v_scale=3, v_offset=0, t_scale=0, ac_couple=False, xy_mode=False, num_inputs=1, trig_mode=wxgui.TRIG_MODE_AUTO, y_axis_label="Counts", ) self.notebook_0.GetPage(0).Add(self.wxgui_scopesink2_0_0.win) self.wxgui_scopesink2_0 = scopesink2.scope_sink_c( self.notebook_0.GetPage(4).GetWin(), title="Scope Plot", sample_rate=samp_rate, v_scale=0, v_offset=0, t_scale=0, ac_couple=False, xy_mode=False, num_inputs=1, trig_mode=wxgui.TRIG_MODE_AUTO, y_axis_label="Counts", ) self.notebook_0.GetPage(4).Add(self.wxgui_scopesink2_0.win) self.pfb_arb_resampler_xxx_0 = pfb.arb_resampler_ccf( spb, taps=(firdes.root_raised_cosine(nfilts, nfilts, 1.0, rolloff, 44*nfilts)), flt_size=32) self.digital_pfb_clock_sync_xxx_0 = digital.pfb_clock_sync_ccf(spb, time_bw, (firdes.root_raised_cosine(nfilts, nfilts*spb, 1.0, rolloff, 44*nfilts)), nfilts, 16, 1.5, 1) self.digital_chunks_to_symbols_xx = digital.chunks_to_symbols_bc((const.points()), 1) self.channels_channel_model_0 = channels.channel_model( noise_voltage=noise_amp, frequency_offset=freq_offset, epsilon=interpratio, taps=(1.0, ), noise_seed=42, block_tags=False ) self.blocks_throttle_0 = blocks.throttle(gr.sizeof_gr_complex*1, samp_rate,True) self.blocks_multiply_const_vxx_0 = blocks.multiply_const_vcc((sig_amp, )) self.analog_random_source_x = blocks.vector_source_b(map(int, numpy.random.randint(0, const.arity(), 10000000)), True) ################################################## # Connections ################################################## self.connect((self.blocks_throttle_0, 0), (self.digital_pfb_clock_sync_xxx_0, 0)) self.connect((self.digital_pfb_clock_sync_xxx_0, 2), (self.wxgui_scopesink2_0_0_0_0, 0)) self.connect((self.blocks_multiply_const_vxx_0, 0), (self.wxgui_scopesink2_0_0_1, 0)) self.connect((self.pfb_arb_resampler_xxx_0, 0), (self.blocks_multiply_const_vxx_0, 0)) self.connect((self.digital_chunks_to_symbols_xx, 0), (self.pfb_arb_resampler_xxx_0, 0)) self.connect((self.analog_random_source_x, 0), (self.digital_chunks_to_symbols_xx, 0)) self.connect((self.digital_pfb_clock_sync_xxx_0, 3), (self.wxgui_scopesink2_0_0_0, 0)) self.connect((self.digital_pfb_clock_sync_xxx_0, 1), (self.wxgui_scopesink2_0_0, 0)) self.connect((self.digital_pfb_clock_sync_xxx_0, 0), (self.wxgui_scopesink2_0, 0)) self.connect((self.channels_channel_model_0, 0), (self.blocks_throttle_0, 0)) self.connect((self.blocks_multiply_const_vxx_0, 0), (self.channels_channel_model_0, 0))
def __init__(self): gr.top_block.__init__(self, "PAM Timing") Qt.QWidget.__init__(self) self.setWindowTitle("PAM Timing") 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", "pam_timing") self.restoreGeometry(self.settings.value("geometry").toByteArray()) ################################################## # Variables ################################################## self.time_bw = time_bw = 0 self.spb = spb = 4.2563 self.sig_amp = sig_amp = 1 self.samp_rate = samp_rate = 32000 self.rolloff = rolloff = .35 self.noise_amp = noise_amp = 0 self.nfilts = nfilts = 32 self.interpratio = interpratio = 1 self.freq_offset = freq_offset = 0 self.const = const = digital.qpsk_constellation() ################################################## # Blocks ################################################## self._time_bw_range = Range(0, .1, .001, 0, 200) self._time_bw_win = RangeWidget(self._time_bw_range, self.set_time_bw, 'Timing Loop BW', "counter_slider", float) self.top_grid_layout.addWidget(self._time_bw_win, 1, 2, 1, 1) 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, 'Error') 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, 'Phase') self.notebook_widget_2 = Qt.QWidget() self.notebook_layout_2 = Qt.QBoxLayout(Qt.QBoxLayout.TopToBottom, self.notebook_widget_2) self.notebook_grid_layout_2 = Qt.QGridLayout() self.notebook_layout_2.addLayout(self.notebook_grid_layout_2) self.notebook.addTab(self.notebook_widget_2, 'Freq') self.notebook_widget_3 = Qt.QWidget() self.notebook_layout_3 = Qt.QBoxLayout(Qt.QBoxLayout.TopToBottom, self.notebook_widget_3) self.notebook_grid_layout_3 = Qt.QGridLayout() self.notebook_layout_3.addLayout(self.notebook_grid_layout_3) self.notebook.addTab(self.notebook_widget_3, 'Resampled Signal') self.top_grid_layout.addWidget(self.notebook, 1, 1, 5, 1) self._noise_amp_range = Range(0, 1, .001, 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, 3, 2, 1, 1) self._interpratio_range = Range(.99, 1.01, 0.0001, 1, 200) self._interpratio_win = RangeWidget(self._interpratio_range, self.set_interpratio, 'Timing Offset', "counter_slider", float) self.top_grid_layout.addWidget(self._interpratio_win, 2, 2, 1, 1) self._freq_offset_range = Range(-.5, .5, .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, 4, 2, 1, 1) self.qtgui_time_sink_x_1_1 = qtgui.time_sink_f( 1024, #size samp_rate, #samp_rate 'Phase', #name 1 #number of inputs ) self.qtgui_time_sink_x_1_1.set_update_time(0.10) self.qtgui_time_sink_x_1_1.set_y_axis(-1, 1) self.qtgui_time_sink_x_1_1.set_y_label('Amplitude', "") self.qtgui_time_sink_x_1_1.enable_tags(-1, True) self.qtgui_time_sink_x_1_1.set_trigger_mode(qtgui.TRIG_MODE_FREE, qtgui.TRIG_SLOPE_POS, 0.0, 0, 0, "") self.qtgui_time_sink_x_1_1.enable_autoscale(True) self.qtgui_time_sink_x_1_1.enable_grid(False) self.qtgui_time_sink_x_1_1.enable_axis_labels(True) self.qtgui_time_sink_x_1_1.enable_control_panel(False) if not True: self.qtgui_time_sink_x_1_1.disable_legend() 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 = [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1] 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_time_sink_x_1_1.set_line_label( i, "Data {0}".format(i)) else: self.qtgui_time_sink_x_1_1.set_line_label(i, labels[i]) self.qtgui_time_sink_x_1_1.set_line_width(i, widths[i]) self.qtgui_time_sink_x_1_1.set_line_color(i, colors[i]) self.qtgui_time_sink_x_1_1.set_line_style(i, styles[i]) self.qtgui_time_sink_x_1_1.set_line_marker(i, markers[i]) self.qtgui_time_sink_x_1_1.set_line_alpha(i, alphas[i]) self._qtgui_time_sink_x_1_1_win = sip.wrapinstance( self.qtgui_time_sink_x_1_1.pyqwidget(), Qt.QWidget) self.notebook_layout_1.addWidget(self._qtgui_time_sink_x_1_1_win) self.qtgui_time_sink_x_1_0 = qtgui.time_sink_f( 1024, #size samp_rate, #samp_rate 'Rate', #name 1 #number of inputs ) self.qtgui_time_sink_x_1_0.set_update_time(0.10) self.qtgui_time_sink_x_1_0.set_y_axis(-1, 1) self.qtgui_time_sink_x_1_0.set_y_label('Amplitude', "") self.qtgui_time_sink_x_1_0.enable_tags(-1, True) self.qtgui_time_sink_x_1_0.set_trigger_mode(qtgui.TRIG_MODE_FREE, qtgui.TRIG_SLOPE_POS, 0.0, 0, 0, "") self.qtgui_time_sink_x_1_0.enable_autoscale(True) self.qtgui_time_sink_x_1_0.enable_grid(False) self.qtgui_time_sink_x_1_0.enable_axis_labels(True) self.qtgui_time_sink_x_1_0.enable_control_panel(False) if not True: self.qtgui_time_sink_x_1_0.disable_legend() 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 = [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1] 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_time_sink_x_1_0.set_line_label( i, "Data {0}".format(i)) else: self.qtgui_time_sink_x_1_0.set_line_label(i, labels[i]) self.qtgui_time_sink_x_1_0.set_line_width(i, widths[i]) self.qtgui_time_sink_x_1_0.set_line_color(i, colors[i]) self.qtgui_time_sink_x_1_0.set_line_style(i, styles[i]) self.qtgui_time_sink_x_1_0.set_line_marker(i, markers[i]) self.qtgui_time_sink_x_1_0.set_line_alpha(i, alphas[i]) self._qtgui_time_sink_x_1_0_win = sip.wrapinstance( self.qtgui_time_sink_x_1_0.pyqwidget(), Qt.QWidget) self.notebook_layout_2.addWidget(self._qtgui_time_sink_x_1_0_win) self.qtgui_time_sink_x_1 = qtgui.time_sink_f( 1024, #size samp_rate, #samp_rate 'Error', #name 1 #number of inputs ) self.qtgui_time_sink_x_1.set_update_time(0.10) self.qtgui_time_sink_x_1.set_y_axis(-1, 1) self.qtgui_time_sink_x_1.set_y_label('Amplitude', "") self.qtgui_time_sink_x_1.enable_tags(-1, True) self.qtgui_time_sink_x_1.set_trigger_mode(qtgui.TRIG_MODE_FREE, qtgui.TRIG_SLOPE_POS, 0.0, 0, 0, "") self.qtgui_time_sink_x_1.enable_autoscale(True) self.qtgui_time_sink_x_1.enable_grid(False) self.qtgui_time_sink_x_1.enable_axis_labels(True) self.qtgui_time_sink_x_1.enable_control_panel(False) if not True: self.qtgui_time_sink_x_1.disable_legend() 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 = [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1] 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_time_sink_x_1.set_line_label( i, "Data {0}".format(i)) else: self.qtgui_time_sink_x_1.set_line_label(i, labels[i]) self.qtgui_time_sink_x_1.set_line_width(i, widths[i]) self.qtgui_time_sink_x_1.set_line_color(i, colors[i]) self.qtgui_time_sink_x_1.set_line_style(i, styles[i]) self.qtgui_time_sink_x_1.set_line_marker(i, markers[i]) self.qtgui_time_sink_x_1.set_line_alpha(i, alphas[i]) self._qtgui_time_sink_x_1_win = sip.wrapinstance( self.qtgui_time_sink_x_1.pyqwidget(), Qt.QWidget) self.notebook_layout_0.addWidget(self._qtgui_time_sink_x_1_win) self.qtgui_time_sink_x_0_0 = qtgui.time_sink_c( 1024, #size samp_rate, #samp_rate 'Scope Plot', #name 1 #number of inputs ) self.qtgui_time_sink_x_0_0.set_update_time(0.10) self.qtgui_time_sink_x_0_0.set_y_axis(-1, 1) self.qtgui_time_sink_x_0_0.set_y_label('Amplitude', "") self.qtgui_time_sink_x_0_0.enable_tags(-1, True) self.qtgui_time_sink_x_0_0.set_trigger_mode(qtgui.TRIG_MODE_FREE, qtgui.TRIG_SLOPE_POS, 0.0, 0, 0, "") self.qtgui_time_sink_x_0_0.enable_autoscale(False) self.qtgui_time_sink_x_0_0.enable_grid(False) self.qtgui_time_sink_x_0_0.enable_axis_labels(True) self.qtgui_time_sink_x_0_0.enable_control_panel(False) if not True: self.qtgui_time_sink_x_0_0.disable_legend() 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 = [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1] 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(2 * 1): if len(labels[i]) == 0: if (i % 2 == 0): self.qtgui_time_sink_x_0_0.set_line_label( i, "Re{{Data {0}}}".format(i / 2)) else: self.qtgui_time_sink_x_0_0.set_line_label( i, "Im{{Data {0}}}".format(i / 2)) else: self.qtgui_time_sink_x_0_0.set_line_label(i, labels[i]) self.qtgui_time_sink_x_0_0.set_line_width(i, widths[i]) self.qtgui_time_sink_x_0_0.set_line_color(i, colors[i]) self.qtgui_time_sink_x_0_0.set_line_style(i, styles[i]) self.qtgui_time_sink_x_0_0.set_line_marker(i, markers[i]) self.qtgui_time_sink_x_0_0.set_line_alpha(i, alphas[i]) self._qtgui_time_sink_x_0_0_win = sip.wrapinstance( self.qtgui_time_sink_x_0_0.pyqwidget(), Qt.QWidget) self.top_layout.addWidget(self._qtgui_time_sink_x_0_0_win) self.qtgui_time_sink_x_0 = qtgui.time_sink_c( 1024, #size samp_rate, #samp_rate 'Error', #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(-1, True) self.qtgui_time_sink_x_0.set_trigger_mode(qtgui.TRIG_MODE_FREE, qtgui.TRIG_SLOPE_POS, 0.0, 0, 0, "") 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(False) if not True: self.qtgui_time_sink_x_0.disable_legend() 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 = [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1] 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(2 * 1): if len(labels[i]) == 0: if (i % 2 == 0): self.qtgui_time_sink_x_0.set_line_label( i, "Re{{Data {0}}}".format(i / 2)) else: self.qtgui_time_sink_x_0.set_line_label( i, "Im{{Data {0}}}".format(i / 2)) 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.notebook_layout_3.addWidget(self._qtgui_time_sink_x_0_win) self.pfb_arb_resampler_xxx_0 = pfb.arb_resampler_ccf( spb, taps=(firdes.root_raised_cosine(nfilts, nfilts, 1.0, rolloff, 44 * nfilts)), flt_size=32) self.pfb_arb_resampler_xxx_0.declare_sample_delay(0) self.digital_pfb_clock_sync_xxx_0 = digital.pfb_clock_sync_ccf( spb, time_bw, (firdes.root_raised_cosine( nfilts, nfilts * spb, 1.0, rolloff, 44 * nfilts)), nfilts, 16, 1.5, 1) self.digital_chunks_to_symbols_xx = digital.chunks_to_symbols_bc( (const.points()), 1) self.channels_channel_model_0 = channels.channel_model( noise_voltage=noise_amp, frequency_offset=freq_offset, epsilon=interpratio, taps=(1.0, ), noise_seed=42, block_tags=False) self.blocks_throttle_0 = blocks.throttle(gr.sizeof_gr_complex * 1, samp_rate, True) self.blocks_multiply_const_vxx_0 = blocks.multiply_const_vcc( (sig_amp, )) self.analog_random_source_x = blocks.vector_source_b( map(int, numpy.random.randint(0, const.arity(), 10000000)), True) ################################################## # Connections ################################################## self.connect((self.analog_random_source_x, 0), (self.digital_chunks_to_symbols_xx, 0)) self.connect((self.blocks_multiply_const_vxx_0, 0), (self.channels_channel_model_0, 0)) self.connect((self.blocks_multiply_const_vxx_0, 0), (self.qtgui_time_sink_x_0, 0)) self.connect((self.blocks_throttle_0, 0), (self.digital_pfb_clock_sync_xxx_0, 0)) self.connect((self.channels_channel_model_0, 0), (self.blocks_throttle_0, 0)) self.connect((self.digital_chunks_to_symbols_xx, 0), (self.pfb_arb_resampler_xxx_0, 0)) self.connect((self.digital_pfb_clock_sync_xxx_0, 0), (self.qtgui_time_sink_x_0_0, 0)) self.connect((self.digital_pfb_clock_sync_xxx_0, 1), (self.qtgui_time_sink_x_1, 0)) self.connect((self.digital_pfb_clock_sync_xxx_0, 2), (self.qtgui_time_sink_x_1_0, 0)) self.connect((self.digital_pfb_clock_sync_xxx_0, 3), (self.qtgui_time_sink_x_1_1, 0)) self.connect((self.pfb_arb_resampler_xxx_0, 0), (self.blocks_multiply_const_vxx_0, 0))
def qpsk_awgn_generator(dataset_size=10000, vec_length=128, EbN0=-6): N_BITS = dataset_size * vec_length tb = gr.top_block() const = digital.qpsk_constellation() rrc_taps = firdes.root_raised_cosine(1, 4, 1, 0.35, 45) src = blocks.vector_source_b( map( int, np.random.randint(0, const.arity(), N_BITS / const.bits_per_symbol())), False) mod = digital.chunks_to_symbols_bc((const.points()), 1) match_filter = filter.interp_fir_filter_ccc(4, (rrc_taps)) amplitude = blocks.multiply_const_vcc((4, )) noise_amplitude = 1.0 / math.sqrt(10**(float(EbN0) / 10)) noise = analog.noise_source_c(analog.GR_GAUSSIAN, noise_amplitude, 0) add = blocks.add_vcc(1) sink = blocks.vector_sink_c() noise_sink = blocks.vector_sink_c() tb.connect(src, mod, match_filter, amplitude, (add, 0), sink) tb.connect(noise, (add, 1)) tb.connect(noise, noise_sink) tb.run() sample_output = np.array(sink.data(), dtype=np.complex64) noise_output = np.array(noise_sink.data(), dtype=np.complex64) sampler_indx = random.randint(50, 500) vec_indx = 0 sample_data = np.zeros([dataset_size, 2, vec_length], dtype=np.float32) noise_data = np.zeros([dataset_size, 2, vec_length], dtype=np.float32) sample_labels = np.zeros([dataset_size, 2], dtype=np.int32) noise_labels = np.zeros([dataset_size, 2], dtype=np.int32) while sampler_indx + vec_length < len( sample_output) and vec_indx < dataset_size: sampled_vector = sample_output[sampler_indx:sampler_indx + vec_length] sample_data[vec_indx, 0, :] = np.real(sampled_vector) sample_data[vec_indx, 1, :] = np.imag(sampled_vector) noise_vector = noise_output[sampler_indx:sampler_indx + vec_length] noise_data[vec_indx, 0, :] = np.real(noise_vector) noise_data[vec_indx, 1, :] = np.imag(noise_vector) sample_labels[vec_indx, :] = [1, 0] noise_labels[vec_indx, :] = [0, 1] sampler_indx += vec_length vec_indx += 1 data = [] data.append(sample_data) data.append(noise_data) data = np.vstack(data) labels = [] labels.append(sample_labels) labels.append(noise_labels) labels = np.vstack(labels) return data, labels, vec_indx