aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--doc/thesis/Fading.bib23
-rw-r--r--doc/thesis/Makefile4
-rw-r--r--doc/thesis/chapters/implementation.tex31
-rw-r--r--doc/thesis/figures/data/flowgraphs/channel_qpsk_hw_lab.datbin0 -> 13992888 bytes
-rw-r--r--doc/thesis/figures/data/flowgraphs/equalized_qpsk_hw_lab.datbin0 -> 3497888 bytes
-rw-r--r--doc/thesis/figures/data/flowgraphs/locked_qpsk_hw_lab.datbin0 -> 3497832 bytes
-rw-r--r--doc/thesis/figures/data/flowgraphs/synchronized_qpsk_hw_lab.datbin0 -> 3497888 bytes
-rw-r--r--doc/thesis/figures/data/qpsk_hw_lab.py31
-rw-r--r--doc/thesis/figures/data/qpsk_sim_dynamic_grblock_los_etsi_doppler5_k5.py6
-rw-r--r--doc/thesis/figures/data/qpsk_sim_dynamic_grblock_los_etsi_doppler70_k5.py4
-rw-r--r--doc/thesis/figures/data/qpsk_sim_dynamic_grblock_nlos_etsi_doppler5.py4
-rw-r--r--doc/thesis/figures/tikz/qpsk-simulations-dynamic.tex72
-rw-r--r--doc/thesis/figures/tikz/qpsk-simulations-static.tex35
-rw-r--r--flowgraphs/qpsk_hw.grc92
-rwxr-xr-xflowgraphs/qpsk_hw.py187
-rw-r--r--flowgraphs/qpsk_sim.grc20
-rwxr-xr-xflowgraphs/qpsk_sim.py19
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
new file mode 100644
index 0000000..80b01ca
--- /dev/null
+++ b/doc/thesis/figures/data/flowgraphs/channel_qpsk_hw_lab.dat
Binary files differ
diff --git a/doc/thesis/figures/data/flowgraphs/equalized_qpsk_hw_lab.dat b/doc/thesis/figures/data/flowgraphs/equalized_qpsk_hw_lab.dat
new file mode 100644
index 0000000..13dbddf
--- /dev/null
+++ b/doc/thesis/figures/data/flowgraphs/equalized_qpsk_hw_lab.dat
Binary files differ
diff --git a/doc/thesis/figures/data/flowgraphs/locked_qpsk_hw_lab.dat b/doc/thesis/figures/data/flowgraphs/locked_qpsk_hw_lab.dat
new file mode 100644
index 0000000..a2581ce
--- /dev/null
+++ b/doc/thesis/figures/data/flowgraphs/locked_qpsk_hw_lab.dat
Binary files differ
diff --git a/doc/thesis/figures/data/flowgraphs/synchronized_qpsk_hw_lab.dat b/doc/thesis/figures/data/flowgraphs/synchronized_qpsk_hw_lab.dat
new file mode 100644
index 0000000..5ce1df2
--- /dev/null
+++ b/doc/thesis/figures/data/flowgraphs/synchronized_qpsk_hw_lab.dat
Binary files differ
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