diff options
17 files changed, 440 insertions, 88 deletions
diff --git a/doc/thesis/Fading.bib b/doc/thesis/Fading.bib index 026cdba..280a5b6 100644 --- a/doc/thesis/Fading.bib +++ b/doc/thesis/Fading.bib @@ -195,23 +195,24 @@ title = {USRP\textsuperscript{\textsf{TM}} B200/B200 Bus Series Specification Sheet}, year = {2019}, author = {Ettus Research}, - url = {https://www.ettus.com/wp-content/uploads/2019/01/b200-b210_spec_sheet.pdf} + url = {https://www.ettus.com/wp-content/uploads/2019/01/b200-b210_spec_sheet.pdf} } @thesis{Valimaki1995, - title = {Discrete-Time Modeling of Acoustic TubesUsing Fractional Delay Filters}, - author = {Välimäki Vesa}, + title = {Discrete-Time Modeling of Acoustic TubesUsing Fractional Delay Filters}, + author = {Välimäki Vesa}, institution = {Helsinki University of Technology, Laboratory of Acoustics and Audio Signal Processing}, - year = {1995}, - month = {12}, - day = {18}, - isbn = {951-22-2880-7}, - issn = {0356-0083X}, + year = {1995}, + month = {12}, + day = {18}, + isbn = {951-22-2880-7}, + issn = {0356-0083X}, } @report{ETSI, - title = {ETSI TS 136 104 V11.4.0}, - author = {ETSI 3rd Generation Partnership Project}, - type = {Technical Specification}, + title = {ETSI TS 136 104 V11.4.0}, + author = {ETSI 3rd Generation Partnership Project}, + type = {Technical Specification}, institution = {{E}uropean {T}elecommunication {S}tandards {I}nstitute}, + url = {https://www.etsi.org/deliver/etsi_ts/136100_136199/136104/11.04.00_60/ts_136104v110400p.pdf} } diff --git a/doc/thesis/Makefile b/doc/thesis/Makefile index 6d2d4ba..f705a6b 100644 --- a/doc/thesis/Makefile +++ b/doc/thesis/Makefile @@ -29,11 +29,12 @@ SOURCES := \ figures/tikz/qpsk-simulations-static.tex \ figures/tikz/qpsk-simulations-dynamic.tex - DATA := \ figures/data/multipath_frequency_response.dat \ figures/data/rice_pdf.dat \ \ + figures/data/qpsk_hw_lab.dat \ + \ figures/data/qpsk_sim_nochannel.dat \ \ figures/data/qpsk_sim_static_firblock_los_halfsymb.dat \ @@ -47,7 +48,6 @@ DATA := \ figures/data/qpsk_sim_dynamic_grblock_nlos_etsi_doppler70.dat - # Get the main file from the file MAIN := $(shell sed -ne 's/^.*\!TeX root =\(.*\)$$/\1/ p' $(SOURCES)) PDF := $(patsubst %.tex, %.pdf, $(MAIN)) diff --git a/doc/thesis/chapters/implementation.tex b/doc/thesis/chapters/implementation.tex index be317cb..4518611 100644 --- a/doc/thesis/chapters/implementation.tex +++ b/doc/thesis/chapters/implementation.tex @@ -268,7 +268,7 @@ def block_phase(self, start, end): In order to study the effects of multipath fading, a series of simulations have been made under different conditions. To simulate a channel affected by multipath fading two blocks from the GR library, and a third custom block were used. The channel model can simulate AWGN, a frequency offset and either a Rayleigh (NLOS) oder Rice (LOS) fading. -\subsection{Fading with discrete time model} +\subsection{Fading with discrete time model} \label{sec:discrete-time-model-fir} For the statical version according to \ref{sec:discrete-time-model} for implement and illustrate the fading effect, a separate block was created and implemented in the channel. Nearer shown in \ref{lst:fractional-delay-fir}. This block is based on a FIR filter. It can be displayed with a direct path (LOS) or without one (NLOS). With the help of this filter, the delay of the line of side paths are illustrated. In this block it is possible to simulate any number of these paths with different strengths, as long as there is an associated amplitude specified for each delayed ray. @@ -380,20 +380,20 @@ The numbers of tags used in this case are similar to the number of given values. \centering \begin{tabular}{rr} \toprule - Excess tap delay in \si{\nano\second} & Relative power in \si{\decibel} \\ + \bfseries Excess tap delay & \bfseries Relative power \\ \midrule - 0 & \(-1.0 \approx 0.7943\) \\ - 50 & \(-1.0 \approx 0.7943\) \\ - 120 & \(-1.0 \approx 0.7943\) \\ - 200 & \( 0.0 = 1.0000\) \\ - 230 & \( 0.0 = 1.0000\) \\ - 500 & \( 0.0 \approx 1.0000\) \\ - 1600 & \(-3.0 \approx 0.5011\) \\ - 2300 & \(-5.0 \approx 0.3162\) \\ - 5000 & \(-7.0 \approx 0.1995\) \\ + \SI{ 0}{\nano\second} & \(\SI{-1.0}{\decibel} \approx 0.7943\) \\ + \SI{ 50}{\nano\second} & \(\SI{-1.0}{\decibel} \approx 0.7943\) \\ + \SI{ 120}{\nano\second} & \(\SI{-1.0}{\decibel} \approx 0.7943\) \\ + \SI{ 200}{\nano\second} & \(\SI{ 0.0}{\decibel} = 1.0000\) \\ + \SI{ 230}{\nano\second} & \(\SI{ 0.0}{\decibel} = 1.0000\) \\ + \SI{ 500}{\nano\second} & \(\SI{ 0.0}{\decibel} = 1.0000\) \\ + \SI{1.6}{\micro\second} & \(\SI{-3.0}{\decibel} \approx 0.5011\) \\ + \SI{2.3}{\micro\second} & \(\SI{-5.0}{\decibel} \approx 0.3162\) \\ + \SI{5.0}{\micro\second} & \(\SI{-7.0}{\decibel} \approx 0.1995\) \\ \bottomrule \end{tabular} - \caption{Values used for the simulation \cite{ETSI}. \label{tab:etsi-tap-values}} + \caption{Extended Typical Urban model (ETU) ETSI Standard PDP values for multipath fading propagation conditions. \cite{ETSI}. \label{tab:etsi-tap-values}} \end{table} % \begin{figure} @@ -494,6 +494,7 @@ Without those only the amplitudes could be seen in the Plots, with all the noise \newgeometry{ + top = 25mm, bottom = 25mm, inner = 15mm, outer = 15mm, } \begin{figure} @@ -501,7 +502,9 @@ Without those only the amplitudes could be seen in the Plots, with all the noise \label{qpsk-simulations-static} \input{figures/tikz/qpsk-simulations-static} \caption{ - QPSK static TODO. + Simulations of a static fading channel models with different tap values. The samples were generated using the custom block discussed in section \ref{sec:discrete-time-model-fir}. For the 1 tap model the fading tap was \(0.2\delta(n - 0.25)\), and for the 4 tap model uses \(0.2 \delta(n - 0.25) + 0.08 \delta(n - 3.25) + 0.5 \delta(n - 4) + 0.4 \delta(n - 6.3)\). In both cases the delays are given in samples. + % delay = [0.25, 3.25, 4, 6.3] + % ampl = [0.2, 0.08, 0.5, 0.4] } \end{figure} \newpage @@ -509,7 +512,7 @@ Without those only the amplitudes could be seen in the Plots, with all the noise \centering \input{figures/tikz/qpsk-simulations-dynamic} \caption{ - QPSK dynamic TODO. + Simulations with a dynamic fading channel model using PDP values of the Extended Typical Urban model (ETU) of the ETSI standard normative Annex B.2 in \cite{ETSI}. The color gradient represents progression in time. } \end{figure} \restoregeometry diff --git a/doc/thesis/figures/data/flowgraphs/channel_qpsk_hw_lab.dat b/doc/thesis/figures/data/flowgraphs/channel_qpsk_hw_lab.dat Binary files differnew file mode 100644 index 0000000..80b01ca --- /dev/null +++ b/doc/thesis/figures/data/flowgraphs/channel_qpsk_hw_lab.dat diff --git a/doc/thesis/figures/data/flowgraphs/equalized_qpsk_hw_lab.dat b/doc/thesis/figures/data/flowgraphs/equalized_qpsk_hw_lab.dat Binary files differnew file mode 100644 index 0000000..13dbddf --- /dev/null +++ b/doc/thesis/figures/data/flowgraphs/equalized_qpsk_hw_lab.dat diff --git a/doc/thesis/figures/data/flowgraphs/locked_qpsk_hw_lab.dat b/doc/thesis/figures/data/flowgraphs/locked_qpsk_hw_lab.dat Binary files differnew file mode 100644 index 0000000..a2581ce --- /dev/null +++ b/doc/thesis/figures/data/flowgraphs/locked_qpsk_hw_lab.dat diff --git a/doc/thesis/figures/data/flowgraphs/synchronized_qpsk_hw_lab.dat b/doc/thesis/figures/data/flowgraphs/synchronized_qpsk_hw_lab.dat Binary files differnew file mode 100644 index 0000000..5ce1df2 --- /dev/null +++ b/doc/thesis/figures/data/flowgraphs/synchronized_qpsk_hw_lab.dat diff --git a/doc/thesis/figures/data/qpsk_hw_lab.py b/doc/thesis/figures/data/qpsk_hw_lab.py new file mode 100644 index 0000000..a8170c6 --- /dev/null +++ b/doc/thesis/figures/data/qpsk_hw_lab.py @@ -0,0 +1,31 @@ +#!/usr/bin/env python3 + +import utils +import numpy as np + +# get array of samples [channel, synchronized, equalized, locked] +samples = utils.load_samples(__file__) + +# range of samples we want to show +start = 1e3 +end = start +50 + +# select every second samples +select_samples = lambda arr: arr[int(start):int(end):2] +values = map(select_samples, samples) + +# split into imaginary and real parts +get_parts = lambda v: (np.real(v), np.imag(v)) +parts = [p for v in map(get_parts, values) for p in v] + +# zip data and add header +data = np.array(list(zip(*parts))) +headers = [ + "channel_re", "channel_im", + "synchronized_re", "synchronized_im", + "equalized_re", "equalized_im", + "locked_re", "locked_im" +] + +# save to file +utils.save_to_file(__file__, data, headers) diff --git a/doc/thesis/figures/data/qpsk_sim_dynamic_grblock_los_etsi_doppler5_k5.py b/doc/thesis/figures/data/qpsk_sim_dynamic_grblock_los_etsi_doppler5_k5.py index eae2afc..f621fd0 100644 --- a/doc/thesis/figures/data/qpsk_sim_dynamic_grblock_los_etsi_doppler5_k5.py +++ b/doc/thesis/figures/data/qpsk_sim_dynamic_grblock_los_etsi_doppler5_k5.py @@ -7,11 +7,11 @@ import numpy as np samples = utils.load_samples(__file__) # range of samples we want to show -start = 1e3 -end = start +800 +start = 5e3 +end = start +1e3 # select every second samples -select_samples = lambda arr: arr[int(start):int(end):4] +select_samples = lambda arr: arr[int(start):int(end):8] values = map(select_samples, samples) # split into imaginary and real parts diff --git a/doc/thesis/figures/data/qpsk_sim_dynamic_grblock_los_etsi_doppler70_k5.py b/doc/thesis/figures/data/qpsk_sim_dynamic_grblock_los_etsi_doppler70_k5.py index eae2afc..c82fbd1 100644 --- a/doc/thesis/figures/data/qpsk_sim_dynamic_grblock_los_etsi_doppler70_k5.py +++ b/doc/thesis/figures/data/qpsk_sim_dynamic_grblock_los_etsi_doppler70_k5.py @@ -8,10 +8,10 @@ samples = utils.load_samples(__file__) # range of samples we want to show start = 1e3 -end = start +800 +end = start +1e3 # select every second samples -select_samples = lambda arr: arr[int(start):int(end):4] +select_samples = lambda arr: arr[int(start):int(end):10] values = map(select_samples, samples) # split into imaginary and real parts diff --git a/doc/thesis/figures/data/qpsk_sim_dynamic_grblock_nlos_etsi_doppler5.py b/doc/thesis/figures/data/qpsk_sim_dynamic_grblock_nlos_etsi_doppler5.py index eae2afc..c82fbd1 100644 --- a/doc/thesis/figures/data/qpsk_sim_dynamic_grblock_nlos_etsi_doppler5.py +++ b/doc/thesis/figures/data/qpsk_sim_dynamic_grblock_nlos_etsi_doppler5.py @@ -8,10 +8,10 @@ samples = utils.load_samples(__file__) # range of samples we want to show start = 1e3 -end = start +800 +end = start +1e3 # select every second samples -select_samples = lambda arr: arr[int(start):int(end):4] +select_samples = lambda arr: arr[int(start):int(end):10] values = map(select_samples, samples) # split into imaginary and real parts diff --git a/doc/thesis/figures/tikz/qpsk-simulations-dynamic.tex b/doc/thesis/figures/tikz/qpsk-simulations-dynamic.tex index 5806d42..4d01c92 100644 --- a/doc/thesis/figures/tikz/qpsk-simulations-dynamic.tex +++ b/doc/thesis/figures/tikz/qpsk-simulations-dynamic.tex @@ -1,19 +1,83 @@ % vim: set ts=2 sw=2 noet: -\newcommand{\makeplot}[6]{% +\newcommand{\makeplot}[5]{% \hfill \begin{tikzpicture} \begin{axis}[ - width = {\linewidth / 3.5}, - height = {\linewidth / 3.5}, + width = {\linewidth / 3.3}, + height = {\linewidth / 3.3}, grid = major, xmin = {-#4}, xmax = {#4}, ymin = {-#4}, ymax = {#4}, + colormap name=viridis, #5 ] - \addplot[only marks, #6] table[x index = #2, y index = #3] {#1}; + \addplot[only marks, scatter] table [x index = #2, y index = #3] {#1}; \end{axis} \end{tikzpicture} \hfill } + +% ------------------------------------------------------------------- + +\noindent +\makeplot{figures/data/qpsk_sim_dynamic_grblock_nlos_etsi_doppler5.dat}{0}{1}{4}{ + ylabel = {Channel with ISI}, + yticklabel style = { + text width = 3em, + align = right, + }, + title = {NLOS, \(\Delta f = \SI{5}{\hertz}\)}, +} +% +\makeplot{figures/data/qpsk_sim_dynamic_grblock_los_etsi_doppler5_k5.dat}{0}{1}{4}{ + title = {LOS, \(\Delta f = \SI{5}{\hertz}, K = 5\)}, +} +% +\makeplot{figures/data/qpsk_sim_dynamic_grblock_los_etsi_doppler70_k5.dat}{0}{1}{4}{ + title = {LOS, \(\Delta f = \SI{70}{\hertz}, K = 5\)}, +} +\newline + +% ------------------------------------------------------------------- + +\noindent +\makeplot{figures/data/qpsk_sim_dynamic_grblock_nlos_etsi_doppler5.dat}{2}{3}{4}{% + ylabel = {Synchronized}, + yticklabel style = { + text width = 3em, + align = right, + }, +} +\makeplot{figures/data/qpsk_sim_dynamic_grblock_los_etsi_doppler5_k5.dat}{2}{3}{4}{} +\makeplot{figures/data/qpsk_sim_dynamic_grblock_los_etsi_doppler70_k5.dat}{2}{3}{4}{} +\newline + +% ------------------------------------------------------------------- + +\noindent +\makeplot{figures/data/qpsk_sim_dynamic_grblock_nlos_etsi_doppler5.dat}{4}{5}{2}{% + ylabel = {Equalized}, + yticklabel style = { + text width = 3em, + align = right, + }, +} +\makeplot{figures/data/qpsk_sim_dynamic_grblock_los_etsi_doppler5_k5.dat}{4}{5}{2}{} +\makeplot{figures/data/qpsk_sim_dynamic_grblock_los_etsi_doppler70_k5.dat}{4}{5}{2}{} +\newline + +% ------------------------------------------------------------------- + +\noindent +\makeplot{figures/data/qpsk_sim_dynamic_grblock_nlos_etsi_doppler5.dat}{6}{7}{2}{% + ylabel = {Locked}, + yticklabel style = { + text width = 3em, + align = right, + }, +} +\makeplot{figures/data/qpsk_sim_dynamic_grblock_los_etsi_doppler5_k5.dat}{6}{7}{2}{} +\makeplot{figures/data/qpsk_sim_dynamic_grblock_los_etsi_doppler70_k5.dat}{6}{7}{2}{} +\newline diff --git a/doc/thesis/figures/tikz/qpsk-simulations-static.tex b/doc/thesis/figures/tikz/qpsk-simulations-static.tex index ebe7957..1afb134 100644 --- a/doc/thesis/figures/tikz/qpsk-simulations-static.tex +++ b/doc/thesis/figures/tikz/qpsk-simulations-static.tex @@ -1,11 +1,10 @@ % vim: set ts=2 sw=2 noet: - \newcommand{\makeplot}[6]{% \hfill \begin{tikzpicture} \begin{axis}[ - width = {\linewidth / 3.5}, - height = {\linewidth / 3.5}, + width = {\linewidth / 3.3}, + height = {\linewidth / 3.3}, grid = major, xmin = {-#4}, xmax = {#4}, ymin = {-#4}, ymax = {#4}, @@ -18,28 +17,34 @@ \hfill } +% ------------------------------------------------------------------- + \noindent \makeplot{figures/data/qpsk_sim_static_firblock_nlos_halfsymb.dat}{0}{1}{4}{ ylabel = {Channel with ISI}, yticklabel style = { - text width = 2.25em, + text width = 3em, align = right, }, title = {1 Tap NLOS}, }{magenta!80!blue} +% \makeplot{figures/data/qpsk_sim_static_firblock_los_halfsymb.dat}{0}{1}{4}{ title = {1 Tap LOS}, }{magenta!80!blue} +% \makeplot{figures/data/qpsk_sim_static_firblock_los_vec.dat}{0}{1}{4}{ title = {4 Taps LOS}, }{magenta!80!blue} \newline +% ------------------------------------------------------------------- + \noindent \makeplot{figures/data/qpsk_sim_static_firblock_nlos_halfsymb.dat}{2}{3}{4}{% ylabel = {Synchronized}, yticklabel style = { - text width = 2.25em, + text width = 3em, align = right, }, }{magenta!60!blue} @@ -47,27 +52,31 @@ \makeplot{figures/data/qpsk_sim_static_firblock_los_vec.dat}{2}{3}{4}{}{magenta!60!blue} \newline +% ------------------------------------------------------------------- + \noindent -\makeplot{figures/data/qpsk_sim_static_firblock_nlos_halfsymb.dat}{4}{5}{1}{% +\makeplot{figures/data/qpsk_sim_static_firblock_nlos_halfsymb.dat}{4}{5}{2}{% ylabel = {Equalized}, yticklabel style = { - text width = 2.25em, + text width = 3em, align = right, }, }{magenta!40!blue} -\makeplot{figures/data/qpsk_sim_static_firblock_los_halfsymb.dat}{4}{5}{1}{}{magenta!40!blue} -\makeplot{figures/data/qpsk_sim_static_firblock_los_vec.dat}{4}{5}{1}{}{magenta!40!blue} +\makeplot{figures/data/qpsk_sim_static_firblock_los_halfsymb.dat}{4}{5}{2}{}{magenta!40!blue} +\makeplot{figures/data/qpsk_sim_static_firblock_los_vec.dat}{4}{5}{2}{}{magenta!40!blue} \newline +% ------------------------------------------------------------------- + \noindent -\makeplot{figures/data/qpsk_sim_static_firblock_nlos_halfsymb.dat}{6}{7}{1}{% +\makeplot{figures/data/qpsk_sim_static_firblock_nlos_halfsymb.dat}{6}{7}{2}{% ylabel = {Locked}, yticklabel style = { - text width = 2.25em, + text width = 3em, align = right, }, }{magenta!20!blue} -\makeplot{figures/data/qpsk_sim_static_firblock_los_halfsymb.dat}{6}{7}{1}{}{magenta!20!blue} -\makeplot{figures/data/qpsk_sim_static_firblock_los_vec.dat}{6}{7}{1}{}{magenta!20!blue} +\makeplot{figures/data/qpsk_sim_static_firblock_los_halfsymb.dat}{6}{7}{2}{}{magenta!20!blue} +\makeplot{figures/data/qpsk_sim_static_firblock_los_vec.dat}{6}{7}{2}{}{magenta!20!blue} \newline diff --git a/flowgraphs/qpsk_hw.grc b/flowgraphs/qpsk_hw.grc index 5ace489..053d364 100644 --- a/flowgraphs/qpsk_hw.grc +++ b/flowgraphs/qpsk_hw.grc @@ -8,7 +8,7 @@ options: description: '' gen_cmake: 'On' gen_linking: dynamic - generate_options: no_gui + generate_options: qt_gui hier_block_src_path: '.:' id: qpsk_hw max_nouts: '0' @@ -198,7 +198,79 @@ blocks: bus_structure: null coordinate: [1064, 1080.0] rotation: 0 - state: disabled + state: enabled +- name: blocks_file_sink_0 + id: blocks_file_sink + parameters: + affinity: '' + alias: '' + append: 'False' + comment: '' + file: data/channel_qpsk_hw.dat + type: complex + unbuffered: 'False' + vlen: '1' + states: + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [992, 596.0] + rotation: 0 + state: true +- name: blocks_file_sink_1 + id: blocks_file_sink + parameters: + affinity: '' + alias: '' + append: 'False' + comment: '' + file: data/synchronized_qpsk_hw.dat + type: complex + unbuffered: 'False' + vlen: '1' + states: + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [520, 1196.0] + rotation: 0 + state: true +- name: blocks_file_sink_2 + id: blocks_file_sink + parameters: + affinity: '' + alias: '' + append: 'False' + comment: '' + file: data/equalized_qpsk_hw.dat + type: complex + unbuffered: 'False' + vlen: '1' + states: + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [768, 1164.0] + rotation: 0 + state: true +- name: blocks_file_sink_3 + id: blocks_file_sink + parameters: + affinity: '' + alias: '' + append: 'False' + comment: '' + file: data/locked_qpsk_hw.dat + type: complex + unbuffered: 'False' + vlen: '1' + states: + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [1312, 836.0] + rotation: 0 + state: true - name: blocks_repack_bits_bb_0 id: blocks_repack_bits_bb parameters: @@ -361,7 +433,7 @@ blocks: minoutbuf: '0' sps: '1' symbols: access_code_symbols - threshold: '0.7' + threshold: '0.65' threshold_method: digital.THRESHOLD_ABSOLUTE states: bus_sink: false @@ -490,7 +562,7 @@ blocks: bus_sink: false bus_source: false bus_structure: null - coordinate: [1280, 916.0] + coordinate: [1312, 924.0] rotation: 0 state: enabled - name: fadingui_netsink_4 @@ -522,7 +594,7 @@ blocks: bus_sink: false bus_source: false bus_structure: null - coordinate: [968, 660.0] + coordinate: [992, 684.0] rotation: 0 state: enabled - name: fadingui_phasecorrection_0 @@ -643,9 +715,9 @@ blocks: bus_sink: false bus_source: false bus_structure: null - coordinate: [1280, 784.0] + coordinate: [1312, 720.0] rotation: 0 - state: disabled + state: enabled - name: qtgui_time_sink_x_0 id: qtgui_time_sink_x parameters: @@ -742,7 +814,7 @@ blocks: bus_structure: null coordinate: [1248, 1060.0] rotation: 0 - state: disabled + state: enabled - name: uhd_usrp_sink_0 id: uhd_usrp_sink parameters: @@ -1487,17 +1559,21 @@ connections: - [digital_constellation_modulator_0, '0', virtual_sink_0, '0'] - [digital_corr_est_cc_0, '0', fadingui_phasecorrection_0, '0'] - [digital_corr_est_cc_0, '1', blocks_complex_to_mag_0, '0'] +- [digital_lms_dd_equalizer_cc_0, '0', blocks_file_sink_2, '0'] - [digital_lms_dd_equalizer_cc_0, '0', digital_corr_est_cc_0, '0'] - [digital_lms_dd_equalizer_cc_0, '0', fadingui_netsink_1, '0'] - [digital_lms_dd_equalizer_cc_0, '0', qtgui_const_sink_x_0_0, '1'] +- [digital_pfb_clock_sync_xxx_0, '0', blocks_file_sink_1, '0'] - [digital_pfb_clock_sync_xxx_0, '0', digital_cma_equalizer_cc_0, '0'] - [digital_pfb_clock_sync_xxx_0, '0', digital_lms_dd_equalizer_cc_0, '0'] - [digital_pfb_clock_sync_xxx_0, '0', fadingui_netsink_4, '0'] - [digital_pfb_clock_sync_xxx_0, '0', qtgui_const_sink_x_0_0, '0'] - [fadingui_datasource_0, '0', digital_constellation_modulator_0, '0'] +- [fadingui_phasecorrection_0, '0', blocks_file_sink_3, '0'] - [fadingui_phasecorrection_0, '0', fadingui_netsink_3, '0'] - [fadingui_phasecorrection_0, '0', qtgui_const_sink_x_0_0, '2'] - [fadingui_phasecorrection_0, '0', virtual_sink_2, '0'] +- [uhd_usrp_source_0, '0', blocks_file_sink_0, '0'] - [uhd_usrp_source_0, '0', fadingui_netsink_4_0, '0'] - [uhd_usrp_source_0, '0', virtual_sink_1, '0'] - [virtual_source_0, '0', digital_constellation_decoder_cb_0, '0'] diff --git a/flowgraphs/qpsk_hw.py b/flowgraphs/qpsk_hw.py index c13a26d..0e46532 100755 --- a/flowgraphs/qpsk_hw.py +++ b/flowgraphs/qpsk_hw.py @@ -9,11 +9,26 @@ # 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 +from gnuradio.filter import firdes +import sip from gnuradio import blocks import numpy from gnuradio import digital from gnuradio import gr -from gnuradio.filter import firdes import sys import signal from argparse import ArgumentParser @@ -24,11 +39,40 @@ import time import fadingui import numpy as np +from gnuradio import qtgui -class qpsk_hw(gr.top_block): +class qpsk_hw(gr.top_block, Qt.QWidget): def __init__(self): gr.top_block.__init__(self, "QPSK Hardware") + Qt.QWidget.__init__(self) + self.setWindowTitle("QPSK Hardware") + 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_hw") + + 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 @@ -76,6 +120,93 @@ class qpsk_hw(gr.top_block): self.uhd_usrp_sink_0.set_antenna('TX/RX', 0) self.uhd_usrp_sink_0.set_samp_rate(samp_rate) self.uhd_usrp_sink_0.set_time_unknown_pps(uhd.time_spec()) + self.qtgui_time_sink_x_0 = qtgui.time_sink_f( + 1024, #size + samp_rate / sps, #samp_rate + "", #name + 1 #number of inputs + ) + self.qtgui_time_sink_x_0.set_update_time(0.10) + self.qtgui_time_sink_x_0.set_y_axis(0, 10) + + self.qtgui_time_sink_x_0.set_y_label('Amplitude', "") + + self.qtgui_time_sink_x_0.enable_tags(True) + self.qtgui_time_sink_x_0.set_trigger_mode(qtgui.TRIG_MODE_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) + self.qtgui_time_sink_x_0.enable_stem_plot(False) + + + labels = ['Signal 1', 'Signal 2', 'Signal 3', 'Signal 4', 'Signal 5', + 'Signal 6', 'Signal 7', 'Signal 8', 'Signal 9', 'Signal 10'] + widths = [1, 1, 1, 1, 1, + 1, 1, 1, 1, 1] + colors = ['blue', 'red', 'green', 'black', 'cyan', + 'magenta', 'yellow', 'dark red', 'dark green', 'dark blue'] + alphas = [1.0, 1.0, 1.0, 1.0, 1.0, + 1.0, 1.0, 1.0, 1.0, 1.0] + styles = [1, 1, 1, 1, 1, + 1, 1, 1, 1, 1] + markers = [-1, -1, -1, -1, -1, + -1, -1, -1, -1, -1] + + + for i in range(1): + if len(labels[i]) == 0: + self.qtgui_time_sink_x_0.set_line_label(i, "Data {0}".format(i)) + else: + self.qtgui_time_sink_x_0.set_line_label(i, labels[i]) + self.qtgui_time_sink_x_0.set_line_width(i, widths[i]) + self.qtgui_time_sink_x_0.set_line_color(i, colors[i]) + self.qtgui_time_sink_x_0.set_line_style(i, styles[i]) + self.qtgui_time_sink_x_0.set_line_marker(i, markers[i]) + self.qtgui_time_sink_x_0.set_line_alpha(i, alphas[i]) + + self._qtgui_time_sink_x_0_win = sip.wrapinstance(self.qtgui_time_sink_x_0.pyqwidget(), Qt.QWidget) + self.top_grid_layout.addWidget(self._qtgui_time_sink_x_0_win) + self.qtgui_const_sink_x_0_0 = qtgui.const_sink_c( + 1024, #size + "", #name + 3 #number of inputs + ) + self.qtgui_const_sink_x_0_0.set_update_time(0.10) + self.qtgui_const_sink_x_0_0.set_y_axis(-2, 2) + self.qtgui_const_sink_x_0_0.set_x_axis(-2, 2) + self.qtgui_const_sink_x_0_0.set_trigger_mode(qtgui.TRIG_MODE_FREE, qtgui.TRIG_SLOPE_POS, 0.0, 0, "") + self.qtgui_const_sink_x_0_0.enable_autoscale(False) + self.qtgui_const_sink_x_0_0.enable_grid(False) + self.qtgui_const_sink_x_0_0.enable_axis_labels(True) + + + labels = ['', '', '', '', '', + '', '', '', '', ''] + widths = [1, 1, 1, 1, 1, + 1, 1, 1, 1, 1] + colors = ["blue", "red", "dark green", "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(3): + if len(labels[i]) == 0: + self.qtgui_const_sink_x_0_0.set_line_label(i, "Data {0}".format(i)) + else: + self.qtgui_const_sink_x_0_0.set_line_label(i, labels[i]) + self.qtgui_const_sink_x_0_0.set_line_width(i, widths[i]) + self.qtgui_const_sink_x_0_0.set_line_color(i, colors[i]) + self.qtgui_const_sink_x_0_0.set_line_style(i, styles[i]) + self.qtgui_const_sink_x_0_0.set_line_marker(i, markers[i]) + self.qtgui_const_sink_x_0_0.set_line_alpha(i, alphas[i]) + + self._qtgui_const_sink_x_0_0_win = sip.wrapinstance(self.qtgui_const_sink_x_0_0.pyqwidget(), Qt.QWidget) + self.top_grid_layout.addWidget(self._qtgui_const_sink_x_0_0_win) self.fadingui_phasecorrection_0 = fadingui.phasecorrection(frame_len) self.fadingui_netsink_4_0 = fadingui.netsink(address='udp://localhost:31416', dtype="complex", vlen=1) self.fadingui_netsink_4 = fadingui.netsink(address='udp://localhost:31417', dtype="complex", vlen=1) @@ -84,7 +215,7 @@ class qpsk_hw(gr.top_block): self.fadingui_ber_0 = fadingui.ber(vgl=testvec + list(np.zeros(4)), vlen=frame_len,address='udp://localhost:31420') self.digital_pfb_clock_sync_xxx_0 = digital.pfb_clock_sync_ccf(sps, 2 * np.pi / 100, rrc_taps, 32, 16, 1.5, 1) self.digital_lms_dd_equalizer_cc_0 = digital.lms_dd_equalizer_cc(15, 3e-3, 1, qpsk_const) - self.digital_corr_est_cc_0 = digital.corr_est_cc(access_code_symbols, 1, len(access_code_symbols) // 2, 0.7, digital.THRESHOLD_ABSOLUTE) + self.digital_corr_est_cc_0 = digital.corr_est_cc(access_code_symbols, 1, len(access_code_symbols) // 2, 0.65, digital.THRESHOLD_ABSOLUTE) self.digital_constellation_modulator_0 = digital.generic_mod( constellation=qpsk_const, differential=False, @@ -99,6 +230,15 @@ class qpsk_hw(gr.top_block): 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/locked_qpsk_hw.dat', False) + self.blocks_file_sink_3.set_unbuffered(False) + self.blocks_file_sink_2 = blocks.file_sink(gr.sizeof_gr_complex*1, 'data/equalized_qpsk_hw.dat', False) + self.blocks_file_sink_2.set_unbuffered(False) + self.blocks_file_sink_1 = blocks.file_sink(gr.sizeof_gr_complex*1, 'data/synchronized_qpsk_hw.dat', False) + self.blocks_file_sink_1.set_unbuffered(False) + self.blocks_file_sink_0 = blocks.file_sink(gr.sizeof_gr_complex*1, 'data/channel_qpsk_hw.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) @@ -107,6 +247,7 @@ class qpsk_hw(gr.top_block): # Connections ################################################## self.connect((self.analog_random_source_x_0, 0), (self.blocks_stream_mux_0, 1)) + self.connect((self.blocks_complex_to_mag_0, 0), (self.qtgui_time_sink_x_0, 0)) self.connect((self.blocks_repack_bits_bb_0, 0), (self.blocks_stream_to_vector_0, 0)) 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)) @@ -114,17 +255,30 @@ class qpsk_hw(gr.top_block): self.connect((self.blocks_vector_source_x_0, 0), (self.blocks_stream_mux_0, 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.uhd_usrp_sink_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_lms_dd_equalizer_cc_0, 0), (self.blocks_file_sink_2, 0)) self.connect((self.digital_lms_dd_equalizer_cc_0, 0), (self.digital_corr_est_cc_0, 0)) self.connect((self.digital_lms_dd_equalizer_cc_0, 0), (self.fadingui_netsink_1, 0)) + self.connect((self.digital_lms_dd_equalizer_cc_0, 0), (self.qtgui_const_sink_x_0_0, 1)) + self.connect((self.digital_pfb_clock_sync_xxx_0, 0), (self.blocks_file_sink_1, 0)) self.connect((self.digital_pfb_clock_sync_xxx_0, 0), (self.digital_lms_dd_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_0_0, 0)) + self.connect((self.fadingui_phasecorrection_0, 0), (self.blocks_file_sink_3, 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_0_0, 2)) + self.connect((self.uhd_usrp_source_0, 0), (self.blocks_file_sink_0, 0)) self.connect((self.uhd_usrp_source_0, 0), (self.digital_pfb_clock_sync_xxx_0, 0)) self.connect((self.uhd_usrp_source_0, 0), (self.fadingui_netsink_4_0, 0)) + def closeEvent(self, event): + self.settings = Qt.QSettings("GNU Radio", "qpsk_hw") + self.settings.setValue("geometry", self.saveGeometry()) + event.accept() + def get_testvec(self): return self.testvec @@ -139,6 +293,7 @@ class qpsk_hw(gr.top_block): 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), self.excess_bw, 45*self.nfilts)) + self.qtgui_time_sink_x_0.set_samp_rate(self.samp_rate / self.sps) def get_nfilts(self): return self.nfilts @@ -159,6 +314,7 @@ class qpsk_hw(gr.top_block): def set_samp_rate(self, samp_rate): self.samp_rate = samp_rate + self.qtgui_time_sink_x_0.set_samp_rate(self.samp_rate / self.sps) self.uhd_usrp_sink_0.set_samp_rate(self.samp_rate) self.uhd_usrp_source_0.set_samp_rate(self.samp_rate) @@ -195,21 +351,34 @@ class qpsk_hw(gr.top_block): def main(top_block_cls=qpsk_hw, 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() diff --git a/flowgraphs/qpsk_sim.grc b/flowgraphs/qpsk_sim.grc index 5bdbb47..fe07f14 100644 --- a/flowgraphs/qpsk_sim.grc +++ b/flowgraphs/qpsk_sim.grc @@ -247,7 +247,7 @@ blocks: alias: '' append: 'False' comment: '' - file: data/qpsk_channel.dat + file: data/channel_qpsk.dat type: complex unbuffered: 'False' vlen: '1' @@ -265,7 +265,7 @@ blocks: alias: '' append: 'False' comment: '' - file: data/qpsk_locked.dat + file: data/locked_qpsk.dat type: complex unbuffered: 'False' vlen: '1' @@ -283,7 +283,7 @@ blocks: alias: '' append: 'False' comment: '' - file: data/qpsk_sync.dat + file: data/synchronized_qpsk.dat type: complex unbuffered: 'False' vlen: '1' @@ -301,7 +301,7 @@ blocks: alias: '' append: 'False' comment: '' - file: data/qpsk_equalized.dat + file: data/equalized_qpsk.dat type: complex unbuffered: 'False' vlen: '1' @@ -507,7 +507,7 @@ blocks: bus_structure: null coordinate: [592, 572.0] rotation: 0 - state: enabled + state: disabled - name: digital_cma_equalizer_cc_0 id: digital_cma_equalizer_cc parameters: @@ -645,10 +645,10 @@ blocks: parameters: affinity: '' alias: '' - amplitudes: '[0.2]' + amplitudes: '[0.2, 0.08, 0.5, 0.4]' comment: '' - delays: '[sps]' - los: 'True' + delays: '[0.25, 3.25, 4, 6.3]' + los: 'False' maxoutbuf: '0' minoutbuf: '0' states: @@ -657,7 +657,7 @@ blocks: bus_structure: null coordinate: [648, 740.0] rotation: 0 - state: disabled + state: enabled - name: fadingui_netsink_0 id: fadingui_netsink parameters: @@ -671,7 +671,7 @@ blocks: bus_sink: false bus_source: false bus_structure: null - coordinate: [992, 620.0] + coordinate: [992, 628.0] rotation: 0 state: enabled - name: fadingui_netsink_0_0 diff --git a/flowgraphs/qpsk_sim.py b/flowgraphs/qpsk_sim.py index 3c2b288..09a0741 100755 --- a/flowgraphs/qpsk_sim.py +++ b/flowgraphs/qpsk_sim.py @@ -136,6 +136,7 @@ class qpsk_sim(gr.top_block, Qt.QWidget): self.fadingui_netsink_1 = fadingui.netsink(address='udp://localhost:31418', dtype="complex", vlen=1) self.fadingui_netsink_0_0 = fadingui.netsink(address='udp://localhost:31415', dtype="float", vlen=1) self.fadingui_netsink_0 = fadingui.netsink(address='udp://localhost:31416', dtype="complex", vlen=1) + self.fadingui_multipath_fading_0 = fadingui.multipath_fading(amplitudes=[0.2, 0.08, 0.5, 0.4], delays=[0.25, 3.25, 4, 6.3], los =False) self.fadingui_ber_0 = fadingui.ber(vgl=list(np.zeros(frame_len)), vlen=frame_len,address='udp://localhost:31420') self.digital_pfb_clock_sync_xxx_0 = digital.pfb_clock_sync_ccf(sps, 2 * np.pi / 100, rrc_taps, 32, 16, 1.5, 1) self.digital_corr_est_cc_0 = digital.corr_est_cc(access_code_symbols, 1, len(access_code_symbols) // 2, 0.9, digital.THRESHOLD_ABSOLUTE) @@ -149,20 +150,19 @@ class qpsk_sim(gr.top_block, Qt.QWidget): 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, 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 = blocks.file_sink(gr.sizeof_gr_complex*1, 'data/equalized_qpsk.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 = blocks.file_sink(gr.sizeof_gr_complex*1, 'data/synchronized_qpsk.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 = blocks.file_sink(gr.sizeof_gr_complex*1, 'data/locked_qpsk.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 = blocks.file_sink(gr.sizeof_gr_complex*1, 'data/channel_qpsk.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) @@ -178,11 +178,8 @@ class qpsk_sim(gr.top_block, Qt.QWidget): 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_selective_fading_model_0, 0)) + self.connect((self.blocks_throttle_0, 0), (self.fadingui_multipath_fading_0, 0)) self.connect((self.blocks_vector_source_x_0, 0), (self.blocks_stream_mux_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)) @@ -194,6 +191,9 @@ class qpsk_sim(gr.top_block, Qt.QWidget): 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_multipath_fading_0, 0), (self.blocks_file_sink_0, 0)) + self.connect((self.fadingui_multipath_fading_0, 0), (self.digital_pfb_clock_sync_xxx_0, 0)) + self.connect((self.fadingui_multipath_fading_0, 0), (self.fadingui_netsink_0, 0)) 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)) @@ -240,7 +240,6 @@ class qpsk_sim(gr.top_block, Qt.QWidget): 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(5/self.samp_rate) def get_rrc_taps(self): return self.rrc_taps |