From 958c9920a5f05c97952f72c93b2e9dca231cfb8b Mon Sep 17 00:00:00 2001 From: Nao Pross Date: Sat, 27 Nov 2021 19:57:03 +0100 Subject: Start access code cross correlation --- tests/correlator/acgen.dat | Bin 5120 -> 3840 bytes tests/correlator/acgen.grc | 24 +- tests/correlator/acgen.py | 25 +- tests/correlator/acproc.py | 48 ++- tests/correlator/correlator.grc | 816 +++++++++++++++++++++++++++++++++++++--- tests/correlator/correlator.py | 244 +++++++++--- 6 files changed, 1007 insertions(+), 150 deletions(-) diff --git a/tests/correlator/acgen.dat b/tests/correlator/acgen.dat index 537dcc5..a13db8e 100644 Binary files a/tests/correlator/acgen.dat and b/tests/correlator/acgen.dat differ diff --git a/tests/correlator/acgen.grc b/tests/correlator/acgen.grc index ec7c1e8..abdc3bc 100644 --- a/tests/correlator/acgen.grc +++ b/tests/correlator/acgen.grc @@ -1,7 +1,6 @@ options: parameters: author: Naoki Pross - catch_exceptions: 'True' category: '[GRC Hier Blocks]' cmake_opt: '' comment: '' @@ -23,6 +22,7 @@ options: sizing_mode: fixed thread_safe_setters: '' title: Access Code Symbols Generator + window_size: '' states: bus_sink: false bus_source: false @@ -36,7 +36,7 @@ blocks: id: variable parameters: comment: '' - value: '[ 0xaa, 0xff, 0x0a ]' + value: '[ 0xaa, 0xff, 0xff ]' states: bus_sink: false bus_source: false @@ -50,7 +50,6 @@ blocks: comment: '' const_points: '[-1-1j, -1+1j, 1+1j, 1-1j]' dims: '1' - normalization: digital.constellation.AMPLITUDE_NORMALIZATION precision: '8' rot_sym: '4' soft_dec_lut: None @@ -75,6 +74,18 @@ blocks: coordinate: [464, 308.0] rotation: 0 state: true +- name: padding_zeros + id: variable + parameters: + comment: '' + value: '10' + states: + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [40, 364.0] + rotation: 0 + state: true - name: samp_rate id: variable parameters: @@ -84,7 +95,7 @@ blocks: bus_sink: false bus_source: false bus_structure: null - coordinate: [200, 44.0] + coordinate: [208, 12.0] rotation: 0 state: enabled - name: sps @@ -96,7 +107,7 @@ blocks: bus_sink: false bus_source: false bus_structure: null - coordinate: [312, 44.0] + coordinate: [304, 12.0] rotation: 0 state: true - name: blocks_file_sink_0 @@ -147,7 +158,7 @@ blocks: repeat: 'False' tags: '[]' type: byte - vector: '[0x00] * 10 + access_code * 10' + vector: '[0x00] * padding_zeros + access_code * 10' vlen: '1' states: bus_sink: false @@ -169,7 +180,6 @@ blocks: maxoutbuf: '0' minoutbuf: '0' samples_per_symbol: sps - truncate: 'False' verbose: 'False' states: bus_sink: false diff --git a/tests/correlator/acgen.py b/tests/correlator/acgen.py index 5fbdbb4..4d18b92 100755 --- a/tests/correlator/acgen.py +++ b/tests/correlator/acgen.py @@ -7,13 +7,12 @@ # GNU Radio Python Flow Graph # Title: Access Code Symbols Generator # Author: Naoki Pross -# GNU Radio version: 3.9.2.0 +# GNU Radio version: 3.8.2.0 from gnuradio import blocks from gnuradio import digital from gnuradio import gr from gnuradio.filter import firdes -from gnuradio.fft import window import sys import signal from argparse import ArgumentParser @@ -21,21 +20,20 @@ from gnuradio.eng_arg import eng_float, intx from gnuradio import eng_notation - - class acgen(gr.top_block): def __init__(self): - gr.top_block.__init__(self, "Access Code Symbols Generator", catch_exceptions=True) + gr.top_block.__init__(self, "Access Code Symbols Generator") ################################################## # Variables ################################################## self.sps = sps = 4 self.samp_rate = samp_rate = 32000 + self.padding_zeros = padding_zeros = 10 self.excess_bw = excess_bw = 1 self.const = const = digital.constellation_qpsk().base() - self.access_code = access_code = [ 0xaa, 0xff, 0x0a ] + self.access_code = access_code = [ 0xaa, 0xff, 0xff ] ################################################## # Blocks @@ -47,9 +45,8 @@ class acgen(gr.top_block): pre_diff_code=True, excess_bw=excess_bw, verbose=False, - log=False, - truncate=False) - self.blocks_vector_source_x_0 = blocks.vector_source_b([0x00] * 10 + access_code * 10, False, 1, []) + log=False) + self.blocks_vector_source_x_0 = blocks.vector_source_b([0x00] * padding_zeros + access_code * 10, False, 1, []) self.blocks_throttle_0 = blocks.throttle(gr.sizeof_char*1, samp_rate,True) self.blocks_file_sink_0 = blocks.file_sink(gr.sizeof_gr_complex*1, 'acgen.dat', False) self.blocks_file_sink_0.set_unbuffered(False) @@ -77,6 +74,13 @@ class acgen(gr.top_block): self.samp_rate = samp_rate self.blocks_throttle_0.set_sample_rate(self.samp_rate) + def get_padding_zeros(self): + return self.padding_zeros + + def set_padding_zeros(self, padding_zeros): + self.padding_zeros = padding_zeros + self.blocks_vector_source_x_0.set_data([0x00] * self.padding_zeros + self.access_code * 10, []) + def get_excess_bw(self): return self.excess_bw @@ -94,7 +98,8 @@ class acgen(gr.top_block): def set_access_code(self, access_code): self.access_code = access_code - self.blocks_vector_source_x_0.set_data([0x00] * 10 + self.access_code * 10, []) + self.blocks_vector_source_x_0.set_data([0x00] * self.padding_zeros + self.access_code * 10, []) + diff --git a/tests/correlator/acproc.py b/tests/correlator/acproc.py index e119520..50c9a38 100755 --- a/tests/correlator/acproc.py +++ b/tests/correlator/acproc.py @@ -2,19 +2,21 @@ import numpy as np import matplotlib.pyplot as plt -import acgen +from acgen import acgen -# Parameters -# samples per symbol -sps = 4 -# number of initial bytes (to ignore) -nzeros = 10 -# length of the access code in bytes -aclen = 2 +# parameters +access_code_bits = [ 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 0, 1, ] +access_code = list(np.packbits([0] * 3 + access_code_bits)) +padding_zeros = 10 # Create samples -print("Modulating symbols") -acgen.main() +print(f"Modulating symbols for access code {access_code_bits} = {access_code} with after {padding_zeros} empty bytes") +gen = acgen() +gen.set_access_code(access_code) +gen.set_padding_zeros(padding_zeros) + +gen.start() +gen.wait() # Extract one sequence print("Extracting symbol sequence") @@ -27,17 +29,24 @@ plt.title("Raw Data (time domain)") plt.show() # take only symbols -symbols = data[1::sps] +symbols = data[1::gen.sps] + plt.plot(symbols.real, symbols.imag) plt.title("Symbols only (constellation)") plt.show() # where ac symbols start, in symbols -ac_start = nzeros * 8 -ac_end = ac_start + aclen * 8 +ac_start = (padding_zeros) * 8 + 3 # plus three because code is 13 bits +ac_end = ac_start + int(np.ceil(len(access_code_bits) / 2.)) # divided by two because QPSK ac = symbols[ac_start:ac_end] +print(f"Generated {len(ac)} (left padded) symbols from a {len(access_code_bits)} bit sequence") +print(list(ac)) + +print(f"Upsampled to {gen.sps} samples per symbos") +print(sum([[i, i, i, i] for i in ac], [])) + fig, (ax1, ax2) = plt.subplots(2, 1) fig.tight_layout() @@ -51,7 +60,14 @@ plt.show() fir = list(np.conj(ac[::-1])) -# print the symbols -print(f"Generated {len(ac)} symbols from a {aclen} byte sequence") -print("Reversed symbols (for FIR filter):") +# Print the symbols +print("Reversed complex conjugate symbols (for FIR filter):") print(fir) + +# Compute cross correlation + +xc = np.convolve(fir, ac) + +plt.plot(np.abs(xc)) +plt.title("Cross correlation (FIR)") +plt.show() diff --git a/tests/correlator/correlator.grc b/tests/correlator/correlator.grc index cc57e18..723a99d 100644 --- a/tests/correlator/correlator.grc +++ b/tests/correlator/correlator.grc @@ -1,7 +1,6 @@ options: parameters: author: Naoki Pross - catch_exceptions: 'True' category: '[GRC Hier Blocks]' cmake_opt: '' comment: '' @@ -23,6 +22,7 @@ options: sizing_mode: fixed thread_safe_setters: '' title: Correlator Test + window_size: '' states: bus_sink: false bus_source: false @@ -32,13 +32,31 @@ options: state: enabled blocks: +- name: access_code_symbols_sps + id: variable + parameters: + comment: '' + value: '[(1.4142197+1.4142197j), (1.4142197+1.4142197j), (1.4142197+1.4142197j), + (1.4142197+1.4142197j), (1.4142197-1.4142197j), (1.4142197-1.4142197j), (1.4142197-1.4142197j), + (1.4142197-1.4142197j), (1.4142197-1.4142197j), (1.4142197-1.4142197j), (1.4142197-1.4142197j), + (1.4142197-1.4142197j), (-1.4142197-1.4142197j), (-1.4142197-1.4142197j), (-1.4142197-1.4142197j), + (-1.4142197-1.4142197j), (1.4142197-1.4142197j), (1.4142197-1.4142197j), (1.4142197-1.4142197j), + (1.4142197-1.4142197j), (1.4142197+1.4142197j), (1.4142197+1.4142197j), (1.4142197+1.4142197j), + (1.4142197+1.4142197j), (1.4142197+1.4142197j), (1.4142197+1.4142197j), (1.4142197+1.4142197j), + (1.4142197+1.4142197j)]' + states: + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [224, 132.0] + rotation: 0 + state: true - name: const id: variable_constellation parameters: comment: '' const_points: '[-1-1j, -1+1j, 1+1j, 1-1j]' dims: '1' - normalization: digital.constellation.AMPLITUDE_NORMALIZATION precision: '8' rot_sym: '4' soft_dec_lut: None @@ -48,9 +66,9 @@ blocks: bus_sink: false bus_source: false bus_structure: null - coordinate: [432, 164.0] + coordinate: [592, 484.0] rotation: 0 - state: true + state: enabled - name: excess_bw id: variable parameters: @@ -60,9 +78,9 @@ blocks: bus_sink: false bus_source: false bus_structure: null - coordinate: [432, 340.0] + coordinate: [496, 484.0] rotation: 0 - state: true + state: enabled - name: nfilts id: variable parameters: @@ -72,9 +90,22 @@ blocks: bus_sink: false bus_source: false bus_structure: null - coordinate: [696, 356.0] + coordinate: [224, 988.0] rotation: 0 - state: true + state: enabled +- name: revconj_access_code_symbols + id: variable + parameters: + comment: '' + value: '[(1.4142197-1.4142197j), (1.4142197-1.4142197j), (1.4142197+1.4142197j), + (-1.4142197+1.4142197j), (1.4142197+1.4142197j), (1.4142197+1.4142197j), (1.4142197-1.4142197j)]' + states: + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [992, 620.0] + rotation: 0 + state: enabled - name: rrc_taps id: variable parameters: @@ -84,9 +115,9 @@ blocks: bus_sink: false bus_source: false bus_structure: null - coordinate: [768, 356.0] + coordinate: [304, 988.0] rotation: 0 - state: true + state: enabled - name: samp_rate id: variable parameters: @@ -96,7 +127,7 @@ blocks: bus_sink: false bus_source: false bus_structure: null - coordinate: [256, 52.0] + coordinate: [8, 116.0] rotation: 0 state: enabled - name: sps @@ -108,9 +139,21 @@ blocks: bus_sink: false bus_source: false bus_structure: null - coordinate: [352, 52.0] + coordinate: [104, 116.0] rotation: 0 - state: true + state: enabled +- name: testvec + id: variable + parameters: + comment: '' + value: '[31, 53] + [0x12, 0xe3, 0x9b, 0xee, 0x84, 0x23]' + states: + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [48, 492.0] + rotation: 0 + state: enabled - name: timing_loop_bw id: variable parameters: @@ -120,11 +163,11 @@ blocks: bus_sink: false bus_source: false bus_structure: null - coordinate: [696, 420.0] + coordinate: [224, 1068.0] rotation: 0 - state: true -- name: blocks_complex_to_mag_0 - id: blocks_complex_to_mag + state: enabled +- name: blocks_complex_to_magphase_0 + id: blocks_complex_to_magphase parameters: affinity: '' alias: '' @@ -136,9 +179,43 @@ blocks: bus_sink: false bus_source: false bus_structure: null - coordinate: [1584, 80.0] + coordinate: [1008, 696.0] rotation: 0 - state: true + state: enabled +- name: blocks_complex_to_magphase_0_0 + id: blocks_complex_to_magphase + parameters: + affinity: '' + alias: '' + comment: '' + maxoutbuf: '0' + minoutbuf: '0' + vlen: '1' + states: + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [1072, 1112.0] + rotation: 0 + state: disabled +- name: blocks_multiply_const_vxx_0 + id: blocks_multiply_const_vxx + parameters: + affinity: '' + alias: '' + comment: '' + const: 180 / 3.141592653589793 + maxoutbuf: '0' + minoutbuf: '0' + type: float + vlen: '1' + states: + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [1280, 788.0] + rotation: 0 + state: enabled - name: blocks_null_sink_0 id: blocks_null_sink parameters: @@ -153,9 +230,117 @@ blocks: bus_sink: false bus_source: false bus_structure: null - coordinate: [1528, 216.0] + coordinate: [1056, 840.0] rotation: 0 - state: true + state: enabled +- name: blocks_null_sink_0_0 + id: blocks_null_sink + parameters: + affinity: '' + alias: '' + bus_structure_sink: '[[0,],]' + comment: '' + num_inputs: '1' + type: complex + vlen: '1' + states: + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [1080, 1048.0] + rotation: 0 + state: disabled +- name: blocks_null_sink_1_0 + id: blocks_null_sink + parameters: + affinity: '' + alias: '' + bus_structure_sink: '[[0,],]' + comment: '' + num_inputs: '1' + type: float + vlen: '1' + states: + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [1336, 1176.0] + rotation: 0 + state: disabled +- name: blocks_null_sink_1_0_0 + id: blocks_null_sink + parameters: + affinity: '' + alias: '' + bus_structure_sink: '[[0,],]' + comment: '' + num_inputs: '1' + type: float + vlen: '1' + states: + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [1288, 856.0] + rotation: 0 + state: disabled +- name: blocks_null_source_0 + id: blocks_null_source + parameters: + affinity: '' + alias: '' + bus_structure_source: '[[0,],]' + comment: '' + maxoutbuf: '0' + minoutbuf: '0' + num_outputs: '1' + type: byte + vlen: '1' + states: + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [96, 344.0] + rotation: 0 + state: enabled +- name: blocks_stream_mux_0 + id: blocks_stream_mux + parameters: + affinity: '' + alias: '' + comment: '' + lengths: '[15, len(testvec)]' + maxoutbuf: '0' + minoutbuf: '0' + num_inputs: '2' + type: byte + vlen: '1' + states: + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [288, 392.0] + rotation: 0 + state: enabled +- name: blocks_stream_mux_1 + id: blocks_stream_mux + parameters: + affinity: '' + alias: '' + comment: '' + lengths: '[len(access_code_symbols_sps), sps * (len(testvec) + 15)]' + maxoutbuf: '0' + minoutbuf: '0' + num_inputs: '2' + type: complex + vlen: '1' + states: + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [776, 280.0] + rotation: 0 + state: disabled - name: blocks_throttle_0 id: blocks_throttle parameters: @@ -166,15 +351,15 @@ blocks: maxoutbuf: '0' minoutbuf: '0' samples_per_second: samp_rate - type: byte + type: complex vlen: '1' states: bus_sink: false bus_source: false bus_structure: null - coordinate: [248, 260.0] + coordinate: [1272, 404.0] rotation: 0 - state: true + state: enabled - name: blocks_vector_source_x_0 id: blocks_vector_source_x parameters: @@ -183,18 +368,59 @@ blocks: comment: '' maxoutbuf: '0' minoutbuf: '0' - repeat: 'False' + repeat: 'True' tags: '[]' type: byte - vector: ([0x00] * 10 + [0xaa, 0xff, 0x0a] + [0x00] * 10) * 20 + vector: testvec vlen: '1' states: bus_sink: false bus_source: false bus_structure: null - coordinate: [16, 244.0] + coordinate: [48, 404.0] rotation: 0 - state: true + state: enabled +- name: blocks_vector_source_x_1 + id: blocks_vector_source_x + parameters: + affinity: '' + alias: '' + comment: '' + maxoutbuf: '0' + minoutbuf: '0' + repeat: 'True' + tags: '[]' + type: complex + vector: access_code_symbols_sps + vlen: '1' + states: + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [224, 204.0] + rotation: 0 + state: disabled +- name: channels_channel_model_0 + id: channels_channel_model + parameters: + affinity: '' + alias: '' + block_tags: 'False' + comment: '' + epsilon: '1.0' + freq_offset: '0.0' + maxoutbuf: '0' + minoutbuf: '0' + noise_voltage: '0.1' + seed: '243' + taps: '1. ' + states: + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [992, 364.0] + rotation: 0 + state: enabled - name: digital_cma_equalizer_cc_0 id: digital_cma_equalizer_cc parameters: @@ -211,7 +437,7 @@ blocks: bus_sink: false bus_source: false bus_structure: null - coordinate: [992, 188.0] + coordinate: [528, 812.0] rotation: 0 state: enabled - name: digital_constellation_decoder_cb_0 @@ -227,9 +453,9 @@ blocks: bus_sink: false bus_source: false bus_structure: null - coordinate: [1264, 212.0] + coordinate: [800, 836.0] rotation: 0 - state: true + state: enabled - name: digital_constellation_modulator_0 id: digital_constellation_modulator parameters: @@ -243,15 +469,35 @@ blocks: maxoutbuf: '0' minoutbuf: '0' samples_per_symbol: sps - truncate: 'False' verbose: 'False' states: bus_sink: false bus_source: false bus_structure: null - coordinate: [432, 236.0] + coordinate: [496, 380.0] rotation: 0 - state: true + state: enabled +- name: digital_corr_est_cc_0 + id: digital_corr_est_cc + parameters: + affinity: '' + alias: '' + comment: '' + mark_delay: '0' + maxoutbuf: '0' + minoutbuf: '0' + sps: '1' + symbols: '[(1.4142197+1.4142197j), (1.4142197-1.4142197j), (1.4142197-1.4142197j), + (-1.4142197-1.4142197j), (1.4142197-1.4142197j), (1.4142197+1.4142197j), (1.4142197+1.4142197j)]' + threshold: '.9' + threshold_method: digital.THRESHOLD_DYNAMIC + states: + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [768, 1076.0] + rotation: 0 + state: disabled - name: digital_pfb_clock_sync_xxx_0 id: digital_pfb_clock_sync_xxx parameters: @@ -272,9 +518,9 @@ blocks: bus_sink: false bus_source: false bus_structure: null - coordinate: [696, 212.0] + coordinate: [224, 836.0] rotation: 0 - state: true + state: enabled - name: fir_filter_xxx_1 id: fir_filter_xxx parameters: @@ -285,17 +531,105 @@ blocks: maxoutbuf: '0' minoutbuf: '0' samp_delay: '0' - taps: '[(-1.4142197+1.4142197j), (-1.4142197+1.4142197j), (1.4142197-1.4142197j), - (1.4142197-1.4142197j), (1.4142197-1.4142197j), (1.4142197-1.4142197j), (-1.4142197-1.4142197j), - (-1.4142197-1.4142197j), (-1.4142197-1.4142197j), (-1.4142197-1.4142197j), (-1.4142197-1.4142197j), - (-1.4142197-1.4142197j), (-1.4142197+1.4142197j), (-1.4142197+1.4142197j), (1.4142197-1.4142197j), - (1.4142197-1.4142197j)]' + taps: revconj_access_code_symbols type: ccc states: bus_sink: false bus_source: false bus_structure: null - coordinate: [1328, 68.0] + coordinate: [768, 700.0] + rotation: 0 + state: enabled +- name: qtgui_const_sink_x_0 + id: qtgui_const_sink_x + parameters: + affinity: '' + alias: '' + alpha1: '1.0' + alpha10: '1.0' + alpha2: '1.0' + alpha3: '1.0' + alpha4: '1.0' + alpha5: '1.0' + alpha6: '1.0' + alpha7: '1.0' + alpha8: '1.0' + alpha9: '1.0' + autoscale: 'False' + axislabels: 'True' + color1: '"blue"' + color10: '"red"' + color2: '"red"' + color3: '"red"' + color4: '"red"' + color5: '"red"' + color6: '"red"' + color7: '"red"' + color8: '"red"' + color9: '"red"' + comment: '' + grid: 'False' + gui_hint: '' + label1: '' + label10: '' + label2: '' + label3: '' + label4: '' + label5: '' + label6: '' + label7: '' + label8: '' + label9: '' + legend: 'True' + marker1: '0' + marker10: '0' + marker2: '0' + marker3: '0' + marker4: '0' + marker5: '0' + marker6: '0' + marker7: '0' + marker8: '0' + marker9: '0' + name: '""' + nconnections: '1' + size: '1024' + style1: '0' + style10: '0' + style2: '0' + style3: '0' + style4: '0' + style5: '0' + style6: '0' + style7: '0' + style8: '0' + style9: '0' + tr_chan: '0' + tr_level: '0.0' + tr_mode: qtgui.TRIG_MODE_FREE + tr_slope: qtgui.TRIG_SLOPE_POS + tr_tag: '""' + type: complex + update_time: '0.10' + width1: '1' + width10: '1' + width2: '1' + width3: '1' + width4: '1' + width5: '1' + width6: '1' + width7: '1' + width8: '1' + width9: '1' + xmax: '2' + xmin: '-2' + ymax: '2' + ymin: '-2' + states: + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [768, 620.0] rotation: 0 state: enabled - name: qtgui_time_sink_x_0 @@ -313,7 +647,7 @@ blocks: alpha7: '1.0' alpha8: '1.0' alpha9: '1.0' - autoscale: 'False' + autoscale: 'True' axislabels: 'True' color1: blue color10: dark blue @@ -326,10 +660,10 @@ blocks: color8: dark red color9: dark green comment: '' - ctrlpanel: 'True' + ctrlpanel: 'False' entags: 'True' grid: 'False' - gui_hint: '' + gui_hint: 2,0,1,1 label1: Signal 1 label10: Signal 10 label2: Signal 2 @@ -384,18 +718,18 @@ blocks: width7: '1' width8: '1' width9: '1' - ylabel: Amplitude - ymax: '50' + ylabel: XC Magnitude + ymax: '100' ymin: '0' yunit: '""' states: bus_sink: false bus_source: false bus_structure: null - coordinate: [1792, 60.0] + coordinate: [1280, 676.0] rotation: 0 - state: true -- name: qtgui_time_sink_x_1 + state: enabled +- name: qtgui_time_sink_x_0_0 id: qtgui_time_sink_x parameters: affinity: '' @@ -410,7 +744,7 @@ blocks: alpha7: '1.0' alpha8: '1.0' alpha9: '1.0' - autoscale: 'False' + autoscale: 'True' axislabels: 'True' color1: blue color10: dark blue @@ -423,10 +757,107 @@ blocks: color8: dark red color9: dark green comment: '' - ctrlpanel: 'True' + ctrlpanel: 'False' entags: 'True' grid: 'False' - gui_hint: '' + gui_hint: 2,0,1,1 + label1: Signal 1 + label10: Signal 10 + label2: Signal 2 + label3: Signal 3 + label4: Signal 4 + label5: Signal 5 + label6: Signal 6 + label7: Signal 7 + label8: Signal 8 + label9: Signal 9 + legend: 'True' + marker1: '-1' + marker10: '-1' + marker2: '-1' + marker3: '-1' + marker4: '-1' + marker5: '-1' + marker6: '-1' + marker7: '-1' + marker8: '-1' + marker9: '-1' + name: '""' + nconnections: '1' + size: '1024' + srate: samp_rate + stemplot: 'False' + style1: '1' + style10: '1' + style2: '1' + style3: '1' + style4: '1' + style5: '1' + style6: '1' + style7: '1' + style8: '1' + style9: '1' + tr_chan: '0' + tr_delay: '0' + tr_level: '0.0' + tr_mode: qtgui.TRIG_MODE_FREE + tr_slope: qtgui.TRIG_SLOPE_POS + tr_tag: '""' + type: float + update_time: '0.10' + width1: '1' + width10: '1' + width2: '1' + width3: '1' + width4: '1' + width5: '1' + width6: '1' + width7: '1' + width8: '1' + width9: '1' + ylabel: Cross Correlation Magnitude + ymax: '100' + ymin: '0' + yunit: '""' + states: + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [1336, 1092.0] + rotation: 0 + state: disabled +- name: qtgui_time_sink_x_1_0 + id: qtgui_time_sink_x + parameters: + affinity: '' + alias: '' + alpha1: '1.0' + alpha10: '1.0' + alpha2: '1.0' + alpha3: '1.0' + alpha4: '1.0' + alpha5: '1.0' + alpha6: '1.0' + alpha7: '1.0' + alpha8: '1.0' + alpha9: '1.0' + autoscale: 'True' + axislabels: 'True' + color1: blue + color10: dark blue + color2: red + color3: green + color4: black + color5: cyan + color6: magenta + color7: yellow + color8: dark red + color9: dark green + comment: '' + ctrlpanel: 'False' + entags: 'True' + grid: 'False' + gui_hint: 0,0,1,1 label1: Signal 1 label10: Signal 10 label2: Signal 2 @@ -481,7 +912,7 @@ blocks: width7: '1' width8: '1' width9: '1' - ylabel: Amplitude + ylabel: Modulated ymax: '2' ymin: '-2' yunit: '""' @@ -489,21 +920,282 @@ blocks: bus_sink: false bus_source: false bus_structure: null - coordinate: [696, 108.0] + coordinate: [992, 196.0] rotation: 0 - state: true + state: disabled +- name: qtgui_time_sink_x_1_1 + id: qtgui_time_sink_x + parameters: + affinity: '' + alias: '' + alpha1: '1.0' + alpha10: '1.0' + alpha2: '1.0' + alpha3: '1.0' + alpha4: '1.0' + alpha5: '1.0' + alpha6: '1.0' + alpha7: '1.0' + alpha8: '1.0' + alpha9: '1.0' + autoscale: 'True' + axislabels: 'True' + color1: blue + color10: dark blue + color2: red + color3: green + color4: black + color5: cyan + color6: magenta + color7: yellow + color8: dark red + color9: dark green + comment: '' + ctrlpanel: 'False' + entags: 'True' + grid: 'False' + gui_hint: 1,0,1,1 + label1: Signal 1 + label10: Signal 10 + label2: Signal 2 + label3: Signal 3 + label4: Signal 4 + label5: Signal 5 + label6: Signal 6 + label7: Signal 7 + label8: Signal 8 + label9: Signal 9 + legend: 'True' + marker1: '-1' + marker10: '-1' + marker2: '-1' + marker3: '-1' + marker4: '-1' + marker5: '-1' + marker6: '-1' + marker7: '-1' + marker8: '-1' + marker9: '-1' + name: '""' + nconnections: '1' + size: '1024' + srate: samp_rate + stemplot: 'False' + style1: '1' + style10: '1' + style2: '1' + style3: '1' + style4: '1' + style5: '1' + style6: '1' + style7: '1' + style8: '1' + style9: '1' + tr_chan: '0' + tr_delay: '0' + tr_level: '0.0' + tr_mode: qtgui.TRIG_MODE_FREE + tr_slope: qtgui.TRIG_SLOPE_POS + tr_tag: '""' + type: complex + update_time: '0.10' + width1: '1' + width10: '1' + width2: '1' + width3: '1' + width4: '1' + width5: '1' + width6: '1' + width7: '1' + width8: '1' + width9: '1' + ylabel: Equalized + ymax: '2' + ymin: '-2' + yunit: '""' + states: + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [800, 932.0] + rotation: 0 + state: enabled +- name: qtgui_time_sink_x_2 + id: qtgui_time_sink_x + parameters: + affinity: '' + alias: '' + alpha1: '1.0' + alpha10: '1.0' + alpha2: '1.0' + alpha3: '1.0' + alpha4: '1.0' + alpha5: '1.0' + alpha6: '1.0' + alpha7: '1.0' + alpha8: '1.0' + alpha9: '1.0' + autoscale: 'True' + axislabels: 'True' + color1: blue + color10: dark blue + color2: red + color3: green + color4: black + color5: cyan + color6: magenta + color7: yellow + color8: dark red + color9: dark green + comment: '' + ctrlpanel: 'False' + entags: 'True' + grid: 'False' + gui_hint: 3,0,1,1 + label1: Signal 1 + label10: Signal 10 + label2: Signal 2 + label3: Signal 3 + label4: Signal 4 + label5: Signal 5 + label6: Signal 6 + label7: Signal 7 + label8: Signal 8 + label9: Signal 9 + legend: 'True' + marker1: '-1' + marker10: '-1' + marker2: '-1' + marker3: '-1' + marker4: '-1' + marker5: '-1' + marker6: '-1' + marker7: '-1' + marker8: '-1' + marker9: '-1' + name: '""' + nconnections: '1' + size: '1024' + srate: samp_rate + stemplot: 'False' + style1: '1' + style10: '1' + style2: '1' + style3: '1' + style4: '1' + style5: '1' + style6: '1' + style7: '1' + style8: '1' + style9: '1' + tr_chan: '0' + tr_delay: '0' + tr_level: '0.0' + tr_mode: qtgui.TRIG_MODE_FREE + tr_slope: qtgui.TRIG_SLOPE_POS + tr_tag: '""' + type: float + update_time: '0.10' + width1: '1' + width10: '1' + width2: '1' + width3: '1' + width4: '1' + width5: '1' + width6: '1' + width7: '1' + width8: '1' + width9: '1' + ylabel: XC Phase + ymax: '1' + ymin: '-1' + yunit: '""' + states: + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [1456, 772.0] + rotation: 0 + state: enabled +- name: root_raised_cosine_filter_0 + id: root_raised_cosine_filter + parameters: + affinity: '' + alias: '' + alpha: excess_bw + comment: '' + decim: '1' + gain: '2' + interp: '1' + maxoutbuf: '0' + minoutbuf: '0' + ntaps: 11*samp_rate + samp_rate: samp_rate + sym_rate: '1' + type: fir_filter_ccf + states: + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [496, 180.0] + rotation: 0 + state: disabled +- name: virtual_sink_0 + id: virtual_sink + parameters: + alias: '' + comment: '' + stream_id: envelope + states: + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [1480, 404.0] + rotation: 0 + state: enabled +- name: virtual_source_0 + id: virtual_source + parameters: + alias: '' + comment: '' + stream_id: envelope + states: + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [8, 884.0] + rotation: 0 + state: enabled connections: -- [blocks_complex_to_mag_0, '0', qtgui_time_sink_x_0, '0'] -- [blocks_throttle_0, '0', digital_constellation_modulator_0, '0'] -- [blocks_vector_source_x_0, '0', blocks_throttle_0, '0'] +- [blocks_complex_to_magphase_0, '0', qtgui_time_sink_x_0, '0'] +- [blocks_complex_to_magphase_0, '1', blocks_multiply_const_vxx_0, '0'] +- [blocks_complex_to_magphase_0, '1', blocks_null_sink_1_0_0, '0'] +- [blocks_complex_to_magphase_0_0, '0', qtgui_time_sink_x_0_0, '0'] +- [blocks_complex_to_magphase_0_0, '1', blocks_null_sink_1_0, '0'] +- [blocks_multiply_const_vxx_0, '0', qtgui_time_sink_x_2, '0'] +- [blocks_null_source_0, '0', blocks_stream_mux_0, '0'] +- [blocks_stream_mux_0, '0', digital_constellation_modulator_0, '0'] +- [blocks_stream_mux_1, '0', channels_channel_model_0, '0'] +- [blocks_stream_mux_1, '0', qtgui_time_sink_x_1_0, '0'] +- [blocks_throttle_0, '0', virtual_sink_0, '0'] +- [blocks_vector_source_x_0, '0', blocks_stream_mux_0, '1'] +- [blocks_vector_source_x_1, '0', root_raised_cosine_filter_0, '0'] +- [channels_channel_model_0, '0', blocks_throttle_0, '0'] - [digital_cma_equalizer_cc_0, '0', digital_constellation_decoder_cb_0, '0'] +- [digital_cma_equalizer_cc_0, '0', digital_corr_est_cc_0, '0'] - [digital_cma_equalizer_cc_0, '0', fir_filter_xxx_1, '0'] +- [digital_cma_equalizer_cc_0, '0', qtgui_const_sink_x_0, '0'] +- [digital_cma_equalizer_cc_0, '0', qtgui_time_sink_x_1_1, '0'] - [digital_constellation_decoder_cb_0, '0', blocks_null_sink_0, '0'] -- [digital_constellation_modulator_0, '0', digital_pfb_clock_sync_xxx_0, '0'] -- [digital_constellation_modulator_0, '0', qtgui_time_sink_x_1, '0'] +- [digital_constellation_modulator_0, '0', blocks_stream_mux_1, '1'] +- [digital_constellation_modulator_0, '0', channels_channel_model_0, '0'] +- [digital_corr_est_cc_0, '0', blocks_null_sink_0_0, '0'] +- [digital_corr_est_cc_0, '1', blocks_complex_to_magphase_0_0, '0'] - [digital_pfb_clock_sync_xxx_0, '0', digital_cma_equalizer_cc_0, '0'] -- [fir_filter_xxx_1, '0', blocks_complex_to_mag_0, '0'] +- [fir_filter_xxx_1, '0', blocks_complex_to_magphase_0, '0'] +- [root_raised_cosine_filter_0, '0', blocks_stream_mux_1, '0'] +- [virtual_source_0, '0', digital_pfb_clock_sync_xxx_0, '0'] metadata: file_format: 1 diff --git a/tests/correlator/correlator.py b/tests/correlator/correlator.py index 79fa3f8..15d9c9c 100755 --- a/tests/correlator/correlator.py +++ b/tests/correlator/correlator.py @@ -7,7 +7,7 @@ # GNU Radio Python Flow Graph # Title: Correlator Test # Author: Naoki Pross -# GNU Radio version: 3.9.2.0 +# GNU Radio version: 3.8.2.0 from distutils.version import StrictVersion @@ -26,24 +26,22 @@ from gnuradio import qtgui from gnuradio.filter import firdes import sip from gnuradio import blocks +from gnuradio import channels from gnuradio import digital from gnuradio import filter from gnuradio import gr -from gnuradio.fft import window import sys import signal from argparse import ArgumentParser from gnuradio.eng_arg import eng_float, intx from gnuradio import eng_notation - - from gnuradio import qtgui class correlator(gr.top_block, Qt.QWidget): def __init__(self): - gr.top_block.__init__(self, "Correlator Test", catch_exceptions=True) + gr.top_block.__init__(self, "Correlator Test") Qt.QWidget.__init__(self) self.setWindowTitle("Correlator Test") qtgui.util.check_set_qss() @@ -80,32 +78,85 @@ class correlator(gr.top_block, Qt.QWidget): self.nfilts = nfilts = 32 self.excess_bw = excess_bw = .35 self.timing_loop_bw = timing_loop_bw = 2 * 3.141592653589793 / 100 + self.testvec = testvec = [31, 53] + [0x12, 0xe3, 0x9b, 0xee, 0x84, 0x23] self.samp_rate = samp_rate = 32000 self.rrc_taps = rrc_taps = firdes.root_raised_cosine(nfilts, nfilts, 1.0/float(sps), excess_bw, 45*nfilts) + self.revconj_access_code_symbols = revconj_access_code_symbols = [(1.4142197-1.4142197j), (1.4142197-1.4142197j), (1.4142197+1.4142197j), (-1.4142197+1.4142197j), (1.4142197+1.4142197j), (1.4142197+1.4142197j), (1.4142197-1.4142197j)] self.const = const = digital.constellation_qpsk().base() + self.access_code_symbols_sps = access_code_symbols_sps = [(1.4142197+1.4142197j), (1.4142197+1.4142197j), (1.4142197+1.4142197j), (1.4142197+1.4142197j), (1.4142197-1.4142197j), (1.4142197-1.4142197j), (1.4142197-1.4142197j), (1.4142197-1.4142197j), (1.4142197-1.4142197j), (1.4142197-1.4142197j), (1.4142197-1.4142197j), (1.4142197-1.4142197j), (-1.4142197-1.4142197j), (-1.4142197-1.4142197j), (-1.4142197-1.4142197j), (-1.4142197-1.4142197j), (1.4142197-1.4142197j), (1.4142197-1.4142197j), (1.4142197-1.4142197j), (1.4142197-1.4142197j), (1.4142197+1.4142197j), (1.4142197+1.4142197j), (1.4142197+1.4142197j), (1.4142197+1.4142197j), (1.4142197+1.4142197j), (1.4142197+1.4142197j), (1.4142197+1.4142197j), (1.4142197+1.4142197j)] ################################################## # Blocks ################################################## - self.qtgui_time_sink_x_1 = qtgui.time_sink_c( + self.qtgui_time_sink_x_2 = qtgui.time_sink_f( + 1024, #size + samp_rate, #samp_rate + "", #name + 1 #number of inputs + ) + self.qtgui_time_sink_x_2.set_update_time(0.10) + self.qtgui_time_sink_x_2.set_y_axis(-1, 1) + + self.qtgui_time_sink_x_2.set_y_label('XC Phase', "") + + self.qtgui_time_sink_x_2.enable_tags(True) + self.qtgui_time_sink_x_2.set_trigger_mode(qtgui.TRIG_MODE_FREE, qtgui.TRIG_SLOPE_POS, 0.0, 0, 0, "") + self.qtgui_time_sink_x_2.enable_autoscale(True) + self.qtgui_time_sink_x_2.enable_grid(False) + self.qtgui_time_sink_x_2.enable_axis_labels(True) + self.qtgui_time_sink_x_2.enable_control_panel(False) + self.qtgui_time_sink_x_2.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_2.set_line_label(i, "Data {0}".format(i)) + else: + self.qtgui_time_sink_x_2.set_line_label(i, labels[i]) + self.qtgui_time_sink_x_2.set_line_width(i, widths[i]) + self.qtgui_time_sink_x_2.set_line_color(i, colors[i]) + self.qtgui_time_sink_x_2.set_line_style(i, styles[i]) + self.qtgui_time_sink_x_2.set_line_marker(i, markers[i]) + self.qtgui_time_sink_x_2.set_line_alpha(i, alphas[i]) + + self._qtgui_time_sink_x_2_win = sip.wrapinstance(self.qtgui_time_sink_x_2.pyqwidget(), Qt.QWidget) + self.top_grid_layout.addWidget(self._qtgui_time_sink_x_2_win, 3, 0, 1, 1) + for r in range(3, 4): + self.top_grid_layout.setRowStretch(r, 1) + for c in range(0, 1): + self.top_grid_layout.setColumnStretch(c, 1) + self.qtgui_time_sink_x_1_1 = qtgui.time_sink_c( 1024, #size samp_rate, #samp_rate "", #name - 1, #number of inputs - None # parent + 1 #number of inputs ) - self.qtgui_time_sink_x_1.set_update_time(0.10) - self.qtgui_time_sink_x_1.set_y_axis(-2, 2) + self.qtgui_time_sink_x_1_1.set_update_time(0.10) + self.qtgui_time_sink_x_1_1.set_y_axis(-2, 2) - self.qtgui_time_sink_x_1.set_y_label('Amplitude', "") + self.qtgui_time_sink_x_1_1.set_y_label('Equalized', "") - self.qtgui_time_sink_x_1.enable_tags(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(False) - 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(True) - self.qtgui_time_sink_x_1.enable_stem_plot(False) + self.qtgui_time_sink_x_1_1.enable_tags(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) + self.qtgui_time_sink_x_1_1.enable_stem_plot(False) labels = ['Signal 1', 'Signal 2', 'Signal 3', 'Signal 4', 'Signal 5', @@ -125,37 +176,40 @@ class correlator(gr.top_block, Qt.QWidget): for i in range(2): if len(labels[i]) == 0: if (i % 2 == 0): - self.qtgui_time_sink_x_1.set_line_label(i, "Re{{Data {0}}}".format(i/2)) + self.qtgui_time_sink_x_1_1.set_line_label(i, "Re{{Data {0}}}".format(i/2)) else: - self.qtgui_time_sink_x_1.set_line_label(i, "Im{{Data {0}}}".format(i/2)) + self.qtgui_time_sink_x_1_1.set_line_label(i, "Im{{Data {0}}}".format(i/2)) 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.top_layout.addWidget(self._qtgui_time_sink_x_1_win) + 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.top_grid_layout.addWidget(self._qtgui_time_sink_x_1_1_win, 1, 0, 1, 1) + for r in range(1, 2): + self.top_grid_layout.setRowStretch(r, 1) + for c in range(0, 1): + self.top_grid_layout.setColumnStretch(c, 1) self.qtgui_time_sink_x_0 = qtgui.time_sink_f( 1024, #size samp_rate, #samp_rate "", #name - 1, #number of inputs - None # parent + 1 #number of inputs ) self.qtgui_time_sink_x_0.set_update_time(0.10) - self.qtgui_time_sink_x_0.set_y_axis(0, 50) + self.qtgui_time_sink_x_0.set_y_axis(0, 100) - self.qtgui_time_sink_x_0.set_y_label('Amplitude', "") + self.qtgui_time_sink_x_0.set_y_label('XC Magnitude', "") self.qtgui_time_sink_x_0.enable_tags(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_autoscale(True) 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_control_panel(False) self.qtgui_time_sink_x_0.enable_stem_plot(False) @@ -185,8 +239,52 @@ class correlator(gr.top_block, Qt.QWidget): 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_layout.addWidget(self._qtgui_time_sink_x_0_win) - self.fir_filter_xxx_1 = filter.fir_filter_ccc(1, [(-1.4142197+1.4142197j), (-1.4142197+1.4142197j), (1.4142197-1.4142197j), (1.4142197-1.4142197j), (1.4142197-1.4142197j), (1.4142197-1.4142197j), (-1.4142197-1.4142197j), (-1.4142197-1.4142197j), (-1.4142197-1.4142197j), (-1.4142197-1.4142197j), (-1.4142197-1.4142197j), (-1.4142197-1.4142197j), (-1.4142197+1.4142197j), (-1.4142197+1.4142197j), (1.4142197-1.4142197j), (1.4142197-1.4142197j)]) + self.top_grid_layout.addWidget(self._qtgui_time_sink_x_0_win, 2, 0, 1, 1) + for r in range(2, 3): + self.top_grid_layout.setRowStretch(r, 1) + for c in range(0, 1): + self.top_grid_layout.setColumnStretch(c, 1) + self.qtgui_const_sink_x_0 = qtgui.const_sink_c( + 1024, #size + "", #name + 1 #number of inputs + ) + self.qtgui_const_sink_x_0.set_update_time(0.10) + self.qtgui_const_sink_x_0.set_y_axis(-2, 2) + self.qtgui_const_sink_x_0.set_x_axis(-2, 2) + self.qtgui_const_sink_x_0.set_trigger_mode(qtgui.TRIG_MODE_FREE, qtgui.TRIG_SLOPE_POS, 0.0, 0, "") + self.qtgui_const_sink_x_0.enable_autoscale(False) + self.qtgui_const_sink_x_0.enable_grid(False) + self.qtgui_const_sink_x_0.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(1): + if len(labels[i]) == 0: + self.qtgui_const_sink_x_0.set_line_label(i, "Data {0}".format(i)) + else: + self.qtgui_const_sink_x_0.set_line_label(i, labels[i]) + self.qtgui_const_sink_x_0.set_line_width(i, widths[i]) + self.qtgui_const_sink_x_0.set_line_color(i, colors[i]) + self.qtgui_const_sink_x_0.set_line_style(i, styles[i]) + self.qtgui_const_sink_x_0.set_line_marker(i, markers[i]) + self.qtgui_const_sink_x_0.set_line_alpha(i, alphas[i]) + + self._qtgui_const_sink_x_0_win = sip.wrapinstance(self.qtgui_const_sink_x_0.pyqwidget(), Qt.QWidget) + self.top_grid_layout.addWidget(self._qtgui_const_sink_x_0_win) + self.fir_filter_xxx_1 = filter.fir_filter_ccc(1, revconj_access_code_symbols) self.fir_filter_xxx_1.declare_sample_delay(0) self.digital_pfb_clock_sync_xxx_0 = digital.pfb_clock_sync_ccf(sps, timing_loop_bw, rrc_taps, nfilts, 16, 1.5, 1) self.digital_constellation_modulator_0 = digital.generic_mod( @@ -196,38 +294,50 @@ class correlator(gr.top_block, Qt.QWidget): pre_diff_code=True, excess_bw=excess_bw, verbose=False, - log=False, - truncate=False) + log=False) self.digital_constellation_decoder_cb_0 = digital.constellation_decoder_cb(const) self.digital_cma_equalizer_cc_0 = digital.cma_equalizer_cc(15, 1, .002, 1) - self.blocks_vector_source_x_0 = blocks.vector_source_b(([0x00] * 10 + [0xaa, 0xff, 0x0a] + [0x00] * 10) * 20, False, 1, []) - self.blocks_throttle_0 = blocks.throttle(gr.sizeof_char*1, samp_rate,True) + self.channels_channel_model_0 = channels.channel_model( + noise_voltage=0.1, + frequency_offset=0.0, + epsilon=1.0, + taps=[1. ], + noise_seed=243, + block_tags=False) + 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_stream_mux_0 = blocks.stream_mux(gr.sizeof_char*1, [15, len(testvec)]) + self.blocks_null_source_0 = blocks.null_source(gr.sizeof_char*1) self.blocks_null_sink_0 = blocks.null_sink(gr.sizeof_char*1) - self.blocks_complex_to_mag_0 = blocks.complex_to_mag(1) + self.blocks_multiply_const_vxx_0 = blocks.multiply_const_ff(180 / 3.141592653589793) + self.blocks_complex_to_magphase_0 = blocks.complex_to_magphase(1) ################################################## # Connections ################################################## - self.connect((self.blocks_complex_to_mag_0, 0), (self.qtgui_time_sink_x_0, 0)) - self.connect((self.blocks_throttle_0, 0), (self.digital_constellation_modulator_0, 0)) - self.connect((self.blocks_vector_source_x_0, 0), (self.blocks_throttle_0, 0)) + self.connect((self.blocks_complex_to_magphase_0, 1), (self.blocks_multiply_const_vxx_0, 0)) + self.connect((self.blocks_complex_to_magphase_0, 0), (self.qtgui_time_sink_x_0, 0)) + self.connect((self.blocks_multiply_const_vxx_0, 0), (self.qtgui_time_sink_x_2, 0)) + self.connect((self.blocks_null_source_0, 0), (self.blocks_stream_mux_0, 0)) + self.connect((self.blocks_stream_mux_0, 0), (self.digital_constellation_modulator_0, 0)) + self.connect((self.blocks_throttle_0, 0), (self.digital_pfb_clock_sync_xxx_0, 0)) + self.connect((self.blocks_vector_source_x_0, 0), (self.blocks_stream_mux_0, 1)) + self.connect((self.channels_channel_model_0, 0), (self.blocks_throttle_0, 0)) self.connect((self.digital_cma_equalizer_cc_0, 0), (self.digital_constellation_decoder_cb_0, 0)) self.connect((self.digital_cma_equalizer_cc_0, 0), (self.fir_filter_xxx_1, 0)) + self.connect((self.digital_cma_equalizer_cc_0, 0), (self.qtgui_const_sink_x_0, 0)) + self.connect((self.digital_cma_equalizer_cc_0, 0), (self.qtgui_time_sink_x_1_1, 0)) self.connect((self.digital_constellation_decoder_cb_0, 0), (self.blocks_null_sink_0, 0)) - self.connect((self.digital_constellation_modulator_0, 0), (self.digital_pfb_clock_sync_xxx_0, 0)) - self.connect((self.digital_constellation_modulator_0, 0), (self.qtgui_time_sink_x_1, 0)) + self.connect((self.digital_constellation_modulator_0, 0), (self.channels_channel_model_0, 0)) self.connect((self.digital_pfb_clock_sync_xxx_0, 0), (self.digital_cma_equalizer_cc_0, 0)) - self.connect((self.fir_filter_xxx_1, 0), (self.blocks_complex_to_mag_0, 0)) + self.connect((self.fir_filter_xxx_1, 0), (self.blocks_complex_to_magphase_0, 0)) def closeEvent(self, event): self.settings = Qt.QSettings("GNU Radio", "correlator") self.settings.setValue("geometry", self.saveGeometry()) - self.stop() - self.wait() - event.accept() def get_sps(self): @@ -258,6 +368,13 @@ class correlator(gr.top_block, Qt.QWidget): self.timing_loop_bw = timing_loop_bw self.digital_pfb_clock_sync_xxx_0.set_loop_bandwidth(self.timing_loop_bw) + def get_testvec(self): + return self.testvec + + def set_testvec(self, testvec): + self.testvec = testvec + self.blocks_vector_source_x_0.set_data(self.testvec, []) + def get_samp_rate(self): return self.samp_rate @@ -265,7 +382,8 @@ class correlator(gr.top_block, Qt.QWidget): self.samp_rate = samp_rate self.blocks_throttle_0.set_sample_rate(self.samp_rate) self.qtgui_time_sink_x_0.set_samp_rate(self.samp_rate) - self.qtgui_time_sink_x_1.set_samp_rate(self.samp_rate) + self.qtgui_time_sink_x_1_1.set_samp_rate(self.samp_rate) + self.qtgui_time_sink_x_2.set_samp_rate(self.samp_rate) def get_rrc_taps(self): return self.rrc_taps @@ -274,12 +392,26 @@ class correlator(gr.top_block, Qt.QWidget): self.rrc_taps = rrc_taps self.digital_pfb_clock_sync_xxx_0.update_taps(self.rrc_taps) + def get_revconj_access_code_symbols(self): + return self.revconj_access_code_symbols + + def set_revconj_access_code_symbols(self, revconj_access_code_symbols): + self.revconj_access_code_symbols = revconj_access_code_symbols + self.fir_filter_xxx_1.set_taps(self.revconj_access_code_symbols) + def get_const(self): return self.const def set_const(self, const): self.const = const + def get_access_code_symbols_sps(self): + return self.access_code_symbols_sps + + def set_access_code_symbols_sps(self, access_code_symbols_sps): + self.access_code_symbols_sps = access_code_symbols_sps + + @@ -297,9 +429,6 @@ def main(top_block_cls=correlator, options=None): tb.show() def sig_handler(sig=None, frame=None): - tb.stop() - tb.wait() - Qt.QApplication.quit() signal.signal(signal.SIGINT, sig_handler) @@ -309,6 +438,11 @@ def main(top_block_cls=correlator, options=None): timer.start(500) timer.timeout.connect(lambda: None) + def quitting(): + tb.stop() + tb.wait() + + qapp.aboutToQuit.connect(quitting) qapp.exec_() if __name__ == '__main__': -- cgit v1.2.1