aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--notebooks/FIR_mehrere_V2.ipynb445
-rw-r--r--notebooks/FrameSynchronization.ipynb221
-rw-r--r--notebooks/Test/FIRDelay.ipynb (renamed from notebooks/FIRDelay.ipynb)0
-rw-r--r--notebooks/Test/FIR_mehrere.ipynb (renamed from notebooks/FIR_mehrere.ipynb)22
-rw-r--r--notebooks/Test/Untitled.ipynb (renamed from notebooks/Untitled.ipynb)0
-rw-r--r--notebooks/Untitled1.ipynb33
-rw-r--r--notebooks/Untitled2.ipynb182
-rw-r--r--simulation/QAM_Fading/qam_fading_V2_eigerner_block.grc5
-rwxr-xr-xsimulation/QAM_Fading/qam_fading_block.py2
-rw-r--r--src/gr-fadingui/grc/fadingui_multipath_fading.block.yml13
-rw-r--r--src/gr-fadingui/python/multipath_fading.py67
-rwxr-xr-xsrc/gui/gui.py (renamed from src/gui.py)0
-rw-r--r--src/gui/net.py (renamed from src/net.py)0
-rw-r--r--tests/correlator/acgen.datbin5120 -> 0 bytes
-rw-r--r--tests/correlator/acgen.grc188
-rwxr-xr-xtests/correlator/acgen.py120
-rwxr-xr-xtests/correlator/acproc.py57
-rw-r--r--tests/correlator/correlator.grc1475
-rwxr-xr-xtests/correlator/correlator.py445
19 files changed, 2509 insertions, 766 deletions
diff --git a/notebooks/FIR_mehrere_V2.ipynb b/notebooks/FIR_mehrere_V2.ipynb
new file mode 100644
index 0000000..6d07670
--- /dev/null
+++ b/notebooks/FIR_mehrere_V2.ipynb
@@ -0,0 +1,445 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "id": "d828ae1c",
+ "metadata": {},
+ "source": [
+ "# FIR Filter Parameters"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "id": "9aed9f51",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import numpy as np \n",
+ "from numpy.fft import fft,ifft,fftshift\n",
+ "import matplotlib.pyplot as plt\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "id": "9a16a6d2",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Anfangs werte noch variabel machen \n",
+ "delays = [3,5,2]\n",
+ "ampl = [0.2,0.5,0.8]"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "5ad0edf9",
+ "metadata": {},
+ "source": [
+ "# Dealy Window\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "id": "bf92d73a",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ "<Figure size 432x288 with 1 Axes>"
+ ]
+ },
+ "metadata": {
+ "needs_background": "light"
+ },
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "d =0\n",
+ "k = np.linspace(-5,10,1000)\n",
+ "h_ideal = np.sinc(k-d)\n",
+ "plt.plot(k,h_ideal)\n",
+ "plt.show()\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "id": "dd93e444",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ "<Figure size 432x288 with 1 Axes>"
+ ]
+ },
+ "metadata": {
+ "needs_background": "light"
+ },
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "n = 4.5\n",
+ "window_sample= np.arange(np.round(d-(n-1)/2),np.round(d+(n+1)/2))\n",
+ "window = []\n",
+ "for ws in window_sample: \n",
+ " idx = (np.abs(k-ws)).argmin()\n",
+ " window.append(idx)\n",
+ " \n",
+ "plt.plot(k,h_ideal)\n",
+ "plt.plot(window_sample,h_ideal[window],\"-*\")\n",
+ "plt.show()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "12b0c2d2",
+ "metadata": {},
+ "source": [
+ "# FIR"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "id": "efc93b69",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "delay = 3\n",
+ "amplitude = 1\n",
+ "\n",
+ "d_int = int(np.floor(delay))\n",
+ "#d_frac = delay - d_int\n",
+ "\n",
+ "h_int = np.concatenate([np.zeros(d_int-1), [amplitude], np.zeros(3)])"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "id": "43372541",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "#H_int = fft(h_int)\n",
+ "#h = ifft(H_int)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "id": "a32cb580",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "<StemContainer object of 3 artists>"
+ ]
+ },
+ "execution_count": 7,
+ "metadata": {},
+ "output_type": "execute_result"
+ },
+ {
+ "data": {
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAAAW4AAAD4CAYAAADM6gxlAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAAARe0lEQVR4nO3df2xd5X3H8c8XJwwHkpkNb6sNLGGqLA2Y5soaY66qqt3mbZ2GV20rVJk6+kcQ2g86TWEJqgR/jBHNXdX9sVXNoFUraAoimYsWtrRS2jKmNq2DIwxE3sqPBmwKZsgUJndJ7O/+8LVjgn+cc33P4/M95/36J77H5/HzPOc59+Obc67v19xdAIA4LtjoAQAA8iG4ASAYghsAgiG4ASAYghsAgtlUxA+97LLLfPv27UX8aACopOPHj7/m7p1Z9i0kuLdv366RkZEifjQAVJKZ/SDrvlwqAYBgCG4ACIbgBoBgCG4ACIbgBoBgCnlXSZUMj05o6Mi4Jqdn1NXRrt0DPRrs7Q7XRyop5vLJ4TEdOPaiZt3VZqabrrtCfzN4bUv7SNVPij6qdH5hHsG9iuHRCe09NKaZM7OSpInpGe09NCZJLTvxU/SRSoq5fHJ4TPd/59Ti41n3xcetDLwU/aToo0rnF87hUskqho6ML57wC2bOzGroyHioPlJJMZcDx17Mtb3M/aToo0rnF84huFcxOT2Ta3tZ+0glxVxmV/j8+JW2l7mfFH1U6fzCOQT3Kro62nNtL2sfqaSYS5tZru1l7idFH1U6v3AOwb2K3QM9at/c9rZt7ZvbtHugJ1QfqaSYy03XXZFre5n7SdFHlc4vnMPNyVUs3Ly5/eEndXp2Tt0F3JFf+FlDBx/T5Nmt6urYEvauf4rjtXDT7svfeUFzMrXZBYW8EyNFPyn6qNL5hXOsiJqTfX19XqUPmfrI574tSXrwluuL6+QLH5r/9+bDxfWRSIrj9fTfvleSdPUdjxfWR6p+ksylQudXVZnZcXfvy7Ivl0oAIBiCGwCCIbgBIBiCGwCCIbgBIBiCGwCCIbgBIBiCGwCCIbgBIBiCGwCCIbgBIBiCGwCCIbgBIBiCGwCCyRTcZvaXZva0mT1lZgfM7KKiBwYAWN6awW1m3ZL+QlKfu18jqU3SjUUPDACwvKyXSjZJajezTZK2SJosbkgAgNWsGdzuPiHpU5JOSXpZ0hvu/rXz9zOzXWY2YmYjU1NTrR8pAEBStksll0q6QdIOSV2SLjaznefv5+773b3P3fs6OztbP1IAgKRsl0p+XdLz7j7l7mckHZL0a8UOCwCwkizBfUrSr5rZFjMzSR+UdLLYYQEAVpLlGvcxSQ9LekLSWKPN/oLHBQBYwaYsO7n7nZLuLHgsAIAM+MtJAAiG4AaAYAhuAAiG4AaAYAhuAAiG4AaAYAhuAAiG4AaAYAhuAAiG4AaAYAhuAAiG4AaAYAhuAAgm06cDohqGRyc0dGRck9Mz6upo1+6BHg32drds/4U2o6emdXp2Tv37jmZuk7cfoM4I7poYHp3Q3kNjmjkzK0mamJ7R3kNjkrRsSObdf2mb07Nzudvk6QeoOy6V1MTQkfHFcFwwc2ZWQ0fGW7J/yjZA3RHcNTE5PVPo9pRtgLojuGuiq6O90O0p2wB1R3DXxO6BHrVvbnvbtvbNbdo90NOS/VO2AeqOm5M1sXCj7/aHn9Tp2Tl1r/Hujbz7L21z90Pf0mu+TV0dWzK3GTr4mCbPbs3UBqg7grtGBnu7deC7pyRJD95yfcv3X2jz7n/7J0nS1Xsez9xm8MT98w9uPpypDVBnXCoBgGAIbgAIhuAGgGAIbgAIhuAGgGAIbgAIhuAGgGAIbgAIhuAGgGAIbgAIhuAGgGAIbgAIhuAGgGAIbgAIJtPHuppZh6R7JV0jySV93N2/XeC4sIYUldGbqdiO4qVa+6L7QPOyfh73P0j6d3f/AzO7UNKWAseENaSojN5MxXYUL+XaF9kH1mfNSyVmtk3S+yTdJ0nuftrdpwseF1aRojI61dfLibWHlO0a91WSpiR9wcxGzexeM7v4/J3MbJeZjZjZyNTUVMsHinNSVEan+no5sfaQsgX3JknvkfRZd++V9L+S9py/k7vvd/c+d+/r7Oxs8TCxVIrK6FRfLyfWHlK24H5J0kvufqzx+GHNBzk2SIrK6FRfLyfWHlKGm5Pu/kMze9HMetx9XNIHJT1T/NCwkmYqsDfbR56K7SheyrUfOviYJs9uZe1LKOu7Sv5c0gONd5Q8J+nm4oaELJqpwN5MH3krtqN4qdZ+8MT98w9uPlxIH2hepuB29xOS+oodCgAgC/5yEgCCIbgBIBiCGwCCIbgBIBiCGwCCIbgBIBiCGwCCIbgBIBiCGwCCIbgBIBiCGwCCIbgBIBiCGwCCyfqxrqXTTBXqZtvkrXROhex8hkcnNPTszvnPfi6omnyVKqM3c06mUKVjXHYhg7uZKtTraZOn0jkVsvNZPF5nt0mKW7U81bo3c06mUKVjHEHISyXNVKEuc5s6q0rV8lTrXtbzq0rHOIKQwd1MFeoyt6mzqlQtT7XuZT2/qnSMIwgZ3M1UoS5zmzqrStXyVOte1vOrSsc4gpDB3UwV6jK3qbOqVC1Pte5lPb+qdIwjCHlzsplK1+tpk6fSORWy80lRTT7FmqSovr60nyKP13rGRfX5NEIGt9Rcpetm2+StdE6F7HxSVJNPsSYpqq8v9FP08WoG1efTCXmpBADqjOAGgGAIbgAIhuAGgGAIbgAIhuAGgGAIbgAIhuAGgGAIbgAIhuAGgGAIbgAIhuAGgGAIbgAIhuAGgGAyB7eZtZnZqJn9a5EDAoowPDqh/md3asf4rerfd1TDoxOF9DF6alrHnn+9sD4AKd/ncd8m6aSkbQWNBShEykryZau+jmrK9IrbzC6X9CFJ9xY7HKD1qECOqsl6qeQzkm6XNLfSDma2y8xGzGxkamqqFWMDWoIK5KiaNYPbzH5X0qvufny1/dx9v7v3uXtfZ2dnywYIrBcVyFE1WV5x90v6PTN7QdJXJH3AzO4vdFRAC1GBHFWzZnC7+153v9zdt0u6UdJRd99Z+MiAFhns7dY9H75WnfaGTK7ujnbd8+FrW16BvOg+gAVhq7wDeaSqJF/G6uuonlzB7e7flPTNQkYCAMiEv5wEgGAIbgAIhuAGgGAIbgAIhuAGgGAIbgAIhuAGgGAIbgAIhuAGgGAIbgAIhuAGgGAIbgAIhuAGgGAI7hJIUYF8oR+qkAPx8XncGyxFBfKl/VCFHIiPV9wbLFV1cKqQA9VBcG+wVNXBqUIOVAfBvcFSVQenCjlQHQT3BktVHZwq5EB1cHNygy3cGLz7oW/pNd+mro4t2j3Q0/Ibhqn6AVA8grsEUlUHpwo5UA1cKgGAYAhuAAiG4AaAYAhuAAiG4AaAYAhuAAiG4AaAYAhuAAiG4AaAYAhuAAiG4AaAYAhuAAiG4AaAYAhuAAhmzeA2syvM7BtmdtLMnjaz24oYyPDohPr3HdWOPYcLq0BOlXPU0fDohPqf3akd47dmPu+bbZPn+ZXiOV9VWT6P+6ykv3L3J8xsq6TjZvZ1d3+mVYNYrHTeKGZbRAVyqpyjjhafW2e3Scp23q+nTdbnV4rnfJWt+Yrb3V929ycaX78p6aSklh7ZFBXIqXKOOmrmvE/Rhufj+uS6xm1m2yX1Sjq2zPd2mdmImY1MTU3lGkSKCuRUOUcdNXPep2jD83F9Mge3mV0i6aCkT7j7j87/vrvvd/c+d+/r7OzMNYgUFcipco46aua8T9GG5+P6ZApuM9us+dB+wN0PtXoQKSqQU+UcddTMeZ+iDc/H9Vnz5qSZmaT7JJ10908XMYiFmxG3P/ykTs/OqbujveUVyKlyjjpq5rxP0WZh+9DBxzR5divPx5yyvKukX9IfSxozsxONbXe4+6OtHMhgb7cOfPeUJOnBW65v5Y9+Wx9UOUfdNHPep2gz2NutwRP3zz+4+XCmPjBvzeB298clWYKxAAAy4C8nASAYghsAgiG4ASAYghsAgiG4ASAYghsAgiG4ASAYghsAgiG4ASAYghsAgiG4ASAYghsAgiG4ASAYghsAgiG4ASAYghsAgiG4ASAYghsAgiG4ASAYghsAgiG4ASAYghsAgiG4ASAYghsAgiG4ASAYghsAgiG4ASAYghsAgiG4ASAYghsAgiG4ASAYghsAgiG4ASAYghsAgiG4ASCYTMFtZr9lZuNm9n0z21PEQIZHJzR6alrHnn9d/fuOanh0oqX7pzQ8OqH+Z3dqx/ithY2tzPMHymR4dEL9+45qx57DmbMlz/7NtlmPTWvtYGZtkv5R0m9IeknS98zsEXd/plWDGB6d0N5DYzo9OydJmpie0d5DY5Kkwd7ude+f0sLYZs5uk1TM2Mo8f6BMFp+PZ2YlZc+WrPs322a9zN1X38Hsekl3uftA4/FeSXL3e1Zq09fX5yMjI5kH0b/vqCamZ3TLk1/VVW+c+011oc/pF8/8zzv2f2bzT+u0vfM/Cyvtv9Tsj9+UJLVdtDXz+PK0eevHZzW3zDG9wEyXXLTy78k8faScf9HHi3FVcFybTRdf3ZetwQ/nA04/d23mPvK0GT01rf87O/uO7T+xqU29V3ase//z2zz3k9363C/dIEnq7mjXf+75wJpjXGBmx90904Fb8xW3pG5JLy55/JKk65bpdJekXZJ05ZVXZul70eT0zLLblwunZrYvleckbKbNcqG92vZm+kg5/6KPV7NtGFd5x3XBli3ZG+QJ7CbaLBfCrdy+2vdWyrVWyBLctsy2d6SQu++XtF+af8WdZxBdHe2amJ5Z/E21YKXfWB9vvEI/X97fcEXoTzC2Ms8fKJOPrvJc+cgyz5W8+6/WpqujvYkRZ5Pl5uRLkq5Y8vhySZOtHMTugR61b25727b2zW3aPdDTkv1TSjG2Ms8fKJMU2bIRz8csr7i/J+ndZrZD0oSkGyV9tJWDWLiAP3RkXJPTM+rqaNfugZ4VL+zn3T+lFGMr8/yBMkmRLRvxfFzz5qQkmdnvSPqMpDZJn3f3u1fbP+/NSQCou1bfnJS7Pyrp0XWNCgDQEvzlJAAEQ3ADQDAENwAEQ3ADQDCZ3lWS+4eaTUn6QZPNL5P0WguHE0md5y7Ve/7Mvb4W5v/z7t6ZpUEhwb0eZjaS9S0xVVPnuUv1nj9zr+fcpebmz6USAAiG4AaAYMoY3Ps3egAbqM5zl+o9f+ZeX7nnX7pr3ACA1ZXxFTcAYBUENwAEU5rgTlGQuMzM7AUzGzOzE2ZW6Y9WNLPPm9mrZvbUkm0/ZWZfN7P/bvx76UaOsUgrzP8uM5torP+JxidyVo6ZXWFm3zCzk2b2tJnd1the+fVfZe65174U17gbBYn/S0sKEku6qZUFicvOzF6Q1Ofulf9DBDN7n6S3JH3J3a9pbPs7Sa+7+77GL+5L3f2vN3KcRVlh/ndJesvdP7WRYyuamb1L0rvc/Qkz2yrpuKRBSX+iiq//KnP/I+Vc+7K84v4VSd939+fc/bSkr0i6YY02CMrdH5P0+nmbb5D0xcbXX9T8CV1JK8y/Ftz9ZXd/ovH1m5JOar6ubeXXf5W551aW4F6uIHHdyrm4pK+Z2fFG4eW6+Vl3f1maP8El/cwGj2cj/JmZPdm4lFK5SwXnM7PtknolHVPN1v+8uUs5174swZ2pIHHF9bv7eyT9tqQ/bfx3GvXxWUm/IOmXJb0s6e83dDQFM7NLJB2U9Al3/9FGjyelZeaee+3LEtyFFyQuO3efbPz7qqR/0fzlozp5pXENcOFa4KsbPJ6k3P0Vd5919zlJ/6wKr7+ZbdZ8cD3g7ocam2ux/svNvZm1L0twLxYkNrMLNV+Q+JENHlMyZnZx42aFzOxiSb8p6anVW1XOI5I+1vj6Y5K+uoFjSW4htBp+XxVdfzMzSfdJOunun17yrcqv/0pzb2btS/GuEil/QeIqMbOrNP8qW5qvA/rlKs/fzA5Ier/mP87yFUl3ShqW9JCkKyWdkvSH7l7JG3grzP/9mv+vskt6QdItC9d8q8TM3ivpPySNSZprbL5D89d6K73+q8z9JuVc+9IENwAgm7JcKgEAZERwA0AwBDcABENwA0AwBDcABENwA0AwBDcABPP/ZlwB5ZlaZfIAAAAASUVORK5CYII=\n",
+ "text/plain": [
+ "<Figure size 432x288 with 1 Axes>"
+ ]
+ },
+ "metadata": {
+ "needs_background": "light"
+ },
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "test = np.random.randint(0, 10, size = 20)# Signal\n",
+ "\n",
+ "y = np.convolve(test.real, h_int)#Faltung\n",
+ "\n",
+ "plt.stem(test, linefmt=\"C0-\")\n",
+ "plt.stem(y, linefmt='C1-')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "id": "39fb3489",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([2, 5, 5, 9, 0, 3, 6, 7, 7, 9, 5, 9, 4, 9, 5, 9, 6, 2, 2, 5])"
+ ]
+ },
+ "execution_count": 8,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "test"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "id": "7fd06347",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([0., 0., 1., 0., 0., 0.])"
+ ]
+ },
+ "execution_count": 9,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "h_int"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 10,
+ "id": "a9612999",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([0., 0., 2., 5., 5., 9., 0., 3., 6., 7., 7., 9., 5., 9., 4., 9., 5.,\n",
+ " 9., 6., 2., 2., 5., 0., 0., 0.])"
+ ]
+ },
+ "execution_count": 10,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "y"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "706a51b1",
+ "metadata": {},
+ "source": [
+ "# FIR mit Delay \n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 27,
+ "id": "79e18131",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Tap with amplitude=1, delay=5\n",
+ "Creating filter of order N=11.0\n",
+ "[ 1.00000000e+00 -3.89817183e-17 3.89817183e-17 -3.89817183e-17\n",
+ " 3.89817183e-17 1.00000000e+00 3.89817183e-17 -3.89817183e-17\n",
+ " 3.89817183e-17 -3.89817183e-17 3.89817183e-17 -3.89817183e-17]\n"
+ ]
+ },
+ {
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ "<Figure size 432x288 with 1 Axes>"
+ ]
+ },
+ "metadata": {
+ "needs_background": "light"
+ },
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "\n",
+ "delay = 5\n",
+ "ampl = 1\n",
+ "print(f\"Tap with amplitude={ampl}, delay={delay}\")\n",
+ "\n",
+ " \n",
+ "order = 2 * np.floor(delay) + 1 #N\n",
+ "print(f\"Creating filter of order N={order}\")\n",
+ "\n",
+ "\n",
+ "skip = np.floor(delay) - (order - 1) / 2 #M\n",
+ "assert skip >= 0\n",
+ "\n",
+ "samples = np.arange(0, order+1)\n",
+ "\n",
+ "\n",
+ "h = ampl*(np.sinc(samples-delay)) #sinc\n",
+ "\n",
+ "\n",
+ "h[0] = 1\n",
+ "\n",
+ "print(h)\n",
+ "\n",
+ "plt.stem(samples, h)\n",
+ "plt.show()\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 26,
+ "id": "c89c83ae",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ "<Figure size 432x288 with 1 Axes>"
+ ]
+ },
+ "metadata": {
+ "needs_background": "light"
+ },
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/plain": [
+ "[<matplotlib.lines.Line2D at 0x7f5b33445e50>]"
+ ]
+ },
+ "execution_count": 26,
+ "metadata": {},
+ "output_type": "execute_result"
+ },
+ {
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ "<Figure size 432x288 with 1 Axes>"
+ ]
+ },
+ "metadata": {
+ "needs_background": "light"
+ },
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "t = np.arange(200)\n",
+ "\n",
+ "signal = np.sin(2 * np.pi * t * 0.05)\n",
+ "\n",
+ "signal_shifted = np.convolve(h, signal, mode='full')\n",
+ "\n",
+ "plt.plot(t, signal)\n",
+ "plt.grid(True)\n",
+ "plt.show()\n",
+ "plt.plot(signal_shifted)\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "d51d8a62",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "\n",
+ "delay = [5,6.2]\n",
+ "ampl = [4,1]\n",
+ "print(f\"Tap with amplitude={ampl}, delay={delay}\")\n",
+ "\n",
+ "max_order = 2 * np.floor(np.max(delay)) + 1\n",
+ "max_samples = np.arange(0, max_order +1) \n",
+ "max_len = len(max_samples)\n",
+ "print(max_len)\n",
+ "\n",
+ "sum_x = np.zeros(int(max_len))\n",
+ "\n",
+ "for (a,d) in zip(ampl,delay):\n",
+ " \n",
+ " order = 2 * np.floor(d) + 1\n",
+ " \n",
+ " skip = np.floor(d) - (order - 1) / 2 #M sollte immer 0 sein \n",
+ " assert skip >= 0\n",
+ "\n",
+ " samples = np.arange(0, order+1 ) \n",
+ "\n",
+ " h = a*(np.sinc(samples-d)) #sinc\n",
+ " h_len = np.concatenate([h, np.zeros(max_len-len(h))])\n",
+ " print(h_len)\n",
+ " sum_x += h_len\n",
+ " \n",
+ "\n",
+ "sum_x[0] = 1\n",
+ "print(sum_x)\n",
+ "\n",
+ "\n",
+ "\n",
+ "plt.stem(max_samples, sum_x)\n",
+ "plt.show()\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "81b4ff57",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "delay = [5,6]\n",
+ "np.max(delay)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "330915ff",
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3 (ipykernel)",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.9.2"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/notebooks/FrameSynchronization.ipynb b/notebooks/FrameSynchronization.ipynb
index e0187b2..911ddd6 100644
--- a/notebooks/FrameSynchronization.ipynb
+++ b/notebooks/FrameSynchronization.ipynb
@@ -8,10 +8,7 @@
"outputs": [],
"source": [
"import numpy as np\n",
- "from numpy_ringbuffer import RingBuffer\n",
- "\n",
- "import matplotlib.pyplot as plt\n",
- "import matplotlib.image as mpimg"
+ "import matplotlib.pyplot as plt"
]
},
{
@@ -23,39 +20,143 @@
]
},
{
+ "cell_type": "markdown",
+ "id": "fc118de2-937b-4157-a5a1-9b7f152bf59b",
+ "metadata": {},
+ "source": [
+ "First we need to create the access code, a barker sequence which has a very good autocorrelation."
+ ]
+ },
+ {
"cell_type": "code",
- "execution_count": 27,
- "id": "025c6919",
- "metadata": {
- "scrolled": false
- },
+ "execution_count": 2,
+ "id": "20dcd173-2889-4e21-9746-3d0a0ab060e8",
+ "metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
- "Header (N=16): [1 0 1 1 1 1 1 0 1 1 1 0 1 1 1 1]\n",
- "Stream (N=80): [0 0 1 1 0 0 0 0 1 0 1 1 1 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 1 1 1 1 0 1 1 1\n",
- " 1 1 0 1 1 1 0 1 1 1 1 1 0 1 1 1 0 1 1 0 1 0 1 1 0 0 1 1 1 0 0 1 1 1 1 1 0\n",
- " 0 1 1 1 0 1]\n",
- "Correlation peak value: 16 at i=47\n"
+ "Access code: 13 bit pattern [1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 0, 1] = left padded bytes [31, 53]\n"
]
- },
+ }
+ ],
+ "source": [
+ "ac = [ 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 0, 1, ]\n",
+ "\n",
+ "ac_pad = [0] * int(8 * np.ceil(len(ac) / 8) - len(ac)) + ac\n",
+ "ac_bytes = list(np.packbits(ac_pad))\n",
+ "\n",
+ "print(f\"Access code: {len(ac)} bit pattern {ac} = left padded bytes {ac_bytes}\")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "5cfd3c9a-d697-4462-bc26-26e82d25cbfd",
+ "metadata": {},
+ "source": [
+ "To correlate with the access code we need its symbols, thus the functions to modulate the access code."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "id": "515891a9-dbd2-4088-9a41-b792d878f0fc",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def modulate_qpsk(m):\n",
+ " ampl = np.sqrt(2)\n",
+ " sym = {\n",
+ " 0: ampl * (-1 -1j),\n",
+ " 1: ampl * ( 1 -1j),\n",
+ " 2: ampl * (-1 +1j),\n",
+ " 3: ampl * ( 1 +1j)\n",
+ " }\n",
+ "\n",
+ " return map(lambda k: sym[k], m)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "d328e765-e977-4de9-9694-35012193a0aa",
+ "metadata": {},
+ "source": [
+ "### Symbols for QPSK"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "id": "3a4c834f-7012-4e22-b9f3-865527d09c02",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Modulate chunks [0, 1, 3, 3, 0, 3, 1, 1] with QPSK into 8 symbols:\n",
+ "[(-1.4142135623730951-1.4142135623730951j), (1.4142135623730951-1.4142135623730951j), (1.4142135623730951+1.4142135623730951j), (1.4142135623730951+1.4142135623730951j), (-1.4142135623730951-1.4142135623730951j), (1.4142135623730951+1.4142135623730951j), (1.4142135623730951-1.4142135623730951j), (1.4142135623730951-1.4142135623730951j)]\n",
+ "\n",
+ "Reversed complex conjugate list for FIR filter:\n",
+ "[(1.4142135623730951+1.4142135623730951j), (1.4142135623730951+1.4142135623730951j), (1.4142135623730951-1.4142135623730951j), (-1.4142135623730951+1.4142135623730951j), (1.4142135623730951-1.4142135623730951j), (1.4142135623730951-1.4142135623730951j), (1.4142135623730951+1.4142135623730951j), (-1.4142135623730951+1.4142135623730951j)]\n"
+ ]
+ }
+ ],
+ "source": [
+ "# convert into chunks of 2 bits for QPSK\n",
+ "chunks = list(np.matmul(np.array(ac_pad).reshape((-1,2)), np.array([2, 1])))\n",
+ "syms = list(modulate_qpsk(chunks))\n",
+ "print(f\"Modulate chunks {chunks} with QPSK into {len(syms)} symbols:\\n{syms}\\n\")\n",
+ "\n",
+ "fir_syms = list(np.conj(syms[::-1]))\n",
+ "print(f\"Reversed complex conjugate list for FIR filter:\\n{fir_syms}\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "id": "d6155b2e-9405-4d20-8c05-72af45575a04",
+ "metadata": {},
+ "outputs": [
{
"data": {
+ "image/png": "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\n",
"text/plain": [
- "<StemContainer object of 3 artists>"
+ "<Figure size 1440x288 with 2 Axes>"
]
},
- "execution_count": 27,
- "metadata": {},
- "output_type": "execute_result"
- },
+ "metadata": {
+ "needs_background": "light"
+ },
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "fig, (left, right) = plt.subplots(1, 2, figsize = (20, 4))\n",
+ "\n",
+ "left.plot(np.real(syms), \".-\")\n",
+ "left.plot(np.imag(syms), \".-\")\n",
+ "left.set_title(\"Access Code\")\n",
+ "\n",
+ "right.plot(np.real(fir_syms), \".-\")\n",
+ "right.plot(np.imag(fir_syms), \".-\")\n",
+ "right.set_title(\"FIR Filter\")\n",
+ "\n",
+ "plt.show()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "id": "8163c2e0-0652-43c5-ad32-eaf0e94a638e",
+ "metadata": {},
+ "outputs": [
{
"data": {
- "image/png": "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\n",
+ "image/png": "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\n",
"text/plain": [
- "<Figure size 1800x360 with 1 Axes>"
+ "<Figure size 1440x288 with 2 Axes>"
]
},
"metadata": {
@@ -65,47 +166,57 @@
}
],
"source": [
- "# Create test data\n",
- "seq = np.unpackbits(np.array([0xbe, 0xef], dtype=np.dtype(\"uint8\")))\n",
- "stream = np.concatenate([\n",
- " np.random.randint(low=0, high=2, size=32), seq, np.random.randint(low=0, high=2, size=32)\n",
- "])\n",
- "\n",
- "print(f\"Header (N={len(seq)}): {seq}\")\n",
- "print(f\"Stream (N={len(stream)}): {stream}\")\n",
- "\n",
- "# Create buffers for cross correlation\n",
- "fifo = RingBuffer(len(seq), dtype=np.dtype(\"uint8\"))\n",
- "xcorr = RingBuffer(len(stream) + len(seq), dtype=np.dtype(\"uint8\"))\n",
+ "fig, (left, right) = plt.subplots(1, 2, figsize = (20, 4))\n",
"\n",
- "## fill FIFO with zeros\n",
- "fifo.extend(np.zeros(fifo.maxlen))\n",
+ "left.plot(np.real(syms), np.imag(syms))\n",
+ "left.set_title(\"AC Constellation Diagram\")\n",
"\n",
- "def correlation(v):\n",
- " n = len(seq)\n",
- " d = np.logical_xor(v, seq) # or bitwise_xor, no difference in this case\n",
- " return n - sum(d)\n",
- " \n",
- "for i in range(len(stream) + len(seq) + 1):\n",
- " xcorr.append(correlation(np.array(fifo)))\n",
- " \n",
- " # append stream data\n",
- " # if the stream is finished use zeros\n",
- " fifo.append(stream[i] if i < len(stream) else 0)\n",
+ "xc = np.convolve(fir_syms, syms)\n",
+ "right.plot(np.abs(xc))\n",
+ "right.set_title(\"AC Autocorrelation\")\n",
"\n",
- "# unwrap values\n",
- "xc = np.array(xcorr)\n",
- "# print(f\"Cross correlation: {xc}\")\n",
- "print(f\"Correlation peak value: {np.amax(xc)} at i={np.argmax(xc)}\")\n",
+ "plt.show()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "bc633da5-61b7-4569-adaf-3d019e0f1b17",
+ "metadata": {},
+ "source": [
+ "## Symbols for 16-QAM"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "id": "b56d782d-fcea-4fb9-b0c1-9c3933d5ce6c",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def modulate_16qam(m):\n",
+ " sym = {}\n",
+ " return map(lambda k: sym[k] if k in sym.keys() else None, m)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "id": "2fb687aa-0061-4626-bf6b-3ec7d628d739",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# convert into chunks of 4 bits for QPSK\n",
+ "# chunks = list(np.matmul(np.array(ac_pad).reshape((-1,4)), np.array([4, 3, 2, 1])))\n",
+ "# syms = list(modulate_16qam(chunks))\n",
"\n",
- "plt.figure(figsize = (25, 5))\n",
- "plt.stem(xc)"
+ "# print(chunks)\n",
+ "# print(syms)"
]
}
],
"metadata": {
"kernelspec": {
- "display_name": "Python 3 (ipykernel)",
+ "display_name": "Python 3",
"language": "python",
"name": "python3"
},
@@ -119,7 +230,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
- "version": "3.9.2"
+ "version": "3.8.11"
}
},
"nbformat": 4,
diff --git a/notebooks/FIRDelay.ipynb b/notebooks/Test/FIRDelay.ipynb
index 4576f88..4576f88 100644
--- a/notebooks/FIRDelay.ipynb
+++ b/notebooks/Test/FIRDelay.ipynb
diff --git a/notebooks/FIR_mehrere.ipynb b/notebooks/Test/FIR_mehrere.ipynb
index cdd7e25..e7f2240 100644
--- a/notebooks/FIR_mehrere.ipynb
+++ b/notebooks/Test/FIR_mehrere.ipynb
@@ -361,16 +361,16 @@
},
{
"cell_type": "code",
- "execution_count": 26,
- "id": "70acad87",
+ "execution_count": 28,
+ "id": "79e18131",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
- "Tap with amplitude=1, delay=1.25\n",
- "Creating filter of order N=3.0\n"
+ "Tap with amplitude=1, delay=7.5\n",
+ "Creating filter of order N=15.0\n"
]
},
{
@@ -379,13 +379,13 @@
"<StemContainer object of 3 artists>"
]
},
- "execution_count": 26,
+ "execution_count": 28,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
- "image/png": "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\n",
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXwAAAD4CAYAAADvsV2wAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAAASXklEQVR4nO3df6xf913f8edr1wm4Q527xV0bO52DlJqaNm2629AuYhTSzklATUAIpR2lsLEQ1HQtYm6TViBNkyDDE6PTwjKrZANRNYzUcyPm1hTKmBBLGqcucRPj1kpVxz+63tKZIPBw7Lz3x/frcn3zvff6+p57v+d7P8+HdOXvOd/PPZ/31+d8X/d8P+d8z0lVIUla+/7WuAuQJK0OA1+SGmHgS1IjDHxJaoSBL0mNWDfuAhZyxRVX1JYtW8ZdhiRNjMcff/zrVbVx1HO9DvwtW7awf//+cZchSRMjyVfme84hHUlqhIEvSY0w8CWpEQa+JDXCwJekRvT6LB1ptew5cJyd+w5z4tRprtywnh3bt3LbdZt6szypCwa+mrfnwHHu2X2Q08+dA+D4qdPcs/sgwCWFdNfLk7rikI6at3Pf4W+G83mnnzvHzn2He7E8qSsGvpp34tTpJc1f7eVJXTHw1bwrN6xf0vzVXp7UFQNfzduxfSvrL5u6YN76y6bYsX1rL5YndcWDtmre+QOp73/oCc6ce55NyzyrpuvlSV0x8CUGIf2xzx4F4Ld+6k29W57UBYd0JKkRnQR+kpuSHE5yJMnd87R5c5LPJ3kyyR920a8k6eIte0gnyRRwH/BW4BjwWJKHq+qpWW02AL8K3FRVR5O8dLn9SpKWpos9/OuBI1X1dFWdAR4Ebp3T5h3A7qo6ClBVX+ugX0nSEnQR+JuAZ2ZNHxvOm+2VwEuS/M8kjyf5sfkWluSOJPuT7J+ZmemgPEkSdBP4GTGv5kyvA/4h8P3AduDnkrxy1MKqaldVTVfV9MaNI2/LKEm6BF2clnkMuGrW9GbgxIg2X6+qvwT+Msn/Al4LfLGD/iVJF6GLPfzHgGuSXJ3kcuB24OE5bT4BfHeSdUleBHwXcKiDviVJF2nZe/hVdTbJXcA+YAp4oKqeTHLn8Pn7q+pQkk8BTwDPAx+pqi8st29J0sXr5Ju2VbUX2Dtn3v1zpncCO7voT5K0dH7TVpIaYeBLUiMMfElqhIEvSY0w8CWpEQa+JDXCwJekRhj4ktQIA1+SGmHgS1IjDHxJaoSBL0mNMPAlqREGviQ1wsCXpEYY+JLUCANfkhph4EtSIwx8SWqEgS9JjTDwJakRBr4kNcLAl6RGGPiS1AgDX5IaYeBLUiMMfElqhIEvSY0w8CWpEQa+JDXCwJekRhj4ktQIA1+SGmHgS1IjDHxJaoSBL0mNMPAlqRGdBH6Sm5IcTnIkyd0LtHtDknNJfriLfiVJF2/ZgZ9kCrgPuBnYBrw9ybZ52v1bYN9y+5QkLV0Xe/jXA0eq6umqOgM8CNw6ot17gI8DX+ugT0nSEnUR+JuAZ2ZNHxvO+6Ykm4AfBO5fbGFJ7kiyP8n+mZmZDsqTJEE3gZ8R82rO9K8AH6iqc4strKp2VdV0VU1v3Lixg/IkSQDrOljGMeCqWdObgRNz2kwDDyYBuAK4JcnZqtrTQf+SpIvQReA/BlyT5GrgOHA78I7ZDarq6vOPk/xX4HcMe0laXcsO/Ko6m+QuBmffTAEPVNWTSe4cPr/ouL0kaeV1sYdPVe0F9s6ZNzLoq+rHu+hTkrQ0ftNWkhph4EtSIwx8SWqEgS9JjTDwJakRBr4kNcLAl6RGGPiS1AgDX5IaYeBLUiMMfElqhIEvSY0w8CWpEQa+JDXCwJekRhj4ktQIA1+SGmHgS1IjDHxJaoSBL0mNMPAlqREGviQ1wsCXpEYY+JLUCANfkhph4EtSIwx8SWqEgS9JjTDwJakRBr4kNcLAl6RGGPiS1AgDX5IaYeBLUiMMfElqhIEvSY0w8CWpEQa+JDWik8BPclOSw0mOJLl7xPP/NMkTw58/TvLaLvqVJF28ZQd+kingPuBmYBvw9iTb5jT7MvA9VXUt8G+AXcvtV5K0NF3s4V8PHKmqp6vqDPAgcOvsBlX1x1X1f4eTjwCbO+hXkrQEXQT+JuCZWdPHhvPm88+BT873ZJI7kuxPsn9mZqaD8iRJ0E3gZ8S8Gtkw+V4Ggf+B+RZWVbuqarqqpjdu3NhBeZIkgHUdLOMYcNWs6c3AibmNklwLfAS4uar+rIN+JUlL0MUe/mPANUmuTnI5cDvw8OwGSV4B7AbeWVVf7KBPSdISLXsPv6rOJrkL2AdMAQ9U1ZNJ7hw+fz/w88DfA341CcDZqppebt+SpIvXxZAOVbUX2Dtn3v2zHv8k8JNd9CVJujR+01aSGmHgS1IjDHxJaoSBL0mNMPAlqREGviQ1wsCXpEYY+JLUiE6+eCUtZM+B4+zcd5gTp05z5Yb17Ni+lduuW+iCqloNrpf2GPhaUXsOHOee3Qc5/dw5AI6fOs09uw8CGC5j5Hppk0M6WlE79x3+Zqicd/q5c+zcd3hMFQlcL60y8LWiTpw6vaT5Wh2ulzYZ+FpRV25Yv6T5Wh2ulzYZ+FpRO7ZvZf1lUxfMW3/ZFDu2bx1TRQLXS6s8aKsVdf4A4PsfeoIz555nk2eD9ILrpU0Gvlbcbddt4mOfPQrAb/3Um8Zcjc5zvbTHIR1JaoSBL0mNMPAlqREGviQ1wsCXpEZ4ls4a4EWwtBa5XXfPwJ9wXgRLa5Hb9cpwSGfCeREsrUVu1yvDwJ9wXgRLa5Hb9cow8CecF8HSWuR2vTIM/EXsOXCcG+79DFff/T+44d7PsOfA8XGXdAEvgqW1aFK2677nw1wetF3AJBw48iJYWosmYbuehHyYy8BfwEIHjvq0Qr0Iltaivm/Xk5IPszmkswAPHEmazyTmg4G/AA8cSZrPJOaDgb+ASTlwJGn1TWI+OIa/gEk4cCRpPCYxHwz8RfT9wJGk8Zm0fHBIR5IaYeBLUiMMfElqRCeBn+SmJIeTHEly94jnk+Q/DJ9/Isnru+hXknTxlh34SaaA+4CbgW3A25Nsm9PsZuCa4c8dwH9abr+SpKXp4iyd64EjVfU0QJIHgVuBp2a1uRX4jaoq4JEkG5K8vKpOdtD/C3z1F36Bvz70p50t78dPPgvAV/7oxZ0ts2t9r7Hv9UH3Nbb4mrvW9/pgZWr8lld9By/74Ac7W955XQT+JuCZWdPHgO+6iDabgBcEfpI7GHwK4BWveMUlFfTJgyd52cyzbHt5Nyugq+Wc99RwA+lyuX2vsev6oP819n2ddL0s6P86gf7X+NTJZ/nq2ZP8RKdLHegi8DNiXl1Cm8HMql3ALoDp6emRbRbzqTe/A+jvebHv/8//G+hvfWCNfTQJr9cal+98fSsR+F0ctD0GXDVrejNw4hLaSJJWUBeB/xhwTZKrk1wO3A48PKfNw8CPDc/WeSPw5ys1fi9JGm3ZQzpVdTbJXcA+YAp4oKqeTHLn8Pn7gb3ALcAR4K9YmU8rkqQFdHItnarayyDUZ8+7f9bjAt7dRV+SpEvjN20lqRFrLvD3HDjOgaOnePTL35iImwpL0nkrnV9rKvDP31T4zLnngb+5qbChL6nvViO/1lTgL3RTYUnqs9XIrzUV+JN4U2FJgtXJrzUV+JNwU2GPMUjj0+f332rk15oK/L7fVNhjDNL49P39txr5taYC/7brNvGLP/QaNm1YT4BNG9bziz/0mt7cVNhjDNL49P39txr5teZuYn7bdZt6E/BzeYxBGp9JeP+tdH6tqT38vpuEYwzSWuX7z8BfVX0/xiCtZb7/1uCQTp+d/6i2c99hTpw6zZUb1rNj+9beDkFJa4nvPwN/1fX5GIO01rX+/nNIRy/Q53OV1V9uN/1n4OsCfT9XWf3kdjMZDHxdoO/nKquf3G4mg4GvC0zCucrqH7ebyWDg6wKeq6xL4XYzGQx8XcBzlXUp3G4mg6dl6gKeq6xL4XYzGQx8vUDr5yrr0rjd9J9DOpLUCANfkhph4EtSIwx8SWqEgS9JjTDwJakRBr4kNcLAl6RGGPiS1AgDX5IaYeBLUiMMfElqhIEvSY0w8CWpEQa+JDXCwJekRhj4ktSIZQV+kr+b5NNJvjT89yUj2lyV5A+SHEryZJL3LqdPSdKlWe4e/t3A71fVNcDvD6fnOgv8bFW9Cngj8O4k25bZryRpiZYb+LcCvz58/OvAbXMbVNXJqvrc8PFfAIcAb3wpSatsuYH/96vqJAyCHXjpQo2TbAGuAx5doM0dSfYn2T8zM7PM8rRW7TlwnANHT/Hol7/BDfd+hj0Hjo+7pBXV2uvVyli3WIMkvwe8bMRTH1pKR0m+Dfg48L6qena+dlW1C9gFMD09XUvpQ23Yc+A49+w+yJlzzwNw/NRp7tl9EIDbrlt7Hx5be71aOYvu4VfVW6rq1SN+PgH8nyQvBxj++7VRy0hyGYOw/2hV7e7yBag9O/cd5vRz5y6Yd/q5c+zcd3hMFa2s1l6vVs5yh3QeBt41fPwu4BNzGyQJ8GvAoar65WX2J3Hi1OklzZ90rb1erZzlBv69wFuTfAl463CaJFcm2TtscwPwTuD7knx++HPLMvtVw67csH5J8ydda69XK2dZgV9Vf1ZVN1bVNcN/vzGcf6Kqbhk+/qOqSlVdW1WvG/7sXXjJ0vx2bN/K+sumLpi3/rIpdmzfOqaKVlZrr1crZ9GDtlLfnD9QuXPfYU6cOs2VG9azY/vWNXsAs7XXq5WTqv6eCDM9PV379+8fdxmSNDGSPF5V06Oe81o6ktQIA1+SGmHgS1IjDHxJaoSBL0mN6PVZOklmgK/MmX0F8PUxlHOx+l4f9L/GvtcH1tiFvtcH/a9xVH3/oKo2jmrc68AfJcn++U456oO+1wf9r7Hv9YE1dqHv9UH/a1xqfQ7pSFIjDHxJasQkBv6ucRewiL7XB/2vse/1gTV2oe/1Qf9rXFJ9EzeGL0m6NJO4hy9JugQGviQ1YuICP8nrkjwyvJHK/iTXj7umUZK8J8nhJE8m+aVx1zOfJP8qSSW5Yty1zJZkZ5I/TfJEkv+eZMO4awJIctNwvR5Jcve465kryVVJ/iDJoeG2995x1zRKkqkkB5L8zrhrGSXJhiQPDbfBQ0neNO6a5kryM8N1/IUkH0vyrYv9zsQFPvBLwL+uqtcBPz+c7pUk3wvcClxbVd8J/LsxlzRSkqsY3Kns6LhrGeHTwKur6lrgi8A9Y66HJFPAfcDNwDbg7Um2jbeqFzgL/GxVvQp4I/DuHtYI8F7g0LiLWMCHgU9V1XcAr6VntSbZBPxLYLqqXg1MAbcv9nuTGPgFvHj4+O8AJ8ZYy3x+Gri3qv4aoKpG3ty9B/498H4G/6e9UlW/W1Vnh5OPAJvHWc/Q9cCRqnq6qs4ADzL4w94bVXWyqj43fPwXDIKqV3dKSbIZ+H7gI+OuZZQkLwb+MYN7cVNVZ6rq1FiLGm0dsD7JOuBFXEQWTmLgvw/YmeQZBnvOY9/zG+GVwHcneTTJHyZ5w7gLmivJ24DjVfUn467lIvwz4JPjLoJBcD4za/oYPQvT2ZJsAa4DHh1zKXP9CoMdjefHXMd8vh2YAf7LcNjpI0n+9riLmq2qjjPIv6PASeDPq+p3F/u9Xt7iMMnvAS8b8dSHgBuBn6mqjyf5EQZ/hd+ymvXBojWuA17C4CP1G4D/luTba5XPgV2kxg8C/2Q165lrofqq6hPDNh9iMEzx0dWsbR4ZMa93n44Aknwb8HHgfVX17LjrOS/JDwBfq6rHk7x5zOXMZx3weuA9VfVokg8DdwM/N96y/kaSlzD4dHk1cAr47SQ/WlW/udDv9TLwq2reAE/yGwzG/wB+mzF9LFykxp8Gdg8D/rNJnmdwkaOZ1aoP5q8xyWsYbCh/kgQGwyWfS3J9VX113PWdl+RdwA8AN672H8t5HAOumjW9mR4OKSa5jEHYf7Sqdo+7njluAN6W5BbgW4EXJ/nNqvrRMdc12zHgWFWd/2T0EIPA75O3AF+uqhmAJLuBfwQsGPiTOKRzAvie4ePvA740xlrms4dBbSR5JXA5PbriXlUdrKqXVtWWqtrCYAN//WqG/WKS3AR8AHhbVf3VuOsZegy4JsnVSS5ncJDs4THXdIEM/oL/GnCoqn553PXMVVX3VNXm4XZ3O/CZnoU9w/fBM0m2DmfdCDw1xpJGOQq8McmLhuv8Ri7iwHIv9/AX8S+ADw8PVPw/4I4x1zPKA8ADSb4AnAHe1ZM91EnyH4FvAT49/BTySFXdOc6CqupskruAfQzOinigqp4cZ00j3AC8EziY5PPDeR+sqr3jK2kivQf46PAP+9PAT4y5ngsMh5oeAj7HYMjzABdxmQUvrSBJjZjEIR1J0iUw8CWpEQa+JDXCwJekRhj4ktQIA1+SGmHgS1Ij/j8LwkpcCafaXwAAAABJRU5ErkJggg==\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
@@ -398,7 +398,7 @@
],
"source": [
"\n",
- "delay = 1.25\n",
+ "delay = 7.5\n",
"ampl = 1\n",
"print(f\"Tap with amplitude={ampl}, delay={delay}\")\n",
"\n",
@@ -540,7 +540,7 @@
},
{
"cell_type": "markdown",
- "id": "6fb85387",
+ "id": "892b32f7",
"metadata": {},
"source": [
"# Test 2"
@@ -610,7 +610,7 @@
{
"cell_type": "code",
"execution_count": null,
- "id": "87e52ab7",
+ "id": "6ba475b6",
"metadata": {},
"outputs": [],
"source": [
@@ -620,7 +620,7 @@
{
"cell_type": "code",
"execution_count": null,
- "id": "97f54131",
+ "id": "b1cfddba",
"metadata": {},
"outputs": [],
"source": []
@@ -628,7 +628,7 @@
{
"cell_type": "code",
"execution_count": null,
- "id": "cb6163b1",
+ "id": "5b4c5781",
"metadata": {},
"outputs": [],
"source": []
diff --git a/notebooks/Untitled.ipynb b/notebooks/Test/Untitled.ipynb
index 0a1a81c..0a1a81c 100644
--- a/notebooks/Untitled.ipynb
+++ b/notebooks/Test/Untitled.ipynb
diff --git a/notebooks/Untitled1.ipynb b/notebooks/Untitled1.ipynb
deleted file mode 100644
index 652e4fe..0000000
--- a/notebooks/Untitled1.ipynb
+++ /dev/null
@@ -1,33 +0,0 @@
-{
- "cells": [
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "f7f019cc",
- "metadata": {},
- "outputs": [],
- "source": []
- }
- ],
- "metadata": {
- "kernelspec": {
- "display_name": "Python 3 (ipykernel)",
- "language": "python",
- "name": "python3"
- },
- "language_info": {
- "codemirror_mode": {
- "name": "ipython",
- "version": 3
- },
- "file_extension": ".py",
- "mimetype": "text/x-python",
- "name": "python",
- "nbconvert_exporter": "python",
- "pygments_lexer": "ipython3",
- "version": "3.9.2"
- }
- },
- "nbformat": 4,
- "nbformat_minor": 5
-}
diff --git a/notebooks/Untitled2.ipynb b/notebooks/Untitled2.ipynb
deleted file mode 100644
index 4515e16..0000000
--- a/notebooks/Untitled2.ipynb
+++ /dev/null
@@ -1,182 +0,0 @@
-{
- "cells": [
- {
- "cell_type": "code",
- "execution_count": 1,
- "id": "c9db320e",
- "metadata": {},
- "outputs": [
- {
- "data": {
- "image/png": "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\n",
- "text/plain": [
- "<Figure size 432x288 with 1 Axes>"
- ]
- },
- "metadata": {
- "needs_background": "light"
- },
- "output_type": "display_data"
- },
- {
- "data": {
- "image/png": "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\n",
- "text/plain": [
- "<Figure size 432x288 with 3 Axes>"
- ]
- },
- "metadata": {
- "needs_background": "light"
- },
- "output_type": "display_data"
- },
- {
- "data": {
- "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXwAAAEGCAYAAABmXi5tAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAABf1UlEQVR4nO29d3gc13W4/d7ZvoteSYIk2ClSJEWKFCVKlgg1qyWWZblIrontyCWO4y+RHSeO83McW7HjuJfYsmU7sh0VV9kSVUyJoColFrFT7CAJNhAdi+079/tjdmZ3gAWJsgAW2Ps+Dx7s3Lkze3f2ztkz55x7jpBSolAoFIrJjzbeA1AoFArF2KAEvkKhUBQISuArFApFgaAEvkKhUBQISuArFApFgeAc7wGcj6qqKjlr1qzxHsaA9Pb2EggExnsYeYe6LtlR1yU76rpkZ7jXZevWra1Syups+/Ja4M+aNYstW7aM9zAGpLGxkYaGhvEeRt6hrkt21HXJjrou2RnudRFCHBtonzLpKBQKRYGgBL5CoVAUCErgKxQKRYGgBL5CoVAUCDkR+EKInwohWoQQuwfY3yCE6BJCbE/9/Vsu3lehUCgUgydXUTo/B74HPHiePi9IKf8iR++nUCgUiiGSEw1fSvk80J6LcykUCoVidBC5So8shJgFPC6lXJJlXwPwW6AZOAXcK6XcM8B57gHuAaitrV358MMP52R8o0EwGKSoqGi8h5F3qOuSHfO6SCl58WSCy6c6cTvEeA9r3FHzJTvDvS7XXnvtVinlqmz7xmrh1TagXkoZFELcCvwBmJ+to5TyfuB+gFWrVsl8XpChFoxkR12X7JjX5Zk9Z3jg6a24q2bwT9dfNN7DGnfUfMnOaFyXMYnSkVJ2SymDqdfrAJcQomos3luhyDdaeqIAdIZi4zwSRaExJgJfCDFFCCFSr1en3rdtLN57rHnxYCtvnOke72Eo8phIPAmAx+kY55EoCo2cmHSEEA8BDUCVEKIZ+H+AC0BK+UPg7cDHhBAJIAzcJSdpbcX3PvAqAE1fuW2cR6LIV6IJHQCPSy2DUYwtORH4Usq7L7D/exhhmwpFwdNXw//FpmMcbgnyhbdcPJ7DUhQASsXIIZkPLR29yj6ryE5PJAFAPGlo+p//w25+/nITuj4pH3oVeYQS+COgPaJzuitsbZuP6gD7lB1fMQAdKWdtOJa0tR9p7R2P4SgKCCXwR8A/NIZZ85/PWdu90YT1+mx3ZDyGpJgAdITiQNq0403Z8ned7ByvISkKBCXwc0hvNK2xxTK0fYUiEzMcM5wS+HVlPgAOtQTHbUyKwkAJ/ByQTNlee6Jxq80U+C8cPMdvtzaPy7gU+UlnSsM3TTqxlC0/GEkMeIxCkQvyusThRKE1GKW2xGvT8E17/vseeA2AO1dOH5exKfKPUErQmxp+OGbMlZ6oEviK0UVp+DngVKfhuM204UeVSUcxANGEIehNG775v1cJfMUoowR+DjjdZThoe/oI/Em6tkwxQkxlIBI35oip6QeVwFeMMkrg54AzKYGfqaHFEjrd4fS2Ev4KMOaB6d8Jx5PEk9LyAQWjyfMdqlCMGCXwh0kimTbZmJqZ3aST5GRn9hh9ReGSOQ/CsaSl3YMy6ShGHyXwh0kk48btjRk3qrmCstzvIpawL8oKxZT2poBoPD1vIvGkZb8HFaWjGH2UwB8mmaskzde90QR+twOfy0E0odOekV4hFFM3syLtsPW7HYTjSWvuVATcNg0/GE2oOaPIOUrgD5NMzSwUS0I0Sm8sQcDjxONyEEvotsd3peErIG3SKfO5CMeT1ryoKnITjCUsX88V9z3LZV9aP27jVExOlMAfJqamBjB30wYoL2fmpo0UeZy4HRrRRFIJfEU/zHlT4nMhJXSGjafA6mIPUqbnSTCaoDeWVCu2FTlFCfxhYi6WQUr+8pHvQjjMXfd/kRKXwOPSUhp+5lOAejxXGKGYYAh8gO6wseq2qsgD9Hfcbj/ROXaDU0x6lMAfJpGUMC+L9DD95BG47DLKu1pZeXw3HqdGNKHbtLOQCrlTkNbwheMs7a4f8ZnGd9Lm+gHCeRrov9p2v8q6qsghSuAPE9PZdnHvWaPh3nsJu31cs+1Z3E6tvw0/rgR+obL1WIf1hBeN60S03fz+9Hvocf6JXW0vEnSu4wf77iSsbe+n4atwXkUuUQJ/mJhO28XBlMC/5BJeWnQFq7ZuwI8kmtBtIXghFWNdkBxr6+XO/3mZLz+xD4BTPac55/4ycT1k6xfXI7S6v8LR9hO2QiixpBL4ityhBP4wMePw53efISk0mD2bdYvXUtTTycpdL1k2fKcmAOW0LVRMG3xTm1Hc5AevfwFd9GTtq4sg39/2ZdtiLOW0VeQSJfCHSSQlwOvbT3G6tAbcbp6uv5T2afXc8Zvvc81rT7G48XGqvMYlDiuTTkGy9VgHAOV+NyfDJ9l44g+2/VqfhLXPHvs1+84dsraVwFfkEiXwh4nptK3ubuNUcRXxpE6v1Nj491+gtL2Fzz38n7znO//CNx75D5yaUMvmC5R9pw2na1swxv8d/z900gLcpc/k/fUbcekzrDYdnR9v+6G1rQS+IpcogT9MTKdtcW8nbb4Sq6hF+5Vr+caPnuTOv/sJj91xD1fufZmrT+1WJp0CxayR0Nx1mmfOPmPbV5p4J71RQUnyDlv77/c/gkz9MCgbviKXKIE/TN65agZfvNJLUXcH7f4SWoNRAIo9ThLlVRwon87jN72HHn8xb9/5rIrDL1BM5/6R3g0kZHoOTCuahT95NT2RBBXiWorcRda+c6EzxLT9gNLwFblFCfxhUh5wM7NI4OnupM1XSkuPIfCN1ApGHH5QuNl+8RquOvAq4UjsAmdUTBYycyiZAr9N32jrc8eC9yJw0BOJ43P6uXX+rbb9Ie1lQGn4E50j54KWMpgPKIE/Apw9PWi6Toe/hDOpzJgBjwOPUyOW1AnHk+xafhVlvV1UH9w7zqNVjAWN+1u49D/+zIsHWwHDWe92dxPVdtv6/eWCtwFGhlWPU+PORXfa9vc6XkYilYafx7x8qJWz3ZHz9rnu6xu59muNYzOgQZATgS+E+KkQokUIsXuA/UII8R0hxCEhxE4hxKW5eN/xxt3VBUCbv5RDLUEAyvxu3E7jsvZE4jQtXA5A3cFd4zJGxfB4bPtJDpzNHj55Pl4/3gnAq0fbACOVgqd4C4i04PbIOSyoXAAYc8Tj0rh1/q1ouKw+Se0s0nlMCfw85t0/eZUbvrHxgv3yqVZxrjT8nwM3n2f/LcD81N89wP/k6H3HFVdK4Hf4StjRbLyeVubF53IA0B1J0FtbR1dJObMO7xm3cSqGzt8/vJ03f/P5IR/ncxvffTiWtMoXdkj7ecrFWksp0CV4nA6K3EVUuy+z9ZPu3cqkk6eYWU17zlPDIHMBXb6QE4EvpXweaD9Pl9uBB6XBJqBMCDE1F+89nrg6OwFo95eys7kTl0NQFfBYAr8rFMfjcnB8zsXMO7ZvHEeqGArxEQhZjzO97iKa0EnSwanwNluf6Z7rcDu0fsdM99kFfkTbqTT8PCWeTAvzgcqXBvMwUMN54S45oQ44kbHdnGo73bejEOIejKcAamtraWxsHIvxDYuKlhYAOv0lROI61T7B889v5Ogp44uOJXXazp1l/9TZvG37S7zwxBMkA4HxHPKYEAwG8/p7uxDBWPoGHurn2HvEcNg2nTjF+g2thBwvWyGWACXaXAJ6Ja9tetlqi4aM61WWWGA7V2dyBy2trRP6Wg6GiThfwon0HHnsmQ2Uefrrzm3h9Pc+nM83GtdlrAS+yNKW9WdRSnk/cD/AqlWrZENDwygOa2QcevRRANwV5RCHuVPLaWhYQ3TPGdi5FYDZM6cTXrUG7clfcLXfD3n8eXJFY2Mj+fy9XYjjbSF4bgPAkD/Hluh+OHCI4vIqVl1+Mb0vftK2f7rvBqaXVXB9wyp49ikAqivKaWi4gj+1lLJxXwkJjMVaCXqJ+87Q0PDhkX+oPGYizpe2YBTWGwVq6hYu57JZFf367D/TAxsNc97atWsRIpsYhINne3A5NGZV2ZXB0bguYxWl0wzMyNieDpwao/ceNZy9Rn4Uf0UZANPKfACWSQfA7dRoW3yJsbF5M2DEVo/EbKAYXXqicet1coh2WLOgfXtvjOOdp4hqdt9NibyaUp/LbtJxGa9LfR58cqmt/5no1iG9v2JsyPStmIswu8JxvvT4XiuAoyeSnkfnW3h54zefp+G/G0dnoH0YK4H/R+D9qWidK4AuKWU/c85EwxEKQVERp1Ix+MtnlAFpxx0Y9lmtuprjpbXI1wyBf/l967n+6xf27ivGh0xHXFtvOoZaSnnBMDwzhUZrb5Q/Hfw9iPQPhlufSyhUTYnPiaYJXA5D4zNt+JVFbpzxJbbztcdVdFc+kpkJ10xh/Znf7OAnLx7l3/9k/MhnzqPOcJwLMRb+mlyFZT4EvAIsFEI0CyE+JIT4qBDio6ku64AjwCHgx8DHc/G+440jHIbiYu69aSFvW1HHey6vB+wavsep4Xc72DVlHnKroa11hOIcbw9lPadi/Alm3Kgt3WmB/6tXj3P5fc8aj+oD0Jty1LUFY6w79DvbPn/yarrCcavalanle5zGfKkIuPHqF9uO6UruRUpJazB63vdVjC2ZGr5Z1GZXKlLvhYNGfH53hobfFbqwwN9zqivHo+xPTmz4Usq7L7BfAn+bi/fKJ5y9vVBSwnsur7eEPYC3j0nH73aye8o8btv4ErKtbTyGqhgCmSadzFWzrxw2vrs9p7pYOKU467HBVO6cnvg5ms6+YtvnT74JgFJT4Ds1emNJS8OvCLhxyXqE9CCF8UMTp4NjXce487sHaeuN0fSV23LxERUjJFMbj8aNVOinuyMsqSth98luznZH+mj42VfaZ0b47D7ZxcGzQVbPruhnz88VaqXtCDA1/L5kmnSKvS5Dw6+dB0DvK69Z+xLKjp+XZGr4mVlO/anv1Uyjcdf9r/DZ3+60HWv275QvIDPiEpbXXopLTgGgxJsW+JC24VcG3AgcuPX5tnNuat5EW+qHZ6AQQMXYklmvOprQOdkRRkpYNr0MMJ7iMwV+9wAmncy06fvO9PCZ3+7kXfe/krVvLlACfwQ4e3uzC/wMDb/M58LndrB7ylwAwps2W/vaelV+nXykO1PgZzjbzDKVR84ZTrlNR9p5ePMJ27GmwA85XrS13730XdbrTA0fwO0w5kt5wA2AR19oO3ZT8ybrtSp5mB9kfg/RRNIy0S6rKwWgMxQjmPGkOFA9jMwfhef2GWHeZ7tHL/eOEvgjwBEKQUlJv3abwPe7KfY46fSVEKmbgdyWXoTTMopfrGL4BKPZNfyzXYbD9vC5Xlv/5o60P6Y3liAhzhHV7LmT3rH4HcwtNW43R6oKmmXDz9Dwob/Af/Xkq9brTLuwYvywmXQSOidMgZ/S8DtDcduTYjiW/Yc6U/M/kxEQcNcoaflK4I+AgUw6pk0WoMzvoq7cCNdsXbAE/67t1r5zwfNHfCjGh55IHL/bgU6EV049zdde+BH3/v6P1g15tjtiu+HN/Dlg5L8POTbYonOW165kdvls3n+xm/pKPyvrywFwWU5b479l6ukj8Led3obEEAzd4fxbvVmIRPvY8M2n9bk1hu29IxQjFEsSMFNtZGj4LT0RPvbLrXSF4tbTZLE37U6tK/NR5nMPOSR4MIzVwqtJiem07YumpRdYlPvdVBa50QQ0zbqIN214kpJIkG5vkdLw85RgJIHm284p7av8aE8npELpfcnLqOTvCcfcthjrtoz0tz3ROGHXBtv53r30fQDUlzjY+OkGq93S9FMCX9OE8TpRSYVnKu1RI3I5lowRE0fwyIVKw88TYn1MOgld4nVpeJwO44k+FCccT1IecNMbC1tpsgHu33iEJ3efYcXMMubXGgrjnKoAO5q7uGNFHd9813JgeKtzL4TS8EfAQBp+JmV+Fy6HxtRSH7unGI7bS1uPAnbTgSJ/ONy1mb2xz5MUnbb2sGMzZ7330hk7Y7O9tqdC7uJJnWDyDSKZWUSkg3cvvSvr+9x8seHEbe1J+3JMG/C8MntC2aj2BnD+ZF2KsSNT4EfiOsFogiKPoT+XBVx0hGJE4kmKvS4cmrAWZ2USievW92n++K9dUD2q41YCf7hEo2jx+AUFvhmiOaPCx6vlswC4JnjcOIVywOUdvbFeNpz7f0iyC9a4OMMJ7fOc6DxntXWGDIHdG03Q7fyjrb9fv4xpxTVZz3XP2jm8+/KZ3L06vQj9/VfOAuDiqpW2vtFUBayBoj0UY0tfp20omsDvNgR+ud9tafh+twOfy2Ez6ZhPaae7wtb3+S+3LuKvrpzFrUtHN6ekMukMl57UIpgsJp1szKzw8+czPZwuq2H52UOIRRAdwHOvGD++99r36E2esbU5ZAVJkU4GG9eO8ck/vx/JPyJwWrH6e1sOEXK8YDu2gpsGzKHicTq47w57KoW3XDKN2ZUBOpOl/GzPF632mHYAUE7bfCGWCsv0pqrb9caSBEwN3++mMxTDoQn8bifePgL/RLtRLOnIuV5mVhg2/4unlbIqSz6eXKM0/OFiCvwLaPgmN108hY5QnK1TFjL/0C68TgcRpeHnFdFElG+9+i1bW3HiLdRFfsbSiutt7dtbXqDD9RO8Lo2OlIb/vc3fsBU68Yt6qp1rhjyOpdNLWTntUjSRjvZKaGdI0qVMOnmCudK2xOsyBH40YTloS30uusJxwnEdr8uBz60RyTDpnEhFdTW19RKMxnFoAq9rbESxEvjDpdvIaDhYgX/dRTUsqSthS90iilvPMDPUqjT8PGPdwXWcCaa1e6fwURq/G4GDP77n11w540pb/x7n48iix2jvjfPaydd4ZN/PbPsr9DvxuV0MB7/LT33JRba2mHZQmXTyBDOXTrHXSTSetGn4RR4nwWiSSDyJL8Oks+90N+/60Ss0dxgafmcoTm/UMPsM9BSYa5TAHy4XMOm89rnr2fy5G6xtIQQP/c0VzL/jJgAuO7lP2fDzjEf2PGLbnl90Gw6MH/RpJaX8/l2/p8ZfZ+tzIPIjXuv6HG956C3oMv19OvRatMjVI9LcFlX2ddweUCadPCGW1BECAh5nWsP3GBp+kcdBMBonHEvic2l4XQ4i8STfefYgrx41TINXzKkgmtDpDMUsZ+9YoAT+cLmASaem2Et1scfWVux18Z6PvAUCAS49sdcWqqUYX0LxEH868Cdb25LyWwFDi3M7NWoCNXxl7S8Q0mvr1y5f4GzvWVtbRfwjCFy2vEpD5eIqu8CPOw4Siqo5kw/EEjoep4bX6ejntC3yuKzIHZ/LYdnwM7NiXLvQcOSf7Y5aKTvGAiXwh8sQTToWTidcfjlLj+1RGn4e8cSBJwjF0ytmS1y1zCs1BK65AhZgWe1yqmOfx4FvwHPdvfij+PXVgH3V9VBZVm2P1IlpB2zL9RXjRzSh43ZoeFJO28ywzKLUIqpgNIHXMunoHGwxlMS/u24elUWGMni2O6I0/AnBEKN0bFx1FXNOHUb0qHS3+cJDu35r2760+haqiw2hnhlzHfA48OmXMEv/LzxM6Xeekvjb+OLar1rbI9Hw51dcZHuaSNDFuXDzsM+nyB3RhI7b6cDj1IjEdUKxpKWpF3nS37nf5cTnctAVitHUFuLvrpvHP755obWy9kx3xHoyGAuUwB8uw9XwAa68EofUmX5g54X7KkYdKSVPHnzO1nZZ7U288zIjPr49lF4Y5XcZN2ciOps3FT/I/97+K8qTd3J1zd/xuZXrKE98kJqStPY/EoHvdblw6/NsbadCqiBKPmCadDxOBz2ROAldZjht0456n1vD53ZwrD1EUpfMqPADUJzqG8pw9o4FKg5/uAwxLNPGmjXoQjDnoBL4+cDGw7uI6OmFVEJ6WFx9KXVlPr5913KrdCWAP0N7K/UFeP/yG2ncPp/n3mjh5ZAPhxai2ONECJCSETlt3U4Nj76AqGO31dYS3XueIxRjRTSRTAl8jY7UOgwzLLMoIy+OacM37femebDYm/5RCHiUDT//6ekh6fWCYxhfVmkpJ+vmsuDQDpK65Nl9Z1We83HkY7/5hW3boy+i1GtoYrcvr7MVqPbbah0YN/Z3716BJoyFNIFUiJ03VcVqJDZ8t1PDrS+wtXXE0wI/FEvYcvooxo5YQjd+kF2alUI7MyzTxOty2OZARUrgZ/4oKJPORKC7m6RvYMfdhWhaeAkLm/aybnszH/rfLTzw4tEcDk4xWKKJJCdCm21tXn0pPlf2m9DrdGCGTJvZLQMeJ6vqjR8F82Y3Ux6PxKTjdmh4pF3g9+gHSejG4qvr/nsjS7/wzLDPrxg+sWTapGNSlEXg+9zGwiuTyoDhrM3MjlmkNPwJQE8PicDwy5Adv2gFgWiIwEEjKdZDrx3P1cgUQ+DIuSARzW4X9+jLBgyV0zRBUUojy7xp59cWAVBTYjhZLQ1/BCF3HqeGQ1ajyTKrTSfC3nOGln/mAgXVFaNHNG5o+JlzwCxs09ekk6nBVxSlNHyP0vAnFiPU8E9evAKA4q1GcYu+RTUUY8PLTftteXKE9ODR551XUE8tM4R6ph3WrHnwnstnAlDiM25ir3NkNnyBwNPHrJNZAQvsRVoUY0MsaQh8U8gDVnF6m4bvclBf6be2TTt/5pOfCsucCPT0kPT7L9xvAELTZtJSVEH562lzgrLjjz0vHLMLT7c+D4HrvLb3qqL+j+V/feVsfvjeS3n7yukATCk1fgC8I9DwrRKIfQT+i8dftm2bS/UVo8v6vWd5z082kUjqqSgdhyXkIUPDzxDgMyr8LJqaDt3OlkLBP4YmHRWlM1x6ekiMQOB73A62TV/Mlbu2Qmp9zViHaCngUOcO27ZbGmGQU0q92boDaUGfebP73A5uXpJObTulxPhRMMsYDgezIpZXX0xXRvuLx+0ZOZs7QiycMoxoMcWgkVLy4Qe3AEYt6mgiiduhUZap4aee+Bya4JoF1Vwzv4oZFf4BK1fNqQpwpHVsn+yVhj9cenpGZNLxOB28Nm0RJWdPUtvTCqiCKOPBiWBf+72hTZtafDZMU45TGzjh1ZSULX8kyc6cmkAIQ8PXMnSzo51HONl1yto266kqRo9jbelr3BaMWVE6mSadzCe+Bz+4mg9fPQdIFzfpm2rl23etoMTrZPmMslEcuR0l8IdLMDgik47XpbFl+iIAVjXvA1AhdmOMLnXOhPfZ2tz6fK6eX3Xe40xN7nzfV23qCeF01/Adq0II3A4NDS+VbnvmzPVHN1qvzXz8itEj83vsCMWIphZelfrTAl87jwKw8wtvZsO9Dba2pdNL2fmFm7h4WmnOxzsQSuAPlxxo+Htr5hB1e1h10oi6ULnOx5YDbQeI6UFru9xbzpMffwf3v2/VeY8z7fRmAqxs/MXSaayeXcHfXjtvwD6DwbTjT/OtsLVvbEqbdaJJlZNptGnNqFvc1pvW8Mt87vMclabE6xpT5+xA5ETgCyFuFkLsF0IcEkJ8Nsv+BiFElxBie+rv33LxvuNGMgmh0Ig0fI9TI+FwcmDmIlaeNDV8JfDHgh9tPMyRc0G2nNpia181bRXLZpRdMJRy8bQSmr5ym1WAOhulfhePfmQNs6qGH7oLxjwBmFlkz5z5cvOL1mszN7ti9MgU+O3BqOW0zTTpTARGLPCFEA7g+8AtwGLgbiHE4ixdX5BSLk/9fTHL/olDr+FoGYmGb4ZlvTZzKRefPUJJJDgsG35Ld0SF5Q2BUCzBfz75Bm/9/kvsPGtPbbFy6soBjho/TKfvrKKVCNImg/1tu0jSAaSrL3WGYmxuarcdf7IzzI4TnWMz2EnMuZ6oteCuPRRPJU/TxqxSVa7IxWhXA4eklEeklDHgYeD2HJw3f0nl0UmMQOCbj3fPTFuCQ+qsOb6zn004Ek8O6OEH0HXJ6vue5SO/2DrscRQakZQ23B1JsLtlt23fstpl4zGk82KadMp95SytsZt1wo7XgbSG/7YfvMw7fviKbc6884evcPv3XyKuzD4j4mxPEN2/DqdvD8c7T1lx+GNVqSpX5MKoVAecyNhuBi7P0m+NEGIHcAq4V0q5J9vJhBD3APcA1NbW0tjYmIMh5hbf8eNcDvRq2rDHd7jVyL+xbcoCwm4vVzXtYPue/dT2HgFg06kEP9wZ5b2L3NxQn/2xsanLOMeLh1rz6joFg8G8Gk8mbeG04Ntywm7SCR8L09jWOGrvPZzrEosaMfZnT59isXsxO9lm7QtrWylKXseJU6dpbOywQvyeXN9IkdsQRCc7jeMfeGwDF1WMXbz3UMjn+WLyetN+jus/AODbe8HlmcWp4z+isfEUfznXRV1g+LJgIEbjuuRC4Gf7ieurlm4D6qWUQSHErcAfgPnZTialvB+4H2DVqlWyoaEhB0PMMVsMQeEqL2e44ys70cnXtrxE3OHi2JLLuKppO2119TQ0GGGBP/3pa8A5HGVTaWhYkvUcP9x4GHiDFTPLaGi4aljjGA0aGxuHfV1GmyPngrBxIzpBzkXTGTKdmpP33vJe3I7BOeGGw3CuS8n25zkV7GH+nHpWL7yHh3/+S2tfxPE6lW4XpRUVrFh9CTxl5NVZvOIy5lQbqR6W7HqB3Se7CQam09CwMGefJZfk83wxuXfr87ZthyznogXzaLh6DqM19NG4Lrkw6TQDMzK2p2No8RZSym4pZTD1eh3gEkKcP/YtnwkakR0jcdpmeuyPr7ySue0n0U6k8+kEU+adyHkcckfOBfudS3F+zOsZ047Z2hdWLhxVYT9czHDA+soAa2aswUHaCayLbly+I0QTOofOpaONOkJp06C5ePtcT9rpqBg6LZFDtm2XnGmZ2yYSuRjxZmC+EGK2EMIN3AX8MbODEGKKSBm7hBCrU+/bloP3Hh9SNvyROG0zhfS5NWsBmPni+vRbpCJ2grGBHbLhlPAKxVSd08ESSRjXKi7sAn9JTfanqPGmK7Vwa9HUYpyak0qn3bHcLjcQjSdt9ZG7wum4fHMehVT95BHRk7Bns3Xp9VYE1URixCOWUiaATwBPA/uAR6WUe4QQHxVCfDTV7e3A7pQN/zvAXXIiJ47JhYafsSpPLL6Yo3XzWNr4uNVm3qh9I3AOnO3h4FnjByecEvQqSmfwmA7OeB8Nf2nN0vEYzqCZV2OYaOYE3mxrPxFZTyQRs+YCQEdvWsM3AwFCao6MiF5pF/huvb5gNXyklOuklAuklHOllF9Otf1QSvnD1OvvSSkvllJeIqW8Qkr58vnPmOfkQMP39ymKsPOaW5l3dA8cMh4dzRs1U5if64ny5m8+z43ffJ6O3pil1YWV9jZoTA0/NkE0fHM5vpl3fXH5WhykFY2I3s6p8BbbHOhMPRVIKa1QX/UUOHx6Y2HinLa1ueQM3MMpfjTOTLyfqHwgpeGPJCwzcxl2ZZGbU7e8FQD9V78iqUurik4wmr5RD7Wk7bRtvVFL4KubefBE40kksp+Gn68Cf/3/t5Yt/3qDtV1dVEKZuNrW53j0TzaTTmeqBm80oRNPGg/SyqQzfLaf3g0i7Utz6DVo+AvTpFOQpDR8fQQCP5OKgJvSBXN5oX45oe98n2B3OoNeKMOGfzQjs153JGFpdWEl8AdNJK6TpANd9FhtHoeP2eWzx3FUA1Pqd9kSuZX53Xhia219WhIv0NSZdip2pAR+d8a6jvB5fEGK/ui6ZP8ZY45sP2Nfr+GW9cZ/JfALhGAQfD5kjh7pKgNuppf7+OEVb6eo/RzBb38PAJdD0BtNoOuSB19p4n82pm/qngyBH4olVC79QRKJJ4lrTba2+pKFaGJi3ApTS704E0vxkvkDpfPLN76ERFJT7LGidIIpP5BDE+opcIh857mD3PSt59l/poddZ+0ZVV26EviFRU8PFBXl7HQlXhfLppfyUv0lPD9rBVX/fR91XS1MKfUSjCbYfaqLf31sK4c73iAmjiGJ0ROJWw5IXRqP74oLYwh8uzlnbtmicRrN0JlR4UMgKIq93da+s+05up2/ZWaFj7NdEdrD7Ww9tZ24OElNkVM9BQ6RZ/e1ABCMxnmjda9tnyul4U9Ek44K4B4OPT1QnLuCE5omKPO7ee1zN/D2zjM8/YtP8bcv/QufmTaFFq2Ta37ZQ5cvHcUqpJuvb76Dntg7ACMNbziWHFHB7EIhktD7OWwvqrx4nEYzdGaUGw5bf/Iapgeeobk3XcCl0/Vznmp/gkgixG//K2X+80JrooySxFuIJxtwOSZWsq/xInPdwoH2vim0jTKWSsMvFILBnAj82hJ7QYTqYg/ddTP5p7v+jbJwGyf17cS1Jrqi9iULUsRobH6EffrH8XqNfcopNziyafiLqieOwJ+eEvgCwXsXfBWPZg8N7k2cI4m9ilJMdtLqeJA3//Jm3vmjjexs7hyr4U5YzOyY7aFuTvemF0RqQsMpjfTYE1HDn3gjzgdyZNJ57h8b2P5vN1rbQgjmVRfxx5qL+fcb/vmCxydEC83aF5DElFNukIRiCeLiuK1tWW1+x+Bn4nM7LM1ybvl87rn4hwg5cDnGTBqbnmNd8xe599c7Lty5wEmkEtAdaLNr9zNL5qBhKGq1JYO77vmEEvjDIUcafsDjpMxvX85fV25E/pwqtVc4QmrMKZ/D1KKptuZeeZQu5yPKKTdIzvQeQ4r047omS5hZOm0cRzR0rr/IKLwyv7aYZdVXMTX6ber9DQjSJj2ncFPrm4OQfZ4AnM9xsNteE1dhJzPbaF9zzqKq9NOgWepyIqEE/nDIsdM2k2llhsAv8ZTz5at/wZTIt7jS/yhXeJ7k8CcPc+xTx6jQ7HHY3c4/0Nx1OtvpFH04Gdxv23bpM/FPsFxE//PelRy571bWLqjG49RwyTpWF9/HdcVP8uoH9zA9/EumhX7N7VMfYSE/pa7InqfwpP4ASV0pCAPRm/G0fKTTLvCX1BgCf9n0sStLmEuUwB8OOdLws2EK/IDbyS3zbsMj53GyzU9VkaGpuRwulhd9Fo+osI6RIsr/7b1/VMYz2TgdOmjbdst6/BeocJWPmAv3zBW4neEYAY+f1TMW85P3XY/Awfp9LdQGavjMZd8FmV7oF9eaeGTXn8Zl3BOBeEbE27Fuu4Kwqu4SfvL+VfziQ9kywOc/SuAPh1HU8OvKDLugy6FRnmHuqQikX1f6ypki7rYd98ThXxJLqmLWF6IlbBf4Hjkbl2Pi3gamPb8zFMeXqr503UU1eF0aSV1SEXCztHYF/qT9qfAHW34w5mOdKJirkwFOBA/Y9i2pWcINi2snXGlDk4k708cLKUdVw68pNgS+0yEozxTyGa+LvU5E+FqbfbYz2sqzR54dlTFNJtpi9jS3xc78XGE7WMxIkc5w3ArLdTk0ltWVAVAR8OB3OShJ2IvQvXLyOVpDrWM61omCWR0sSQ+d0bNWu0tzMb8iaxmPCYMS+EMlEjGKmI+Shj+7KoBDE3zmposo8TqtOpq1pemIgCKvE6l7CSSvsR37u32/G5UxTRaiiShdcXuETrlrzjiNJjd4U+aoWELHl7EO46p56XITpX4XHrkQlz7LatNlks89+bMxG+dEwqwR3Dd8d2HVwgm/jkEJ/KGSyqMzWhp+wOPk8H23ctuyqQghrAIWpm0fDA0fwJ+80nbsH/b/gYSuwjMHYn/bfiRpZ6VDr6bYPTGdbyaZdRUyBX7DwmoATnWGqUiZBvvOl1/s+LWVTVORxtTw+4bv5muCvaGgBP5QSWXKHC2BPxDTbQLf0DK8+lKbwGoNtfLi8RfHdFwTib5Fy11yJj73xIrQ6UsgY/yeDIG/tK6Uu1fP5Et3LLFMg30Fflh7nV0nVXRXX+IJQ8vql1G1Wgn8wsPU8EfJpDMQ2TR8gYs3z77N1u/3+x5jxRef4Y87bFUmFdAvCZZbn5gROplkavglGUV1NE3wn29byqUzy3E5NIq9TlyynhrfrPTBIsFzTX8ew9FODEyTTt8UHBfXTJwV2QOhBP5Q6ew0/peOrSlgWlnahp+54OOORXZn3FMHn6UjFOc7z9qjURSwq6VP1kNZbzODTEQCnvT4S84TOVIZcCMQXDH1Jlv7q6fUIqy+xJP6hKqZMBSUwB8qHR3G//LyMXm7qiLjcTxTyGdqcjfNu87W/2DHbpIEWVY3sW3To0Ffge/WZ9sW2UxEAgNo+H0xzTpXzbDn0t/eMrGLz40G8aROknZbzQSH8DKnfGI7+EEJ/KEzxgL/8b+7mj/87VW2tuKMG7sqUEWRlp6IEklU22PlAlEYdEY6Od6VdsI5hAOXnMHxttA4jmrkZCbwupCGD3Dt7Kttuf9P9Bygpbdl9AY4AYkn9X41EyrccydMzYTzMfE/wVhjCvyKivP3yxFTSr0sn1Fma+ubw6Pavdy2HdF2WTVxFQZ97ffzKxYicNHWO7EXqwmRXkF7PoFvLuKbXVnNiikrbPueP/b86AxughJLSGKavWh5tWfBOI0mtyiBP1Q6OkAIKCkZtyEU93l0n+q91LYddexW4XZ96GvOWT51GW6HxieunTdOI8o9JedJ5jW11IvP5aDC72Ztvd2ss7Fp42gPbUIRT+rE+zhsp/iVwC9MOjqgrAy08bt0fTX8mUWrbNsx7Qgd4R4UaXae3WnbXlazjANfvoV7b1o4TiPKPaW+gW34H7p6Dr/+6Bo0TdAwq8G276UTL43yyCYW8aTeT8OvC0yOeaIE/lDp6Bgz+/1A9NXwK3zV+MT0jBads2F70qdCp5/Ar102TiMZPc6n4Zf6XCxJOfLXzFhj27erZReP72wazaFNKMLxKHHRbGubUawEfmGSBwK/KLXY5i2XGHnc/S4HXmnP8dEa29vvuEJFl3q/RVdLJ1DRk8FyPht+JlX+KmaVzbK2E3qCv3nod2w8cG6URjaxON59GETaJOqQlVT4KsdxRLlDCfyBOH4c3v1u+K//srfngcDXNMGWf72B/37HJQDG4qHYXFufHv0NpCysSB0pJT954YitHmlSlzx/ZC89sbSJy+8sZkbJjPEY4qgylJrGl027zLYd1Q7w6OYTuR7ShORoV5+i5fqsSVMvOicCXwhxsxBivxDikBDis1n2CyHEd1L7dwohLs12nrxBSvjgB+Ghh+Cf/gleey29Lw8EPkBVkcdKjetzO3FLu/MxKg7RW2BVsJo7wnzpiX184Kfp7+uOH7zEOx94xNZvZvEiW3RLIbJqWl+/zyHl6E9xvOcN27Zbnz0h69dmY8SfQgjhAL4P3AIsBu4WQizu0+0WYH7q7x7gf0b6vjkhHoc//AEefxz0dNEDNm6EZ5+F//gP8PvhwQfT+1pboTK/Hu/m1RTh1ueCTH+dCe0kzZ2T6xG9KxRnS1P7gPujqcIVe093W207m7uI9Ympnl26aFTGN15s/HQDD/3NFUM6pq+GH9MOEi4QBSGR1GnuGHj9xYk+At8l6yeNhp+LzFGrgUNSyiMAQoiHgduBzOei24EHpWFj2CSEKBNCTJVSjk7mpk9/GkIhSCSM3DdtbeDxwLx58KY3wbRpsG4d/OQncDo1hDvvhP/7P3C74Wtfg+pquPdeQ7tft87Q+iMR41zTp5///ceYW5ZM4d5f+3DJ6bYMf682b+Gi2r8cx5Hllrt/vIm9p7s5fN+tOLT+Gno0kRZYPZG4VdgkLpps/eaW9dVHJjb1lQHqKwNDOubSqfaH7Lg4QXese4Dek4svPr6XB185xvZ/u7FfTWmAk732gAe3PlsJ/AzqgEzjXzPQt/5Xtj51QD+BL4S4B+MpgNraWhobG4c8oDU/+xlaPI50OEj4/SSKi9FiMXxPP43jm98EQApB++WXc+rjHydw/DhzfvxjWm66idO33cYl69Zx5MMf5vimTUybO5cFf/oTr/7f/0Hqg+3r6eFsYyPBYHBY4xsNPrrMw+/PLeS1zrTAX7ftCep7xjarJzBq12Xv6V4A1m9oxOPoL/APdaYF/jMbXsAsZBV32PMKaZ3ecfne8mm+AJQ66uhKnjQ2hORE5y4aGz1jPo6xvi5/2Gpo9+s3vkiVz27kaI+10xU7k26QTlyyjiMH36Cxx148Z7QZjeuSC4GfzRja11s4mD5Go5T3A/cDrFq1SjY0NAx9RK3pSj623+9YDLZtg9ZWxPLlVE6fjmWcWbCAmk9/mprGRpgzhznf+Q5zfD6oqYFvfYvLo1GYY6QwWHTjjSxqaKCxsZFhjW8UaAC8m3bz2tPp7IdBXyeLL72CN870cM2C6jEby6hdl6eeAGD1FVfZqoGZeA63waZNAKy87HISuiS54U/ERbpqEdLBX65+Kw2LZuZ+fBcgn+YLwKxdy9jRftLaDmvNNDTcO+bjGOvrIjc8DSRYsWo1c6uNrLfxpE44nuSF48/AK+m+bjkbgYuVlyylYVHtmI0RRue65ELgNwOZIQ/Tgb65eQfTZ/Rxu+GKAWyd994L9fWwfTt84hPgS6UjXrTIsNm/8IJhFoK8M+mY9I0tP9S+l4//ahtbjnWw8wtvPm+c9kQimlFk2t6e1vBjSZ1gNEFMs2v3LllPsWdo5o/JSn3pIna0P2ltdyePjONoxo5w3JgnmT6LTz70Ok/uPsMHbnrN1tetGytsJ4tJJxeu583AfCHEbCGEG7gL+GOfPn8E3p+K1rkC6Bo1+/1IeMc74MtfhqlT021CGHb/F16A5tRijLq68RnfBVhaY48tP9q1n45QGICdJ7rGY0g5Q89IBpcp2DPJ/CGIJXS6wnGifQS+R59vKxRSyMwpszuve/XCEPhmYkFT8AM8udsw42xq3mzr69GN6LeJWrS8LyMW+FLKBPAJ4GlgH/ColHKPEOKjQoiPprqtA44Ah4AfAx8f6fuOKddcA4cPwyuvGHnwx7j4yWCpDlQzpWiKtR3XY9RUGMnetp/oGK9h5YTMJGcDa/i67XV3OE5Ms9td3fp83I7JEWI3UhZV2vO7R0UTiWT2azsZCaU0/GTqB0Ai2Xp6i62PWzcWNNYUj71vYzTISX03KeU6DKGe2fbDjNcS+NtcvNe4cPXVxv/HHoObbx7fsVyAZbXLOBNMO526k4eBJbZQxYnI2e6I9ToSH0DDz2iPWQL/gK2PoeErgQ8wq2wWQvqQwngKlKKXA21HWVwz9wJHTg5Mk86hFqNsaVKcoy2cDmX2Of24pGGJrsjiM5qIqJk/GFZkpJO99dbxG8cgWFZjt+OfCRkCLzTBY6wzzTiD0fBjSZ1jXSdIinTcvpAuXLJeafgpir0u3PpsW9u2UzvGaTRjQ+bq83DcWGh2ot2I2okKu3KwpGY5AsP855wkc2ZyfIrRxumE55+H66837Px5TN8cMecixiSODSAkJwo2c018EAI/obPr3Cbbfrc+D4FTafgpijxGndtMdpzZOUDvyUF3JL2aOBwz5su5oJGKI+qwp9BePW312A1sjFAzf7BcfTWsXw9Tply47zjSN1KnPWbYsCe6wI/Z7POGtr/7ZBe3f+9F2swbNmE36ezveNV2Do9u2KyLPZPDATdSirzOfhr+ntbdA/SeHHSF0oWBTKetmXspotk/+7Wz7XUDJgNK4E8yFlUtwiHSUSi9yTPo9A5oBpkoZAr8SErDf98Dr7KjuYvNTYZDOlPzjyWTHAvaHXBefQnlfhc+t4rSAaMAukvOsrXtb5vcAj9TKQin6hmf64lS5Av1KVouuE4JfEW+43F6uKjqIltbTGua+Bp+0q7hx5M6HSltzcyLkvmjdjZ4ms54+gbWcODRF1Fb4h2jEec/xR4Xbt1u0jnWdYhoIjrAEROfzDliavgtPREcXns6hXLXfMp9RpLEO1bkZxj2cFACfxLS144fF002gTkRifUJuezNyOx4tLU31Z7W3na12s05s0uXouG38usowOvS0Ajg0GustqRMsvfcxK2l8J9P7mPWZ58YMDV4psA3AxnO9USJ9LHfT/MZuYYOfvkWvp5KQz4ZULN/EtI3UiemHZ/4Gr7NaZukJ9Jf4EfiupUyelvLs7bjV065CjBqCSgMzBTRNT57vda+xWImEj/aaCwey4xKe+NMN+v3Guk17KbBtIZ/NpaRTwGY4TfSR7sc2qSaM0rgT0KW1NgX1MTFsQFXp04UMp9QIgndEvg+l4NjbaZJJ0mJ14kkzo7W52zHXz3jBgCy5FwraLb+6w28d+VVtraJLPBNOsNp5+zt33uJDz+4he5I3HYfmD8Kp3sP0BVP53YUuJhTPPkidEAJ/ElJP4GvHSMy0QV+n7BMs1hHfaWfjpCxCjea0Cn2uohouwgn0gvNqvxVvGPpjQD8zdVzxnDU+U9lkYcVU+wmi10tuwboPXHoyLIy+6ndZ2zzKBxLktQlbfqLtmNLxApKvKVjM9AxRgn8SUh9WT0aaeekLnoIJ9rGcUQjp6/TNhg1NLi6Mh+hmOHEjcZ1vC4HEefLtmNvX3g7tSUBmr5yG7csnYrCTl8FYTJo+F0pDT9zhfb2E52W8C/yOAnHkwSjCUIO+3wp0q/E45yckVxK4E9CNKER0GbZ2npl04SucWtqZn63g2iGSWdamZHVNBhJEE0kcTri9Gr2G/hti942toOdYCysWohTS2dZOdF9gq7IxE6215mK4Np+otNq640mrHlU6nMRiiXZfHI78cyKaFLDk7h80i7Om5yfSkGJw76gJsYxK0vgRCSW0HFqAp/LQSTDaWsKfMM+q3M2/hxJkTbneB3FXD/7+nEZ80TB7XCzsHKhrW2ia/mmmW/jgXME3A7m1xQZAj+ZFvjRRJIfb/uB7TifXEoyUaw0fMXEotRlt1XHtWMTevFVLGFE4HicGtFE2oZfV54S+OEE4XiMN0L/aztuReXb8DgnR6bD0WSymHXM2vRd4ThSSja80cLV86sp97vpiSSsBHslPicd0ZP8bv+vbMcH4rcATJqi5X2ZnJ9KQaXbnvEwph2b0KGZsWRK4LsMk04wksChCSttbXckzt7gT+lJNKcPkg7eNOU94zTiicVkEPjRRBLTatnRG6MrHOd0V4RVs8op8jrpjaU1/CKPxt7wf5PQ09E8ld7p+HWjQNJkFfg5SY+syD+qvPNs23Fx3JY+eKIRS+i4NEG33MxTJ58j1NxMl0fjS68spNPp5Isv/pIj0YdtxxQlb2Racf0AZ1Rk0rd4zkSM1OnKCMXsDMc50dFD0PFnHtj3XY60nyAe99G6ZxadTh/rzx2iU99qO/7OeZ/i6c2GSJysRXKUwJ+klLpr0WQAXRiLkqQIc7TjGFPLLrrAkflJKBbiqPwSbaHnbe1PHNoJLnjmmL2/V6ugLP7+SWuLzTXZNHwppbU4ayLQHU4vxmvuPsEdv3kPbe49tGXU1nu1ZSu4oKvXfuyauqu5afY7eXqzkS3UO0k1/Mn5qRR4XQ5cffKk7GmdWFqbrkuklOhS54/Nn6ZNf/7CBwEabi4t/ncclOCdpNEWuWZ2+WycIh3K2xZu42zv2fMckX90RwwNP0kPT5z+KIc79wzqOIdezc9vfxC/O51FdbJq+OpumKS4nRouOdPWtu/cvnEazfB47wOv8q77N/HNV77JsdCLFz4AKHNPY235t/EkDI1VafiDQxMa1X3MgP/ypyd4/sC5AY7IPyKplbOdnu8RTJ4c1DGzii9lauyrzK+qx5+RRVXZ8BUTCo9T66fhH2ifOEmxDp7t4eXDbSRo58n2L9j2FWmzWV7ySVwOwbuu8PL5JzZwUW05h5qr+NvL3sG+U2He6O4BJu+NOxpMDczndDjtrP3D7k08t2MKTV+5bRxHNXjC8SRh7XWC2ku29tsX3s7CwLv52St7WVgX5GDbCS6fNZ1X36jhHYtv5snuMwghlMBXTFwCHifuPtWMDnZMHIHfuN/QLLudvyMYC1rtHq2Epd6vUiKmMLXYy0dWXcaD6+ezsryC400nCbi9eF1RusJGHLZ3kj6ajwYzihayrTW9HdOOwQTy84djSTpdv7S1lTgW8ug7HuV3W8/wiB5ghrsS3R3irXNns2PvXtp6Y5R4DVNO5lyZrPNmcv6MKSj2OPtp+E1dB0nqw7uDw7Ekv9vWPGardY+09qITIuh82ta+pvqjiGQl4XjSuikDHoe10MbjdOBzO4knZWpbTfHBMr9ikW3btgJ1ArCj5TVimj2v/RUVn8btcBPwGLpte28Mj1Oz5k5rMEpRap/5HybvvJmcn0pBkdeJg1I0WWa1xZIRjnQcGdb57lu3j394dAevHB6bnDxHW4NUVm1DirDV5tUquKz6HUQTSSKxJL7UTet3O61kWR6nhr8ANLXR4OaF9gyRcXEcycRZu7H++KO27UrH5cwtXQ6khXl7bwy3U7Oc+a3BGEVeY9/UsrTTerL6fpTAn6QUpx5T3brdcTvcBTWnuwzBm1kEejQ5cq6XdjbY2i4qfitFbj/RuE44nrRKFQY8DtpNDd+l2UoYTtacKKPBNXPm45DF1rYUURKiZULkYIomorx25glbW3HyNkp9bgBLqFsafkqgnwtGKU7tyxTyk3XeTM5PpbA0GlcfO/7wV1COXTx2bzTBqZ6TnOh9zda+uOxWPC4jtUI4btfw24Npk07AM/mdb6OBy+mg1jff1hYXTfTGBmcGbOmJ8I0/H7AKi4wl6w6uI5SREluTJejhZZT6DMUn4Dbuh4QuUxq+MUdiCd1myjGZrPNmcn4qhaW19LXj7z7XX+B3heM8u29wMdfJMUjA1t4bI+R8Hkn6vQJiAbX+uXicGrGkTiSVChkg4HZYQsnj1PC70zewXxUsHxI3zr/Mth3XjtHaM7gat4/vOM13nj3Ivz029mkZfrWrT06c5DUInJbAzxTqZk4mE/NpOBNl0smCEKJCCPFnIcTB1P/yAfo1CSF2CSG2CyG2jOQ9FYPDEvh9NPw9Lf0Xo/zTb3byof/dwon20AXPm1lLdrQIRhOENPs0Kec6PE6H7UY0TTf+jJvZ63JYmj9Aia//zawYmCtmLrdtx8QxWoODE/hmecknd5/J9bDOSywZ45nDz9jaAokGgLTA92Y6ZB22hVXFGfs+/CYjy2zmU+JkYqQa/meBZ6WU84FnU9sDca2UcrmUctUI31MxCAay4e9v28/Te47z7fUHrbZTKfv8YG7snjEQ+OeCnUQ1ewipJ7GagNthWznry9DwrX5OzabVl2TR3hQD079aWpOtPuz5MLOx6mOchvuVE6/QE+uxtsu91bilUafXMulkCHC3Q7PNo0zt/19uXcSOf3uz7SlxMjFSgX87YOaj/V/grSM8nyJHmJNYI0B9aVrLT+gJPvW7x/nm+gNs2N8CpIViZvKpgQiOktP2wNkenthpJD154cRGEOn38Yo6kvEa/B6nXcPPsOGbeJxaP41fMXj610M+STBmVI06fC7I4XPBbIcB6SI1meI+ntT59vqD/HZrc/aDcsBTh56yba+Zdh0iJdpMge9xOnClChqX+ly2eZGp4WuaoNQ/eZWEkf6M1UopTwNIKU8LIWoG6CeBZ4QQEviRlPL+gU4ohLgHuAegtraWxsbGEQ5x9AgGg3k7vlA8fdvNcM7gGOnsYgn2A/X8Yv3riNMeIj3GDf3Slh1wOvtkP91iPAXsO3SURuf5l60P57r81VNGNqtAe4Andv7ats+TWIGUcKa5ibA77Tw+cmg/jb2HOdOc/qHas3M7XbH0Z8+n7yef50sm1Z5qzkVTKRVEkvVbnsLfOt/6jn5+cyDrcQcOGY7zeCJpfc7njsd5cG+Map+gsucQUkreaNe5qEKzErON9Lr8dsdvbdszknMxDZeH9u4gcdIQ7m5NEk9CT9sZtm9JrzBrPnqIxnif7Ht5wGjMlwsKfCHEemBKll2fG8L7XCWlPJX6QfizEOINKWXWTFipH4P7AVatWiUbGhqG8DZjS2NjI/k6Pl2X8Ow6AN689M282JjORdPNUXxAefUUGhou4cnWnWw5e4LK6XNoWDs36/m+teclaOukvGYqDQ1Ls/YxGdZ1ecoIqbv6mrUc3vwB2y53YiUASxctpNzvgl2vA7DykqU0LK6l2XuMR/YbjsI1l19mxORvexUgr76ffJ4vmaw8udKmNcvKKNMXr4SnjFs28zPoukQIEELwWuQNOHSYpIS1a9cihOCVJ/cBR6irKqWh4Sp+uekYX928m/95z6VWfeGRXJezwbMc3Hgwo0Xw4ev+hqfeMET+9VevYUaFHwDvC3+mNx5j2UVzWbtyOmxcD8Bly5fQsCT/ah2Pxny5oElHSnmDlHJJlr/HgLNCiKkAqf8tA5zjVOp/C/B7YHW2forcoWlpTXjF1BW2fV2JAwBW+Jwj9ah77jzRGKazNjjKNvy9Z4/QEjpubTuEC69u/MAE3HanrWmH7RuG6VOROSOib278Qx27efGgoRH3zT4651/W8dc/3wykTTq6xFrpbKYsNufasTbjKaGp7cIBAoPh+WN2vbHcuZAlU2ewqr6c+TVFVBenq52ZxU/K/X1NOpPXhNOXkZp0/gh8APhK6v9jfTsIIQKAJqXsSb1+M/DFEb6vYhB86ob5rJhZzrwpMVt7TDQhSRJO3YTRuHEjnM9pawr80Y7S2XDUfgPPKb2EWMhYAel3O7M6bW02fJeDwASu3ZsPrJy60rZ9qHOHVUO4yNNfOJp5jzJLaEYSSdxOje6UX8jc59CM7y+p52YF78Y+An+qbyVel4PffOzKfn3jKYFf5nfbHP2FFLo7UqftV4AbhRAHgRtT2wghpgkh1qX61AIvCiF2AK8BT0gpn8p6NkVO+dQNC1i7oJppxdNwiTKrXYoocXGScCr6Ipow/p9Pwzejc0bLaWvycrM90+HSqvTDYMDTV8M3XvfNgeJTjtoRcVmdPRa/qXsXobghuGOJdMRO3wVWmSU0zX1mjnpz25l68kzk6Ee5scku8Gf4VwzQExKpp44ynwshBD9870oqAm7qK7P7JCYjI9LwpZRtwPVZ2k8Bt6ZeHwEuGcn7KEaGEIIy5wLOxdMrVz3+JsLxZUD6Rs3U3h/bfpKfvtTEbz+6BocmrH2jHZa5+fTLtu1VU69ka6pui9/ttAQGpOPw+wr8iVOjKT+ZXTabSl8lbWEjb1Ik2cvJnsOAZgvR7KsgmCYTSD81mhq+ZT5MfX+5CN3sinSxr9W+yGtWycoBeqd/ZMoDRrqFm5dM4eYl2dyTkxe10rZAqHDZSxs6PAczNHzd9h/gS0/sY8eJTp57o4VIXMe8P0fTpJMkyNHON6xtgeCaWW+ytgMehy3HianJL55WYrV5nA7LxKM0/eEhhGDVNPtymaYeo/RfQpeWgtDXBBjNov13WQLfOMZcqR1Njtyk80rzK+gyfR6XPpNyb8UFjyubxGGXF0IJ/AJhqs/+kNWl70nb8FM3auYj+YLaIgDW7Tqd9UbOJWZyrpi2z5ZOYUnNEhZUpzWwgNtpJb0CqC0xbPsuh8Zls8pTrwVel8bHGuby64+uyflYC4XLptnNOieCaU3aVBT6afgZ8ydsmXQS1raU0npC6MmBafDBrXbLsEdfTHWRZ4DeacpSCdUKkcm5nEzRj2k+e+RFW/QQQYexOjGbht/aYzh6u8Jxq93lEKMi8K0fnj65zN80801UBtI3p8/tsOywF00ptswDAL/68BW09ESs2O5/unliFmvPF/ra8U+Hd2MmDw7FE5TiojVoDwawOW3jOlJKusJxhAApSSW9MwR99yAW+Z2PY229/H5PI2Q8xHn0xcypLhrwmAc+sIrfvX7SSgFRiCiBXyCUeSvxi5mEpBHyKNHpiO8F3mLZWzNtsGe6jcVYoVjS0txKvK5RseGbjuCodsDWfsX0K2zhpQG3E5/bwX+9fRlvXlxr6+t2akwv9+d8bIXK6jp75HRLZB/TCaPhozfaX8NPJHWiCR2nJkjokkg8SSiWJKlLppR4OdMdIRrXrWNHquGf7Q4T1Q7a2jz6QuZUD+yAvX5RLdcvqh1wfyFQuD91BYbHpVEkFtvaunRjcYppsommNO1IPGnZXkOxpKW5lfhcxBJ6znOl9EQTSCSxPgK/r9AxQzLfuWoGZf7CfSwfC6YUTWFB5QJrW5K08huZJh2zyhhAb0oxMJPVZc6h2hLDzBJJJC2Tjhm9M1y2ndqLFOlYfk0GcMppzKoqnIib4aAEfoHgdTnwSnsJu7DYQzylmUFawz/TFbH6hGKJtIafupnNfifaQ/zkhSMjLpARjCRIiNPoIp2nxa0V2QQOYJlrFGPDtbOutW1HNCNcKhRLRWxlaOnBaIJoQrdy10QSuiXUq4sNY5Ch9fc/djhsObXZtl2iLUIgVLK8C6AEfoHgdTpIhO0CNKrtoS3UY7PhSylpST2qTy31GiadpGnSMSyAph3/3l/vMKJ5mrtGNLZgNNFPu6/zX4wmjOl556XTbeGYirGhYVaDbTvuNBy3ppaeGbEVjCSIJZK2OdIVsmv44XjSqlswUhv+ntZttu0PXX4jz/3j2hGdsxBQAr9A8Lo0nHI6Dj2d306KGM8d2ZDOciiNsLv2VH3Y6eU+y4YviRPXmmwLtkw7/592nBrR2MKxZD/7fX1xOqro6++8hEP33Tqi91AMnbX1dgEaFgfQCVkCPzPNRjBqOPfNp8DOcCdbT28jQSs1loavE46lo3ZGwtHuHfaxzlpzXoetwkA5bQsEr8uBQODTVxLUnrTanz78JNHEW63taEK3bLN1ZT5eP9HGT3Z8nRPeb3P8eC944cqf/xdfu/EbnGg3QiR2NneOaGzRhE5M2AX+3DK1Vm+8mVo8lRJHPd1JM5OkTljbRih2BWAI/GKPk55ogp6IYfrzuMO0ub7DxzdsICnj4IMf7l1NXPw1kXjSctpmRvQMlWgiyrmIPaKrb1SRIjtKwy8QTIenL2lfULOh6RkiGY/isQyBX1MqOOW4jx/vuA8peq1jmroO887fvJVu7Vlqij0EoyPT1npjEaLaYVvbRRUDL5FXjB11PvtahpDjRZuGX1tqaO+90STBxFkeO/lhgs5nDGGf4o2O1zjtuZedZ1+3NPuROP93nN2BTvrpYmbpTKYUFdaK2eGiBH6BYEa1ePVLcDvSES4nepqI0WRlDIwldDp6Y3hckocOf4qwY1PW80kk7e7vMrfu7IhX3x7q2AsiLSAcspIpRdNGdE5FbphffKNtO+zYTHvYKBYejCSoKjLm0tngWQ7Je2mNHu53DgApevnXFz5Ad7TTaosNc7Xtayftxe37RnMpBkYJ/ALh6vlVAGh4uW72dbZ9vY7nLNtrNJGkIxSn2/0zdrdttPVzafZVjJIEjS330Ru1L8AZKm+0v27bdusLCiqDYT4zo2g5HpGOXZciyrazzwKG07Yy4EES57+23ENc2GvZujSfbftc+BRnxf9SnMp9ZK7/GCr9BP40JfAHixL4BcLU0vTN975l77PtCzrX43Ob2RB1Np15lDP672x9XPpMfnjji1TFPm1rPxPey5n4CwDsPdXN7H9+gpbQ0G7kQ53bbdseJfDzBq/LQaV2ja3tpTMPI6UkGEtQ7nfR5voB+zvsYZLzi6/jY/Mbmeq4w9YedDyF22MkZctM2TEUlIY/fJTALyBe/ux1vPCZa3nrRW+lxF1qteuihxNxQ8D/+ehTvNz+Vdtxxc5aaqNfZk75TALJtVxc9mbb/lbxa+KJJA+8eBQpYU/r0G7ko132iAu3vgDfJC0iPdFwOzUCyQZb29Ge13jmUCNSwpaOH9Pr/LNtf7njUq6tuY/eqMbFgY8xu2xOeqdI0iqMuTYcx21npJP9bWmHrSY0Vk4bOEOmwo4S+AXEtDIfMyr8+F1+3rPkb2z7tnc+QIfzp/zD+g8gSQtsIT3cWPt1HJRbZp+53r+2HRvTDvDMkQ00dxgrH/2uwcfM90R7OBvOsPtKgUefpzT8PMHj1EhE6vEkl9na73n8g7S5vsfTJ75ra6/x1XN56ZcIxwTdkTgV/iI+feVnbX1Oxp4gSfeQNfxjbb387+ZnbW2LqxdT5FbhmINFCfwC5WOrPokm0zdKQkbodv2OaDJstQkElbF/wJE0NDRzFWNrRw2+pD0M7n82f5/mDuPYSGLw0RebT222Zch0yjo0Aiq1cZ7gcznQJZQl3m1rP97dRNBpz1apySLuXfkAFb5ygpE43eE4JT4X71/2XhwynbY4SYRe53orZfJgWfu1Rr7wtL2onrLfDw0l8AuUKUU1lMc/fN4+/3b11wnoV9GZCtMs8RlmlpOdYaY732Xr+8yRdTR3GSWNw0MI2nm1+VXbtkc3slyqurT5QSDlYPXqS7h+5rsH7OcUHqpj/49ZpQsIuJ30RpN0huKU+VwEPD5Kk7fb+gcdzw3LpBPV3rBtXzH9iiGfo5BRAr9A8bg0ipI3cGlZFqEvndw9/4t8eMVHAOgMxdGEka3SpL5oJfMq5lnbcT1GUDOct+EhaPibTtrDPj36QqCw6ozmM5m1Xz+2/MvUea/q18dBKddWfQuvvgiPy0GRx0kwmqA1GLWKiFeKGxAZ4iauNbH73I5+5zofEtkvhfbl0y8f0jkKHSXwCxRPKif4At+HqI1+havr7sSbXMGNMz7ItOj3uXXO+63KUZ2hOB6nw6ohC1BV5OX9y95vO2fQadhXB2vSkVKyqXkAge9STtt8IJBRPrLC7+fmKd9gme/zrJl6K77kKj61+vMsdfwUnzTqLbgdGkVeJyc7wyR0aQn8gLOKGrfd/PL4oYcHPQ5dlyTEGXTRbbV5HX4urr54JB+v4FACv0BxO4yvvjsSx6sv4TOrv0Nt7D+4Ydqncck6ir1OS8uOJXXcTg2HJnA5DIdsRZGb911iD++MafuJizOEB+mLa+psoqW3xdr2Of24ZL3xWmn4eUGmwC/xuijyuCjlWj646LvUxL7AF9Z+noCrjJ5UZkyPS7MdYwp8j9NBlbAv4tpw7DF0qZPQJftOd3M+WnujxPpo94uqLsWhqXkyFJTAL1CEELidmpWm1lxp25aqYlTideFxaphJKs0qQabjtjLgZlbZLFZN7b/0frAmnb7a/eKqSxE4cGiioKsS5RN2ge/E53YSiiVpDcZwOzRKfE7bPPI4NFtReTNxmsel4UmsRkivta8tcoaXT7zMk0fj3PLtF9h9cuCsq6c6I/3MOctrVg3QWzEQ6q4qYDxOzcpZXpzKpWMWpi7yOhFCWHZ784mgvtKoKlUZMDS3Oxa+3XbOkOOlQTttXz1pd9heU7+GS6aX8htVizZvyLThF3td+N0OQjHDPl9Z5EYIgcfpsDR8t1OzHWNq+G6HRijqxJe0m3Ue3fMoZ3oNBeHlw62AUej8Zy8dtbKyApztjvRz2F46VUXoDBUl8AsYj9Nh5SW3Qi5TqZHNHwDTtGLa/M0buCJg9H/nxW8HmY67j2kH6YgPLl1yXw1/7ayreOwTb2LFzPJhfR5F7snU8E0zXziepKUn7ZB1OzUrxNLjdGQ36bg0wvEkgeSbbOf/zd7fIDCOfemQsQL38Z2n+Pc/7eU7z6VLGLYGe4iJI7ZjV9cph+1QUQK/gPE4NcyEhWalopZUjnvTxGPevKaJparIuIHNkLo5FTPw6PbSiSfjL17wvaOJKK+fsefQUREX+UemecbvduB3O5ESTnaErLngyTC/uZ12k4752uM0FAevvhK/M73+43TwNEfCRqnNk53GOo6OlNLRk1EGcc+5HSDSGr9Dr6W+TCXYGypK4BcwmTeq322E051OlTc0b1RzAZQp8O9YUQfA6tnGQhpNE5QLe66VFv2FC773ttPbiCXTSdeKnVNVits8JDM8VghhbR9vD1mZMjPnkcepUVNi2Ok/eNVsWzuAhofrZt1ie4+jUSNJn2nCiScNLcTtSL/33rYttmM8+kLl2B8GIxL4Qoh3CCH2CCF0IcSAHhQhxM1CiP1CiENCiM8O1E8xtrj73KjZNLOAx27SWTWrgqP/eSvLppdZfWtda21mnbA4xJEO++N3XxqbGm3b0/zLsndUjCuZ5hlIm/jiSWkl5Our4V86s4yNn27g83+RrqGc2efORXa/T6v+MpKklSvf/G9GhAHs6+gbvnuRWo09DEaq4e8G3gY8P1AHIYQD+D5wC7AYuFsIsXig/oqxw5O6YRyawOnQLLt9kceJIxWeYyYxM5200L+YeLm3Fo9uj4d+dM+j1us/7z3LLzcds+1/8uB62/asIuWAy0c8faKl6iv81usldUYCPncfgS+EoL4yYJsnpkkH4Ka5NyFkOntrQrQT1fZZBc7NEpum2TChJ2jq2WobR7ljOS6HMlAMlRFdMSnlPinl/gt0Ww0cklIekVLGgIeB2y9wjGIM8KRuGPOmzhT4JmbEhVmIOhsBj6OfM+6R3WmB/zcPbuFf/2AUwO4MxbjxG+vZdPJlW//5pWqJfD7S98f9khll1usldSWAXZj3/YEwyfxRKPMVUYL9+3YWvUokblTBMiPFzICC10+/TkwPWn01WcKM4oXD+DSKsVjOWAecyNhuBgb0zgkh7gHuAaitraWxsXFUBzcSgsFgXo/vQvT2GE4yIZM0NjYSDxn2e7eMWZ/r3Dmjrbf1FI2NrVnPEw+F8Sevol3+CIRhf91+9nV+9eSvqPPVWf0aGxvZ3ZpkV+tW4p6I1e6QlSTaHRP6Wg6GiT5f+o79jW2b2C8EbeeiVtuml1/EpfXPltrRmu7zykvPUyavoktssNraEo3U8Ff8+blGDjcbc+NI8xkaGxt56PhDtnN59aW49eiEvpaDYTTmywUFvhBiPZDNm/Y5KeVjWdr7nSJL24Arc6SU9wP3A6xatUo2NDQM4i3Gh8bGRvJ5fBfil8c2s6ethSKfh4aGBn5zahu7Wk8zZ1olDQ2GieWBw6/C2VauWL6YhpXTs57nwabN7O/Q8cklhMUuq/1E8QnuuvLd8NQ6AK6+Zi09u04T2f4z2/He5DKWLJxLQ8M8JjMTdb6s3v8KS6aV0tBgWGLXLeimrTfK1fOrAXiuazfPNxsmuxuubej3VACwvnMXL5w8jlMTXHfttczcEudU2E9cGim1I7KDqLaXVVf8fyR2bgKCuItKaWhYw1d/Za/P4E0uY860GhoaJnce/NGYLxcU+FLKG0b4Hs3AjIzt6cDgArUVo4r5mG0+kpuhmLXF6dWQwVS92iklXgbCdOyVa2sJkxb4j+55lPcv+Xtruzsc51xPlLDDXrHIqy+14rUV+cejH7EvhFs8rcS2bS7KM+332TDnmDnnKvwB6riaptDTVh+jQPon6UyZcrrDcYKxYD8Hv1dfplZiD5OxuGqbgflCiNlCCDdwF/DHMXhfxQUwb0LT7mra62sy7PXmkvnKIjcDUZSK5JniugZNpKfU62de5+Wm3dZ2ZzjOgdajxLSDtuO9yZVK4E9gPK6U4nAeJ6o5x0xBXeZ3Ue1Ya+vT63iJ3miMSCpKpyeSYN3BdUQSafNftW8GTjkdZxazkeLCjDQs8w4hRDOwBnhCCPF0qn2aEGIdgJQyAXwCeBrYBzwqpdwzsmErcoF5E5o3bCxpREWU+dPC/cq5lQDUnkfDN7NqVvlqWTnFnj73D/t/a73uDMV49cyT9jEkF+GkkuoiJfAnKma8vNMxsBA2lQunlhL4Pheu+Ao0mY760UUnL514ySpu3h2J89t9v7Wd57LamxGI876XYmBGGqXzeynldCmlR0pZK6W8KdV+Skp5a0a/dVLKBVLKuVLKL4900Irc4Olj0jEXvmQutvnX2xbzwmeupSIwsIZvmnTmVAd468I7bfs2nPidVdGqMxxnb4c9HNOvXwnYnyoUEwtvSmFI6gMnzetrginzuznZkcSXtMdvPHbwYUvx6I728sSBJ2z7P7zybgDuXj1zxOMuRJQhrIAxb0LTBmvG3meGZbqdGjMyYq+zYT5dz6zwc+eit4FMT6tTvQcJa8Yqyf3nDtESsxe98CUN+3BmnL9iYjGtzIip744MnDWvb7hmmd/wF/n7hPM+eeRRErRRVeQmpG2iN95r7avyTeH2i9fS9JXbVL6lYaIEfgEzv7YYwEpL+5mbL+Ij18zh5iVDS3FwKpUDZXqFn9kVdfh1u5Ov2/UIEsnvDvyYzACty6Zdhksa7+VQNtkJy+yqwAX7mFlZF0015lxZKneTT19JtbvW6pfQY3Q7f09lwE230x4E+LaL7rT5iBRDR129AuYvlk0FjHw4ABUBN/9866Ihr2C8cm4VAGvmVOJ2alQm32nbH9XeoMv5CM81/8rW/vHLPs7qWRWUeFV1q4mMmTL7fKyeZeRe+vxfGKGdpp9I4OTumXfZ+gad6zjDL4lpB2zt/9+Vn8jFcAsadacVMH63k998dI31eD1cbl8+jRsX11q2fC05F19yFWFHOuFVl+uXttUXdcV13LXkLj5wiTLlTHTMcN7zceW8Ko7+561W2KY55yoDbm6beisPn36Elt4zAEgRY2f3T2zHzy1ay0VVF+V45IWH0vALnFWzKphXUzyicwghbEm2FpZrLC36GMiB9Yn7rr8Pr9OLEGLA2G3FxMJMsT0Qmd+z6Te6Ym4lbs3NFxvOE8shHfzi7d/OyRgLHSXwFTnnM5d52fTpv2ax75NZ96+ZejvvW/a+rPsUE5Pd/34TL3/2ukH3Xz27gn+8cQH33WEUP//Qir8ikLg+a9/p2kdYU39JTsZZ6CiBr8g5Ds3Q2v96+T1UxT5NsTPlmMVPSfzt/MPKbymtfpJR5HH2S6V8PpwOjb+7fr71VOB0aEyVn2Kh/68Rqdh8h6ykMvYpVlTcPSpjLkSUwFeMGh9802zmF93EY3du5621TzE38RDlib+i1Oe78MGKgiPgdjNVvJ8ZkYd54u1vUBf5GUXJG5hRfmGnsGJwKIGvGDUqAm5e/ufrufaiWip9FUTjxoIus6iKQpGJz+WgIxRDoDGzbAoep/HEML1cKQi5Qgl8xZgQyFJNS6HIxOd20Bky4vW9Lo1YqgBKfeWF4/wVg0MJfMWYkCnwh2LrVRQOmSULM4uqDHUhoGJg1J2nGBOKlYavuACZOZw8Lo2PN8zFoYnz5nFSDA115ynGBKXhKy6EN0PD97ocfOZmtdAq1yiTjmJMyBTyfpdy2ir6k6nhe51qjowGSuArxoSijMgcTSVKU2TBtOELAS6V735UUAJfMSb4UkVSzlcqUVHYmHPE63SohXmjhBL4ijHBndLY3remfpxHoshXTA3fLKiiyD3Ke6YYE25cPIUHPrCKaxfWjPdQFHmKacNXUTmjhxL4ijHBoQmuX1R74Y6KgsWXEvhVqr7xqKGenRQKRV5gmnRGWp9BMTBK4CsUirzAmfLzlPuVSWe0UAJfoVDkBV2pPDplSuCPGkrgKxSKvCCeNJKl1RQrG/5ooZy2CoUiL/jwNXOIJHTeffnM8R7KpEUJfIVCkReUeF38y62LxnsYk5oRmXSEEO8QQuwRQuhCiFXn6dckhNglhNguhNgykvdUKBQKxfAYqYa/G3gb8KNB9L1WStk6wvdTKBQKxTAZkcCXUu4DVN4LhUKhmAAIKeXITyJEI3CvlDKruUYIcRToACTwIynl/ec51z3APQC1tbUrH3744RGPb7QIBoMUFRWN9zDyDnVdsqOuS3bUdcnOcK/Ltddeu1VKmdXEfkENXwixHshWY+xzUsrHBjmGq6SUp4QQNcCfhRBvSCmfz9Yx9WNwP8CqVatkQ0PDIN9i7GlsbCSfxzdeqOuSHXVdsqOuS3ZG47pcUOBLKW8Y6ZtIKU+l/rcIIX4PrAayCnyFQqFQjA6jvvBKCBEQQhSbr4E3Yzh7FQqFQjGGjDQs8w4hRDOwBnhCCPF0qn2aEGJdqlst8KIQYgfwGvCElPKpkbyvQqFQKIZOTpy2o4UQ4hxwbLzHcR6qABVq2h91XbKjrkt21HXJznCvS72UsjrbjrwW+PmOEGLLQN7wQkZdl+yo65IddV2yMxrXRSVPUygUigJBCXyFQqEoEJTAHxkDLiArcNR1yY66LtlR1yU7Ob8uyoavUCgUBYLS8BUKhaJAUAJfoVAoCgQl8IeJEOJmIcR+IcQhIcRnx3s8+YAQ4qdCiBYhhFpJnYEQYoYQYoMQYl+qfsTfj/eY8gEhhFcI8ZoQYkfquvz7eI8pXxBCOIQQrwshHs/leZXAHwZCCAfwfeAWYDFwtxBi8fiOKi/4OXDzeA8iD0kA/yilXARcAfytmi8ARIHrpJSXAMuBm4UQV4zvkPKGvwf25fqkSuAPj9XAISnlESllDHgYuH2cxzTupDKgto/3OPINKeVpKeW21OsejBu5bnxHNf5Ig2Bq05X6K/goEiHEdOA24Ce5PrcS+MOjDjiRsd2MuoEVg0AIMQtYAbw6zkPJC1Kmi+1AC/BnKaW6LvAt4DOAnusTK4E/PLKV+Cp4zURxfoQQRcBvgU9JKbvHezz5gJQyKaVcDkwHVgshlozzkMYVIcRfAC1Syq2jcX4l8IdHMzAjY3s6cGqcxqKYAAghXBjC/ldSyt+N93jyDSllJ9CI8gFdBbxFCNGEYSq+Tgjxy1ydXAn84bEZmC+EmC2EcAN3AX8c5zEp8hRhFH1+ANgnpfzGeI8nXxBCVAshylKvfcANwBvjOqhxRkr5z1LK6VLKWRhy5Tkp5XtzdX4l8IeBlDIBfAJ4GsMB96iUcs/4jmr8EUI8BLwCLBRCNAshPjTeY8oTrgLeh6GtbU/93Treg8oDpgIbhBA7MZSoP0spcxqGqLCjUisoFApFgaA0fIVCoSgQlMBXKBSKAkEJfIVCoSgQlMBXKBSKAkEJfIVCoSgQlMBXKIaAEKJMCPHx8R6HQjEclMBXKIZGGaAEvmJCogS+QjE0vgLMTS2e+tp4D0ahGApq4ZVCMQRS2S4fl1IWdJIvxcREafgKhUJRICiBr1AoFAWCEvgKxdDoAYrHexAKxXBQAl+hGAJSyjbgJSHEbuW0VUw0lNNWoVAoCgSl4SsUCkWBoAS+QqFQFAhK4CsUCkWBoAS+QqFQFAhK4CsUCkWBoAS+QqFQFAhK4CsUCkWB8P8DynQnAFEfmOgAAAAASUVORK5CYII=\n",
- "text/plain": [
- "<Figure size 432x288 with 1 Axes>"
- ]
- },
- "metadata": {
- "needs_background": "light"
- },
- "output_type": "display_data"
- }
- ],
- "source": [
- "#!python\n",
- "\n",
- "from numpy import cos, sin, pi, absolute, arange\n",
- "from scipy.signal import kaiserord, lfilter, firwin, freqz\n",
- "from pylab import figure, clf, plot, xlabel, ylabel, xlim, ylim, title, grid, axes, show\n",
- "\n",
- "\n",
- "#------------------------------------------------\n",
- "# Create a signal for demonstration.\n",
- "#------------------------------------------------\n",
- "\n",
- "sample_rate = 100.0\n",
- "nsamples = 400\n",
- "t = arange(nsamples) / sample_rate\n",
- "x = cos(2*pi*0.5*t) + 0.2*sin(2*pi*2.5*t+0.1) + \\\n",
- " 0.2*sin(2*pi*15.3*t) + 0.1*sin(2*pi*16.7*t + 0.1) + \\\n",
- " 0.1*sin(2*pi*23.45*t+.8)\n",
- "\n",
- "\n",
- "#------------------------------------------------\n",
- "# Create a FIR filter and apply it to x.\n",
- "#------------------------------------------------\n",
- "\n",
- "# The Nyquist rate of the signal.\n",
- "nyq_rate = sample_rate / 2.0\n",
- "\n",
- "# The desired width of the transition from pass to stop,\n",
- "# relative to the Nyquist rate. We'll design the filter\n",
- "# with a 5 Hz transition width.\n",
- "width = 5.0/nyq_rate\n",
- "\n",
- "# The desired attenuation in the stop band, in dB.\n",
- "ripple_db = 60.0\n",
- "\n",
- "# Compute the order and Kaiser parameter for the FIR filter.\n",
- "N, beta = kaiserord(ripple_db, width)\n",
- "\n",
- "# The cutoff frequency of the filter.\n",
- "cutoff_hz = 10.0\n",
- "\n",
- "# Use firwin with a Kaiser window to create a lowpass FIR filter.\n",
- "taps = firwin(N, cutoff_hz/nyq_rate, window=('kaiser', beta))\n",
- "\n",
- "# Use lfilter to filter x with the FIR filter.\n",
- "filtered_x = lfilter(taps, 1.0, x)\n",
- "\n",
- "#------------------------------------------------\n",
- "# Plot the FIR filter coefficients.\n",
- "#------------------------------------------------\n",
- "\n",
- "figure(1)\n",
- "plot(taps, 'bo-', linewidth=2)\n",
- "title('Filter Coefficients (%d taps)' % N)\n",
- "grid(True)\n",
- "\n",
- "#------------------------------------------------\n",
- "# Plot the magnitude response of the filter.\n",
- "#------------------------------------------------\n",
- "\n",
- "figure(2)\n",
- "clf()\n",
- "w, h = freqz(taps, worN=8000)\n",
- "plot((w/pi)*nyq_rate, absolute(h), linewidth=2)\n",
- "xlabel('Frequency (Hz)')\n",
- "ylabel('Gain')\n",
- "title('Frequency Response')\n",
- "ylim(-0.05, 1.05)\n",
- "grid(True)\n",
- "\n",
- "# Upper inset plot.\n",
- "ax1 = axes([0.42, 0.6, .45, .25])\n",
- "plot((w/pi)*nyq_rate, absolute(h), linewidth=2)\n",
- "xlim(0,8.0)\n",
- "ylim(0.9985, 1.001)\n",
- "grid(True)\n",
- "\n",
- "# Lower inset plot\n",
- "ax2 = axes([0.42, 0.25, .45, .25])\n",
- "plot((w/pi)*nyq_rate, absolute(h), linewidth=2)\n",
- "xlim(12.0, 20.0)\n",
- "ylim(0.0, 0.0025)\n",
- "grid(True)\n",
- "\n",
- "#------------------------------------------------\n",
- "# Plot the original and filtered signals.\n",
- "#------------------------------------------------\n",
- "\n",
- "# The phase delay of the filtered signal.\n",
- "delay = 0.5 * (N-1) / sample_rate\n",
- "\n",
- "figure(3)\n",
- "# Plot the original signal.\n",
- "plot(t, x)\n",
- "# Plot the filtered signal, shifted to compensate for the phase delay.\n",
- "plot(t-delay, filtered_x, 'r-')\n",
- "# Plot just the \"good\" part of the filtered signal. The first N-1\n",
- "# samples are \"corrupted\" by the initial conditions.\n",
- "plot(t[N-1:]-delay, filtered_x[N-1:], 'g', linewidth=4)\n",
- "\n",
- "xlabel('t')\n",
- "grid(True)\n",
- "\n",
- "show()\n"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "9513b663",
- "metadata": {},
- "outputs": [],
- "source": []
- }
- ],
- "metadata": {
- "kernelspec": {
- "display_name": "Python 3 (ipykernel)",
- "language": "python",
- "name": "python3"
- },
- "language_info": {
- "codemirror_mode": {
- "name": "ipython",
- "version": 3
- },
- "file_extension": ".py",
- "mimetype": "text/x-python",
- "name": "python",
- "nbconvert_exporter": "python",
- "pygments_lexer": "ipython3",
- "version": "3.9.2"
- }
- },
- "nbformat": 4,
- "nbformat_minor": 5
-}
diff --git a/simulation/QAM_Fading/qam_fading_V2_eigerner_block.grc b/simulation/QAM_Fading/qam_fading_V2_eigerner_block.grc
index 1ba7d1c..23cb577 100644
--- a/simulation/QAM_Fading/qam_fading_V2_eigerner_block.grc
+++ b/simulation/QAM_Fading/qam_fading_V2_eigerner_block.grc
@@ -808,9 +808,10 @@ blocks:
parameters:
affinity: ''
alias: ''
- amplitudes: '[0.2,0.2]'
+ amplitudes: '[0.2, 0.2]'
comment: ''
- delays: '[sps+1,sps+1]'
+ delays: '[4,4]'
+ los: 'True'
maxoutbuf: '0'
minoutbuf: '0'
states:
diff --git a/simulation/QAM_Fading/qam_fading_block.py b/simulation/QAM_Fading/qam_fading_block.py
index 8186175..5622e69 100755
--- a/simulation/QAM_Fading/qam_fading_block.py
+++ b/simulation/QAM_Fading/qam_fading_block.py
@@ -491,7 +491,7 @@ class qam_fading_block(gr.top_block, Qt.QWidget):
self.plots_grid_layout_0.setRowStretch(r, 1)
for c in range(0, 1):
self.plots_grid_layout_0.setColumnStretch(c, 1)
- self.fadingui_multipath_fading_0 = fadingui.multipath_fading(amplitudes=[0.2,0.2], delays=[sps+1,sps+1])
+ self.fadingui_multipath_fading_0 = fadingui.multipath_fading(amplitudes=[0.2, 0.2], delays=[4,4])
self._fading_1_range = Range(1, 30, 1, 2, 200)
self._fading_1_win = RangeWidget(self._fading_1_range, self.set_fading_1, 'Fading', "counter_slider", int)
self.params_grid_layout_2.addWidget(self._fading_1_win, 1, 0, 1, 1)
diff --git a/src/gr-fadingui/grc/fadingui_multipath_fading.block.yml b/src/gr-fadingui/grc/fadingui_multipath_fading.block.yml
index e116467..1d374ac 100644
--- a/src/gr-fadingui/grc/fadingui_multipath_fading.block.yml
+++ b/src/gr-fadingui/grc/fadingui_multipath_fading.block.yml
@@ -12,12 +12,19 @@ templates:
# * label (label shown in the GUI)
# * dtype (e.g. int, float, complex, byte, short, xxx_vector, ...)
parameters:
-- id: amplitudes
- label: Amplitudes
- dtype: raw
- id: delays
label: Delays
+ dtype: complex_vector
+- id: amplitudes
+ label: Amplitudes
dtype: raw
+- id: los
+ label: LOS/NLOS
+ options: ['True', 'False']
+ option_labels: ['LOS', 'NLOS']
+ #default: 'False'
+ dtype: bool
+ #hide: ${ 'none' if los == 'False' else 'part' }
# Make one 'inputs' list entry per input and one 'outputs' list entry per output.
# Keys include:
diff --git a/src/gr-fadingui/python/multipath_fading.py b/src/gr-fadingui/python/multipath_fading.py
index 01f2dbe..02b3bb4 100644
--- a/src/gr-fadingui/python/multipath_fading.py
+++ b/src/gr-fadingui/python/multipath_fading.py
@@ -44,45 +44,74 @@ class multipath_fading(gr.sync_block):
self.amplitudes = amplitudes
self.delays = delays
self.temp = [0]
- # if los:
- # self.amplitudes.append(1)
- # self.delays.append(0)
- self.los= 1
- #self.fir =
+ log.debug(los) #TO DO: True False unterscheidung
+ if los == True:
+ self.los = 1
+ log.debug("Los True")
+ else:
+ self.los = 0
+ log.debug("Los False")
+
+
+
+
def work(self, input_items, output_items):
"""example: multiply with constant"""
inp = input_items[0]
oup = output_items[0]
- if len(self.amplitudes) != len(self.delays):
+ if len(self.amplitudes) != len(self.delays): # Test: Es muss gleich viele Werte für Delays und Amplituden haben.
raise Exception("Amplitudes and Delay length dont match")
+
+ #TO DO negativ check
+
+
+
# raise Exception("Delay length can't be one")
#if np.min(self.delays)<=1:
# raise Exception("Delay length can't be one")
- max_len = np.max(self.delays)
- sum_x = np.zeros(max_len)
- for(a,d) in zip(self.amplitudes,self.delays):
+
+ #max_len = np.max(self.delays) #Max Werte herausfinden für länge
+ #sum_x = np.zeros(max_len)
+
+ max_order = 2 * np.floor(np.max(self.delays)) + 1
+ max_samples = np.arange(0, max_order +1)
+ max_len = len(max_samples) #Für Filter
+
+ sum_x = np.zeros(int(max_len))
+
+ for (a,d) in zip(self.amplitudes,self.delays):
# if d-1 <= 0:
# x = np.concatenate([[a], np.zeros(max_len-1)])
- # else:
- x = np.concatenate([np.zeros(d-1), [a], np.zeros(max_len-d)])
- sum_x += x
+ # else:
+ order = 2 * np.floor(d) + 1
+
+ skip = np.floor(d) - (order - 1) / 2 #M sollte immer 0 sein
+ assert skip >= 0
+
+ samples = np.arange(0, order +1)
+
+ h = a*(np.sinc(samples-d)) #sinc
+ h_len = np.concatenate([h, np.zeros(max_len-len(h))])
+
+ sum_x += h_len
+
+ #x = np.concatenate([np.zeros(d-1), [a], np.zeros(max_len-d)])
+ #sum_x += x
sum_x[0] = self.los
- log.debug(sum_x)
-
- #H_int = fft(sum_x)
-
- #h = ifft(H_int)
+ #log.debug(sum_x)
- #h[0]=1
y = np.convolve(inp, sum_x)
+ # signal_shifted = np.convolve(h, inp, mode='full')
+ # y = signal_shifted
+
+ #y+=np.concatenate([self.temp,np.zeros(len(y)-len(self.temp))])
y+=np.concatenate([self.temp,np.zeros(len(y)-len(self.temp))])
-
oup[:] = y[:len(inp)]
self.temp = y[len(inp):]
diff --git a/src/gui.py b/src/gui/gui.py
index b2cbebb..b2cbebb 100755
--- a/src/gui.py
+++ b/src/gui/gui.py
diff --git a/src/net.py b/src/gui/net.py
index 2c91bb8..2c91bb8 100644
--- a/src/net.py
+++ b/src/gui/net.py
diff --git a/tests/correlator/acgen.dat b/tests/correlator/acgen.dat
deleted file mode 100644
index 537dcc5..0000000
--- a/tests/correlator/acgen.dat
+++ /dev/null
Binary files differ
diff --git a/tests/correlator/acgen.grc b/tests/correlator/acgen.grc
deleted file mode 100644
index ec7c1e8..0000000
--- a/tests/correlator/acgen.grc
+++ /dev/null
@@ -1,188 +0,0 @@
-options:
- parameters:
- author: Naoki Pross
- catch_exceptions: 'True'
- category: '[GRC Hier Blocks]'
- cmake_opt: ''
- comment: ''
- copyright: ''
- description: ''
- gen_cmake: 'On'
- gen_linking: dynamic
- generate_options: no_gui
- hier_block_src_path: '.:'
- id: acgen
- max_nouts: '0'
- output_language: python
- placement: (0,0)
- qt_qss_theme: ''
- realtime_scheduling: ''
- run: 'True'
- run_command: '{python} -u {filename}'
- run_options: run
- sizing_mode: fixed
- thread_safe_setters: ''
- title: Access Code Symbols Generator
- states:
- bus_sink: false
- bus_source: false
- bus_structure: null
- coordinate: [8, 8]
- rotation: 0
- state: enabled
-
-blocks:
-- name: access_code
- id: variable
- parameters:
- comment: ''
- value: '[ 0xaa, 0xff, 0x0a ]'
- states:
- bus_sink: false
- bus_source: false
- bus_structure: null
- coordinate: [40, 292.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
- sym_map: '[0, 1, 3, 2]'
- type: qpsk
- states:
- bus_sink: false
- bus_source: false
- bus_structure: null
- coordinate: [464, 124.0]
- rotation: 0
- state: true
-- name: excess_bw
- id: variable
- parameters:
- comment: ''
- value: '1'
- states:
- bus_sink: false
- bus_source: false
- bus_structure: null
- coordinate: [464, 308.0]
- rotation: 0
- state: true
-- name: samp_rate
- id: variable
- parameters:
- comment: ''
- value: '32000'
- states:
- bus_sink: false
- bus_source: false
- bus_structure: null
- coordinate: [200, 44.0]
- rotation: 0
- state: enabled
-- name: sps
- id: variable
- parameters:
- comment: ''
- value: '4'
- states:
- bus_sink: false
- bus_source: false
- bus_structure: null
- coordinate: [312, 44.0]
- rotation: 0
- state: true
-- name: blocks_file_sink_0
- id: blocks_file_sink
- parameters:
- affinity: ''
- alias: ''
- append: 'False'
- comment: ''
- file: acgen.dat
- type: complex
- unbuffered: 'False'
- vlen: '1'
- states:
- bus_sink: false
- bus_source: false
- bus_structure: null
- coordinate: [752, 204.0]
- rotation: 0
- state: true
-- name: blocks_throttle_0
- id: blocks_throttle
- parameters:
- affinity: ''
- alias: ''
- comment: ''
- ignoretag: 'True'
- maxoutbuf: '0'
- minoutbuf: '0'
- samples_per_second: samp_rate
- type: byte
- vlen: '1'
- states:
- bus_sink: false
- bus_source: false
- bus_structure: null
- coordinate: [264, 220.0]
- rotation: 0
- state: true
-- name: blocks_vector_source_x_0
- id: blocks_vector_source_x
- parameters:
- affinity: ''
- alias: ''
- comment: ''
- maxoutbuf: '0'
- minoutbuf: '0'
- repeat: 'False'
- tags: '[]'
- type: byte
- vector: '[0x00] * 10 + access_code * 10'
- vlen: '1'
- states:
- bus_sink: false
- bus_source: false
- bus_structure: null
- coordinate: [40, 204.0]
- rotation: 0
- state: true
-- name: digital_constellation_modulator_0
- id: digital_constellation_modulator
- parameters:
- affinity: ''
- alias: ''
- comment: ''
- constellation: const
- differential: 'False'
- excess_bw: excess_bw
- log: 'False'
- maxoutbuf: '0'
- minoutbuf: '0'
- samples_per_symbol: sps
- truncate: 'False'
- verbose: 'False'
- states:
- bus_sink: false
- bus_source: false
- bus_structure: null
- coordinate: [464, 196.0]
- rotation: 0
- state: true
-
-connections:
-- [blocks_throttle_0, '0', digital_constellation_modulator_0, '0']
-- [blocks_vector_source_x_0, '0', blocks_throttle_0, '0']
-- [digital_constellation_modulator_0, '0', blocks_file_sink_0, '0']
-
-metadata:
- file_format: 1
diff --git a/tests/correlator/acgen.py b/tests/correlator/acgen.py
deleted file mode 100755
index 5fbdbb4..0000000
--- a/tests/correlator/acgen.py
+++ /dev/null
@@ -1,120 +0,0 @@
-#!/usr/bin/env python3
-# -*- coding: utf-8 -*-
-
-#
-# SPDX-License-Identifier: GPL-3.0
-#
-# GNU Radio Python Flow Graph
-# Title: Access Code Symbols Generator
-# Author: Naoki Pross
-# GNU Radio version: 3.9.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
-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)
-
- ##################################################
- # Variables
- ##################################################
- self.sps = sps = 4
- self.samp_rate = samp_rate = 32000
- self.excess_bw = excess_bw = 1
- self.const = const = digital.constellation_qpsk().base()
- self.access_code = access_code = [ 0xaa, 0xff, 0x0a ]
-
- ##################################################
- # Blocks
- ##################################################
- self.digital_constellation_modulator_0 = digital.generic_mod(
- constellation=const,
- differential=False,
- samples_per_symbol=sps,
- 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, [])
- 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)
-
-
-
- ##################################################
- # Connections
- ##################################################
- 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.digital_constellation_modulator_0, 0), (self.blocks_file_sink_0, 0))
-
-
- def get_sps(self):
- return self.sps
-
- def set_sps(self, sps):
- self.sps = sps
-
- def get_samp_rate(self):
- return self.samp_rate
-
- def set_samp_rate(self, samp_rate):
- self.samp_rate = samp_rate
- self.blocks_throttle_0.set_sample_rate(self.samp_rate)
-
- def get_excess_bw(self):
- return self.excess_bw
-
- def set_excess_bw(self, excess_bw):
- self.excess_bw = excess_bw
-
- def get_const(self):
- return self.const
-
- def set_const(self, const):
- self.const = const
-
- def get_access_code(self):
- return self.access_code
-
- 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, [])
-
-
-
-
-def main(top_block_cls=acgen, options=None):
- tb = top_block_cls()
-
- def sig_handler(sig=None, frame=None):
- tb.stop()
- tb.wait()
-
- sys.exit(0)
-
- signal.signal(signal.SIGINT, sig_handler)
- signal.signal(signal.SIGTERM, sig_handler)
-
- tb.start()
-
- tb.wait()
-
-
-if __name__ == '__main__':
- main()
diff --git a/tests/correlator/acproc.py b/tests/correlator/acproc.py
deleted file mode 100755
index e119520..0000000
--- a/tests/correlator/acproc.py
+++ /dev/null
@@ -1,57 +0,0 @@
-#!/usr/bin/env python3
-
-import numpy as np
-import matplotlib.pyplot as plt
-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
-
-# Create samples
-print("Modulating symbols")
-acgen.main()
-
-# Extract one sequence
-print("Extracting symbol sequence")
-
-# raw data
-data = np.fromfile("acgen.dat", dtype=np.complex64)
-plt.plot(data.real)
-plt.plot(data.imag)
-plt.title("Raw Data (time domain)")
-plt.show()
-
-# take only symbols
-symbols = data[1::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 = symbols[ac_start:ac_end]
-
-fig, (ax1, ax2) = plt.subplots(2, 1)
-fig.tight_layout()
-
-ax1.plot(ac.real, ac.imag)
-ax1.set_title("Symbols of Access Code (constellation)")
-
-ax2.plot(ac.real, ".-")
-ax2.plot(ac.imag, ".-")
-ax2.set_title("Symbols of Access Code (time)")
-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(fir)
diff --git a/tests/correlator/correlator.grc b/tests/correlator/correlator.grc
index cc57e18..9deec54 100644
--- a/tests/correlator/correlator.grc
+++ b/tests/correlator/correlator.grc
@@ -32,6 +32,40 @@ options:
state: enabled
blocks:
+- name: access_code_symbols
+ id: variable
+ parameters:
+ comment: ''
+ value: '[(-1.4142135623730951-1.4142135623730951j), (1.4142135623730951-1.4142135623730951j),
+ (1.4142135623730951+1.4142135623730951j), (1.4142135623730951+1.4142135623730951j),
+ (-1.4142135623730951-1.4142135623730951j), (1.4142135623730951+1.4142135623730951j),
+ (1.4142135623730951-1.4142135623730951j), (1.4142135623730951-1.4142135623730951j)]'
+ states:
+ bus_sink: false
+ bus_source: false
+ bus_structure: null
+ coordinate: [776, 1140.0]
+ rotation: 0
+ state: enabled
+- 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: enabled
- name: const
id: variable_constellation
parameters:
@@ -48,9 +82,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 +94,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 +106,24 @@ 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.4142135623730951+1.4142135623730951j), (1.4142135623730951+1.4142135623730951j),
+ (1.4142135623730951-1.4142135623730951j), (-1.4142135623730951+1.4142135623730951j),
+ (1.4142135623730951-1.4142135623730951j), (1.4142135623730951-1.4142135623730951j),
+ (1.4142135623730951+1.4142135623730951j), (-1.4142135623730951+1.4142135623730951j)]'
+ states:
+ bus_sink: false
+ bus_source: false
+ bus_structure: null
+ coordinate: [48, 564.0]
+ rotation: 0
+ state: enabled
- name: rrc_taps
id: variable
parameters:
@@ -84,9 +133,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 +145,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 +157,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, 0x41, 0xf3]'
+ 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 +181,31 @@ 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_burst_tagger_0
+ id: blocks_burst_tagger
+ parameters:
+ affinity: ''
+ alias: ''
+ comment: ''
+ false_key: nothing
+ false_value: '0'
+ maxoutbuf: '0'
+ minoutbuf: '0'
+ true_key: peak
+ true_value: 'True'
+ type: float
+ states:
+ bus_sink: false
+ bus_source: false
+ bus_structure: null
+ coordinate: [944, 1580.0]
+ rotation: 0
+ state: disabled
+- name: blocks_char_to_short_0
+ id: blocks_char_to_short
parameters:
affinity: ''
alias: ''
@@ -136,9 +217,93 @@ blocks:
bus_sink: false
bus_source: false
bus_structure: null
- coordinate: [1584, 80.0]
+ coordinate: [752, 1624.0]
rotation: 0
- state: true
+ state: disabled
+- name: blocks_complex_to_magphase_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: [1048, 696.0]
+ rotation: 0
+ 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: [1048, 1104.0]
+ rotation: 0
+ state: enabled
+- name: blocks_complex_to_magphase_0_1
+ 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: [256, 1592.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: [1288, 724.0]
+ rotation: 0
+ state: enabled
+- name: blocks_multiply_const_vxx_0_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: [1336, 1180.0]
+ rotation: 0
+ state: disabled
- name: blocks_null_sink_0
id: blocks_null_sink
parameters:
@@ -153,9 +318,118 @@ blocks:
bus_sink: false
bus_source: false
bus_structure: null
- coordinate: [1528, 216.0]
+ coordinate: [1504, 1696.0]
+ rotation: 0
+ state: disabled
+- name: blocks_null_sink_2
+ 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: [528, 1720.0]
+ rotation: 0
+ state: disabled
+- name: blocks_null_sink_3
+ 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, 1232.0]
rotation: 0
state: true
+- 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_peak_detector2_fb_0
+ id: blocks_peak_detector2_fb
+ parameters:
+ affinity: ''
+ alias: ''
+ alpha: '0.001'
+ comment: ''
+ look_ahead: '1000'
+ maxoutbuf: '0'
+ minoutbuf: '0'
+ threshold_factor_rise: '7'
+ states:
+ bus_sink: false
+ bus_source: false
+ bus_structure: null
+ coordinate: [528, 1620.0]
+ rotation: 0
+ state: disabled
+- name: blocks_stream_mux_0
+ id: blocks_stream_mux
+ parameters:
+ affinity: ''
+ alias: ''
+ comment: ''
+ lengths: '[10, 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 +440,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:
@@ -186,15 +460,56 @@ blocks:
repeat: 'False'
tags: '[]'
type: byte
- vector: ([0x00] * 10 + [0xaa, 0xff, 0x0a] + [0x00] * 10) * 20
+ vector: testvec * 1600
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.000001'
+ maxoutbuf: '0'
+ minoutbuf: '0'
+ noise_voltage: '0.2'
+ seed: '243'
+ taps: -1.4 + .4j
+ 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 +526,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 +542,9 @@ blocks:
bus_sink: false
bus_source: false
bus_structure: null
- coordinate: [1264, 212.0]
+ coordinate: [1232, 1692.0]
rotation: 0
- state: true
+ state: disabled
- name: digital_constellation_modulator_0
id: digital_constellation_modulator
parameters:
@@ -249,9 +564,29 @@ blocks:
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: access_code_symbols
+ threshold: '.8'
+ threshold_method: digital.THRESHOLD_DYNAMIC
+ states:
+ bus_sink: false
+ bus_source: false
+ bus_structure: null
+ coordinate: [776, 1020.0]
+ rotation: 0
+ state: enabled
- name: digital_pfb_clock_sync_xxx_0
id: digital_pfb_clock_sync_xxx
parameters:
@@ -272,9 +607,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,19 +620,339 @@ 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: [776, 828.0]
+ rotation: 0
+ state: enabled
+- name: high_pass_filter_0
+ id: high_pass_filter
+ parameters:
+ affinity: ''
+ alias: ''
+ beta: '6.76'
+ comment: ''
+ cutoff_freq: 5e3
+ decim: '1'
+ gain: '1'
+ interp: '1'
+ maxoutbuf: '0'
+ minoutbuf: '0'
+ samp_rate: samp_rate
+ type: fir_filter_fff
+ width: '.7'
+ win: window.WIN_HAMMING
+ states:
+ bus_sink: false
+ bus_source: false
+ bus_structure: null
+ coordinate: [528, 1420.0]
+ rotation: 0
+ state: disabled
+- name: low_pass_filter_0
+ id: low_pass_filter
+ parameters:
+ affinity: ''
+ alias: ''
+ beta: '6.76'
+ comment: ''
+ cutoff_freq: 7e3
+ decim: '1'
+ gain: '1'
+ interp: '1'
+ maxoutbuf: '0'
+ minoutbuf: '0'
+ samp_rate: samp_rate
+ type: fir_filter_fff
+ width: '.8'
+ win: window.WIN_HAMMING
+ states:
+ bus_sink: false
+ bus_source: false
+ bus_structure: null
+ coordinate: [528, 1252.0]
+ rotation: 0
+ state: disabled
+- 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: 0,1,2,1
+ 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: '"Equalized Signal"'
+ 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: [776, 716.0]
+ rotation: 0
+ state: enabled
+- name: qtgui_const_sink_x_1
+ id: qtgui_const_sink_x
+ parameters:
+ affinity: ''
+ alias: ''
+ alpha1: '.5'
+ 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: '"red"'
+ color2: '"red"'
+ color3: '"red"'
+ color4: '"red"'
+ color5: '"red"'
+ color6: '"red"'
+ color7: '"red"'
+ color8: '"red"'
+ color9: '"red"'
+ comment: ''
+ grid: 'True'
+ gui_hint: 2,1,2,1
+ label1: ''
+ label10: ''
+ label2: ''
+ label3: ''
+ label4: ''
+ label5: ''
+ label6: ''
+ label7: ''
+ label8: ''
+ label9: ''
+ legend: 'True'
+ marker1: '9'
+ marker10: '0'
+ marker2: '0'
+ marker3: '0'
+ marker4: '0'
+ marker5: '0'
+ marker6: '0'
+ marker7: '0'
+ marker8: '0'
+ marker9: '0'
+ name: '"Cross Correlation"'
+ nconnections: '1'
+ size: '1024'
+ style1: '2'
+ 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: [1048, 612.0]
rotation: 0
state: enabled
+- name: qtgui_const_sink_x_2
+ 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: '2,1,2,1 '
+ 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: '"Phase Correction"'
+ 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: [1248, 1588.0]
+ rotation: 0
+ state: disabled
- name: qtgui_time_sink_x_0
id: qtgui_time_sink_x
parameters:
@@ -313,7 +968,7 @@ blocks:
alpha7: '1.0'
alpha8: '1.0'
alpha9: '1.0'
- autoscale: 'False'
+ autoscale: 'True'
axislabels: 'True'
color1: blue
color10: dark blue
@@ -326,7 +981,104 @@ blocks:
color8: dark red
color9: dark green
comment: ''
- ctrlpanel: 'True'
+ ctrlpanel: 'False'
+ entags: 'True'
+ grid: 'False'
+ 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: XC Magnitude
+ ymax: '20'
+ ymin: '0'
+ yunit: '""'
+ states:
+ bus_sink: false
+ bus_source: false
+ bus_structure: null
+ coordinate: [1320, 604.0]
+ rotation: 0
+ state: enabled
+- name: qtgui_time_sink_x_0_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: ''
@@ -384,17 +1136,114 @@ blocks:
width7: '1'
width8: '1'
width9: '1'
- ylabel: Amplitude
- ymax: '50'
+ ylabel: XC Magnitude
+ ymax: '20'
ymin: '0'
yunit: '""'
states:
bus_sink: false
bus_source: false
bus_structure: null
- coordinate: [1792, 60.0]
+ coordinate: [1336, 1084.0]
rotation: 0
- state: true
+ state: enabled
+- name: qtgui_time_sink_x_0_0_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: ''
+ 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: XC Magnitude
+ ymax: '2'
+ ymin: '-2'
+ yunit: '""'
+ states:
+ bus_sink: false
+ bus_source: false
+ bus_structure: null
+ coordinate: [1048, 1020.0]
+ rotation: 0
+ state: enabled
- name: qtgui_time_sink_x_1
id: qtgui_time_sink_x
parameters:
@@ -423,7 +1272,7 @@ blocks:
color8: dark red
color9: dark green
comment: ''
- ctrlpanel: 'True'
+ ctrlpanel: 'False'
entags: 'True'
grid: 'False'
gui_hint: ''
@@ -469,7 +1318,7 @@ blocks:
tr_mode: qtgui.TRIG_MODE_FREE
tr_slope: qtgui.TRIG_SLOPE_POS
tr_tag: '""'
- type: complex
+ type: float
update_time: '0.10'
width1: '1'
width10: '1'
@@ -482,6 +1331,200 @@ blocks:
width8: '1'
width9: '1'
ylabel: Amplitude
+ ymax: '20'
+ ymin: '-5'
+ yunit: '""'
+ states:
+ bus_sink: false
+ bus_source: false
+ bus_structure: null
+ coordinate: [784, 1452.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
+ 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: Modulated
+ ymax: '2'
+ ymin: '-2'
+ yunit: '""'
+ states:
+ bus_sink: false
+ bus_source: false
+ bus_structure: null
+ coordinate: [808, 452.0]
+ rotation: 0
+ state: enabled
+- 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: 'True'
+ 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: '""'
@@ -489,21 +1532,347 @@ blocks:
bus_sink: false
bus_source: false
bus_structure: null
- coordinate: [696, 108.0]
+ coordinate: [776, 612.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: [1480, 708.0]
+ rotation: 0
+ state: enabled
+- name: qtgui_time_sink_x_2_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: ''
+ 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: [1512, 1164.0]
+ rotation: 0
+ state: disabled
+- 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: sps * samp_rate
+ 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_sink_1
+ id: virtual_sink
+ parameters:
+ alias: ''
+ comment: ''
+ stream_id: symbols
+ states:
+ bus_sink: false
+ bus_source: false
+ bus_structure: null
+ coordinate: [776, 916.0]
rotation: 0
state: true
+- name: virtual_sink_2
+ id: virtual_sink
+ parameters:
+ alias: ''
+ comment: ''
+ stream_id: xcorrelation
+ states:
+ bus_sink: false
+ bus_source: false
+ bus_structure: null
+ coordinate: [1080, 836.0]
+ rotation: 0
+ state: true
+- name: virtual_source_0
+ id: virtual_source
+ parameters:
+ alias: ''
+ comment: ''
+ stream_id: envelope
+ states:
+ bus_sink: false
+ bus_source: false
+ bus_structure: null
+ coordinate: [32, 884.0]
+ rotation: 0
+ state: enabled
+- name: virtual_source_2
+ id: virtual_source
+ parameters:
+ alias: ''
+ comment: ''
+ stream_id: symbols
+ states:
+ bus_sink: false
+ bus_source: false
+ bus_structure: null
+ coordinate: [32, 1716.0]
+ rotation: 0
+ state: disabled
+- name: virtual_source_3
+ id: virtual_source
+ parameters:
+ alias: ''
+ comment: ''
+ stream_id: xcorrelation
+ states:
+ bus_sink: false
+ bus_source: false
+ bus_structure: null
+ coordinate: [32, 1604.0]
+ rotation: 0
+ state: disabled
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']
-- [digital_cma_equalizer_cc_0, '0', digital_constellation_decoder_cb_0, '0']
+- [blocks_char_to_short_0, '0', blocks_burst_tagger_0, '1']
+- [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_0, '0', qtgui_time_sink_x_0_0, '0']
+- [blocks_complex_to_magphase_0_0, '1', blocks_multiply_const_vxx_0_0, '0']
+- [blocks_complex_to_magphase_0_0, '1', blocks_null_sink_3, '0']
+- [blocks_complex_to_magphase_0_1, '0', blocks_burst_tagger_0, '0']
+- [blocks_complex_to_magphase_0_1, '0', blocks_peak_detector2_fb_0, '0']
+- [blocks_complex_to_magphase_0_1, '0', high_pass_filter_0, '0']
+- [blocks_complex_to_magphase_0_1, '0', low_pass_filter_0, '0']
+- [blocks_complex_to_magphase_0_1, '1', blocks_null_sink_2, '0']
+- [blocks_multiply_const_vxx_0, '0', qtgui_time_sink_x_2, '0']
+- [blocks_multiply_const_vxx_0_0, '0', qtgui_time_sink_x_2_0, '0']
+- [blocks_null_source_0, '0', blocks_stream_mux_0, '0']
+- [blocks_peak_detector2_fb_0, '0', blocks_char_to_short_0, '0']
+- [blocks_stream_mux_0, '0', digital_constellation_modulator_0, '0']
+- [blocks_stream_mux_1, '0', channels_channel_model_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_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_cma_equalizer_cc_0, '0', virtual_sink_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_constellation_modulator_0, '0', qtgui_time_sink_x_1_0, '0']
+- [digital_corr_est_cc_0, '0', qtgui_time_sink_x_0_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']
+- [fir_filter_xxx_1, '0', qtgui_const_sink_x_1, '0']
+- [fir_filter_xxx_1, '0', virtual_sink_2, '0']
+- [high_pass_filter_0, '0', qtgui_time_sink_x_1, '0']
+- [low_pass_filter_0, '0', qtgui_time_sink_x_1, '0']
+- [root_raised_cosine_filter_0, '0', blocks_stream_mux_1, '0']
+- [virtual_source_0, '0', digital_pfb_clock_sync_xxx_0, '0']
+- [virtual_source_3, '0', blocks_complex_to_magphase_0_1, '0']
metadata:
file_format: 1
diff --git a/tests/correlator/correlator.py b/tests/correlator/correlator.py
index 79fa3f8..376d061 100755
--- a/tests/correlator/correlator.py
+++ b/tests/correlator/correlator.py
@@ -26,6 +26,7 @@ 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
@@ -80,32 +81,143 @@ 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, 0x41, 0xf3]
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.4142135623730951+1.4142135623730951j), (1.4142135623730951+1.4142135623730951j), (1.4142135623730951-1.4142135623730951j), (-1.4142135623730951+1.4142135623730951j), (1.4142135623730951-1.4142135623730951j), (1.4142135623730951-1.4142135623730951j), (1.4142135623730951+1.4142135623730951j), (-1.4142135623730951+1.4142135623730951j)]
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)]
+ self.access_code_symbols = access_code_symbols = [(-1.4142135623730951-1.4142135623730951j), (1.4142135623730951-1.4142135623730951j), (1.4142135623730951+1.4142135623730951j), (1.4142135623730951+1.4142135623730951j), (-1.4142135623730951-1.4142135623730951j), (1.4142135623730951+1.4142135623730951j), (1.4142135623730951-1.4142135623730951j), (1.4142135623730951-1.4142135623730951j)]
##################################################
# 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
None # parent
)
- 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_2.set_update_time(0.10)
+ self.qtgui_time_sink_x_2.set_y_axis(-1, 1)
- self.qtgui_time_sink_x_1.set_y_label('Amplitude', "")
+ self.qtgui_time_sink_x_2.set_y_label('XC Phase', "")
- 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_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
+ )
+ 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_1.set_y_label('Equalized', "")
+
+ 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(True)
+ 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',
+ '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(2):
+ if len(labels[i]) == 0:
+ if (i % 2 == 0):
+ self.qtgui_time_sink_x_1_1.set_line_label(i, "Re{{Data {0}}}".format(i/2))
+ else:
+ self.qtgui_time_sink_x_1_1.set_line_label(i, "Im{{Data {0}}}".format(i/2))
+ else:
+ self.qtgui_time_sink_x_1_1.set_line_label(i, labels[i])
+ self.qtgui_time_sink_x_1_1.set_line_width(i, widths[i])
+ self.qtgui_time_sink_x_1_1.set_line_color(i, colors[i])
+ self.qtgui_time_sink_x_1_1.set_line_style(i, styles[i])
+ self.qtgui_time_sink_x_1_1.set_line_marker(i, markers[i])
+ self.qtgui_time_sink_x_1_1.set_line_alpha(i, alphas[i])
+
+ self._qtgui_time_sink_x_1_1_win = sip.wrapinstance(self.qtgui_time_sink_x_1_1.pyqwidget(), Qt.QWidget)
+ self.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_1_0 = qtgui.time_sink_c(
+ 1024, #size
+ samp_rate, #samp_rate
+ "", #name
+ 1, #number of inputs
+ None # parent
+ )
+ self.qtgui_time_sink_x_1_0.set_update_time(0.10)
+ self.qtgui_time_sink_x_1_0.set_y_axis(-2, 2)
+
+ self.qtgui_time_sink_x_1_0.set_y_label('Modulated', "")
+
+ self.qtgui_time_sink_x_1_0.enable_tags(True)
+ self.qtgui_time_sink_x_1_0.set_trigger_mode(qtgui.TRIG_MODE_FREE, qtgui.TRIG_SLOPE_POS, 0.0, 0, 0, "")
+ self.qtgui_time_sink_x_1_0.enable_autoscale(True)
+ self.qtgui_time_sink_x_1_0.enable_grid(False)
+ self.qtgui_time_sink_x_1_0.enable_axis_labels(True)
+ self.qtgui_time_sink_x_1_0.enable_control_panel(False)
+ self.qtgui_time_sink_x_1_0.enable_stem_plot(False)
labels = ['Signal 1', 'Signal 2', 'Signal 3', 'Signal 4', 'Signal 5',
@@ -125,19 +237,122 @@ 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_0.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_0.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_0.set_line_label(i, labels[i])
+ self.qtgui_time_sink_x_1_0.set_line_width(i, widths[i])
+ self.qtgui_time_sink_x_1_0.set_line_color(i, colors[i])
+ self.qtgui_time_sink_x_1_0.set_line_style(i, styles[i])
+ self.qtgui_time_sink_x_1_0.set_line_marker(i, markers[i])
+ self.qtgui_time_sink_x_1_0.set_line_alpha(i, alphas[i])
+
+ self._qtgui_time_sink_x_1_0_win = sip.wrapinstance(self.qtgui_time_sink_x_1_0.pyqwidget(), Qt.QWidget)
+ self.top_grid_layout.addWidget(self._qtgui_time_sink_x_1_0_win, 0, 0, 1, 1)
+ for r in range(0, 1):
+ 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_0_0 = qtgui.time_sink_c(
+ 1024, #size
+ samp_rate, #samp_rate
+ "", #name
+ 1, #number of inputs
+ None # parent
+ )
+ self.qtgui_time_sink_x_0_0_0.set_update_time(0.10)
+ self.qtgui_time_sink_x_0_0_0.set_y_axis(-2, 2)
+
+ self.qtgui_time_sink_x_0_0_0.set_y_label('XC Magnitude', "")
+
+ self.qtgui_time_sink_x_0_0_0.enable_tags(True)
+ self.qtgui_time_sink_x_0_0_0.set_trigger_mode(qtgui.TRIG_MODE_FREE, qtgui.TRIG_SLOPE_POS, 0.0, 0, 0, "")
+ self.qtgui_time_sink_x_0_0_0.enable_autoscale(True)
+ self.qtgui_time_sink_x_0_0_0.enable_grid(False)
+ self.qtgui_time_sink_x_0_0_0.enable_axis_labels(True)
+ self.qtgui_time_sink_x_0_0_0.enable_control_panel(False)
+ self.qtgui_time_sink_x_0_0_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(2):
+ if len(labels[i]) == 0:
+ if (i % 2 == 0):
+ self.qtgui_time_sink_x_0_0_0.set_line_label(i, "Re{{Data {0}}}".format(i/2))
+ else:
+ self.qtgui_time_sink_x_0_0_0.set_line_label(i, "Im{{Data {0}}}".format(i/2))
+ else:
+ self.qtgui_time_sink_x_0_0_0.set_line_label(i, labels[i])
+ self.qtgui_time_sink_x_0_0_0.set_line_width(i, widths[i])
+ self.qtgui_time_sink_x_0_0_0.set_line_color(i, colors[i])
+ self.qtgui_time_sink_x_0_0_0.set_line_style(i, styles[i])
+ self.qtgui_time_sink_x_0_0_0.set_line_marker(i, markers[i])
+ self.qtgui_time_sink_x_0_0_0.set_line_alpha(i, alphas[i])
+
+ self._qtgui_time_sink_x_0_0_0_win = sip.wrapinstance(self.qtgui_time_sink_x_0_0_0.pyqwidget(), Qt.QWidget)
+ self.top_layout.addWidget(self._qtgui_time_sink_x_0_0_0_win)
+ self.qtgui_time_sink_x_0_0 = qtgui.time_sink_f(
+ 1024, #size
+ samp_rate, #samp_rate
+ "", #name
+ 1, #number of inputs
+ None # parent
+ )
+ self.qtgui_time_sink_x_0_0.set_update_time(0.10)
+ self.qtgui_time_sink_x_0_0.set_y_axis(0, 20)
+
+ self.qtgui_time_sink_x_0_0.set_y_label('XC Magnitude', "")
+
+ self.qtgui_time_sink_x_0_0.enable_tags(True)
+ self.qtgui_time_sink_x_0_0.set_trigger_mode(qtgui.TRIG_MODE_FREE, qtgui.TRIG_SLOPE_POS, 0.0, 0, 0, "")
+ self.qtgui_time_sink_x_0_0.enable_autoscale(True)
+ self.qtgui_time_sink_x_0_0.enable_grid(False)
+ self.qtgui_time_sink_x_0_0.enable_axis_labels(True)
+ self.qtgui_time_sink_x_0_0.enable_control_panel(False)
+ self.qtgui_time_sink_x_0_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_0.set_line_label(i, "Data {0}".format(i))
+ else:
+ self.qtgui_time_sink_x_0_0.set_line_label(i, labels[i])
+ self.qtgui_time_sink_x_0_0.set_line_width(i, widths[i])
+ self.qtgui_time_sink_x_0_0.set_line_color(i, colors[i])
+ self.qtgui_time_sink_x_0_0.set_line_style(i, styles[i])
+ self.qtgui_time_sink_x_0_0.set_line_marker(i, markers[i])
+ self.qtgui_time_sink_x_0_0.set_line_alpha(i, alphas[i])
+
+ self._qtgui_time_sink_x_0_0_win = sip.wrapinstance(self.qtgui_time_sink_x_0_0.pyqwidget(), Qt.QWidget)
+ self.top_layout.addWidget(self._qtgui_time_sink_x_0_0_win)
self.qtgui_time_sink_x_0 = qtgui.time_sink_f(
1024, #size
samp_rate, #samp_rate
@@ -146,16 +361,16 @@ class correlator(gr.top_block, Qt.QWidget):
None # parent
)
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, 20)
- 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,10 +400,105 @@ 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_1 = qtgui.const_sink_c(
+ 1024, #size
+ "Cross Correlation", #name
+ 1, #number of inputs
+ None # parent
+ )
+ self.qtgui_const_sink_x_1.set_update_time(0.10)
+ self.qtgui_const_sink_x_1.set_y_axis(-2, 2)
+ self.qtgui_const_sink_x_1.set_x_axis(-2, 2)
+ self.qtgui_const_sink_x_1.set_trigger_mode(qtgui.TRIG_MODE_FREE, qtgui.TRIG_SLOPE_POS, 0.0, 0, "")
+ self.qtgui_const_sink_x_1.enable_autoscale(True)
+ self.qtgui_const_sink_x_1.enable_grid(True)
+ self.qtgui_const_sink_x_1.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 = [2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0]
+ markers = [9, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0]
+ alphas = [.5, 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_1.set_line_label(i, "Data {0}".format(i))
+ else:
+ self.qtgui_const_sink_x_1.set_line_label(i, labels[i])
+ self.qtgui_const_sink_x_1.set_line_width(i, widths[i])
+ self.qtgui_const_sink_x_1.set_line_color(i, colors[i])
+ self.qtgui_const_sink_x_1.set_line_style(i, styles[i])
+ self.qtgui_const_sink_x_1.set_line_marker(i, markers[i])
+ self.qtgui_const_sink_x_1.set_line_alpha(i, alphas[i])
+
+ self._qtgui_const_sink_x_1_win = sip.wrapinstance(self.qtgui_const_sink_x_1.pyqwidget(), Qt.QWidget)
+ self.top_grid_layout.addWidget(self._qtgui_const_sink_x_1_win, 2, 1, 2, 1)
+ for r in range(2, 4):
+ self.top_grid_layout.setRowStretch(r, 1)
+ for c in range(1, 2):
+ self.top_grid_layout.setColumnStretch(c, 1)
+ self.qtgui_const_sink_x_0 = qtgui.const_sink_c(
+ 1024, #size
+ "Equalized Signal", #name
+ 1, #number of inputs
+ None # parent
+ )
+ 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, 0, 1, 2, 1)
+ for r in range(0, 2):
+ self.top_grid_layout.setRowStretch(r, 1)
+ for c in range(1, 2):
+ self.top_grid_layout.setColumnStretch(c, 1)
+ 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_corr_est_cc_0 = digital.corr_est_cc(access_code_symbols, 1, 0, .8, digital.THRESHOLD_DYNAMIC)
self.digital_constellation_modulator_0 = digital.generic_mod(
constellation=const,
differential=False,
@@ -198,28 +508,49 @@ class correlator(gr.top_block, Qt.QWidget):
verbose=False,
log=False,
truncate=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.blocks_null_sink_0 = blocks.null_sink(gr.sizeof_char*1)
- self.blocks_complex_to_mag_0 = blocks.complex_to_mag(1)
+ self.channels_channel_model_0 = channels.channel_model(
+ noise_voltage=0.2,
+ frequency_offset=0.000001,
+ epsilon=1.0,
+ taps=[-1.4 + .4j],
+ noise_seed=243,
+ block_tags=False)
+ self.blocks_vector_source_x_0 = blocks.vector_source_b(testvec * 1600, False, 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, [10, len(testvec)])
+ self.blocks_null_source_0 = blocks.null_source(gr.sizeof_char*1)
+ self.blocks_null_sink_3 = blocks.null_sink(gr.sizeof_float*1)
+ self.blocks_multiply_const_vxx_0 = blocks.multiply_const_ff(180 / 3.141592653589793)
+ self.blocks_complex_to_magphase_0_0 = blocks.complex_to_magphase(1)
+ 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.digital_cma_equalizer_cc_0, 0), (self.digital_constellation_decoder_cb_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_complex_to_magphase_0_0, 1), (self.blocks_null_sink_3, 0))
+ self.connect((self.blocks_complex_to_magphase_0_0, 0), (self.qtgui_time_sink_x_0_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_corr_est_cc_0, 0))
self.connect((self.digital_cma_equalizer_cc_0, 0), (self.fir_filter_xxx_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_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_modulator_0, 0), (self.channels_channel_model_0, 0))
+ self.connect((self.digital_constellation_modulator_0, 0), (self.qtgui_time_sink_x_1_0, 0))
+ self.connect((self.digital_corr_est_cc_0, 1), (self.blocks_complex_to_magphase_0_0, 0))
+ self.connect((self.digital_corr_est_cc_0, 0), (self.qtgui_time_sink_x_0_0_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))
+ self.connect((self.fir_filter_xxx_1, 0), (self.qtgui_const_sink_x_1, 0))
def closeEvent(self, event):
@@ -258,6 +589,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 * 1600, [])
+
def get_samp_rate(self):
return self.samp_rate
@@ -265,7 +603,11 @@ 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_0_0.set_samp_rate(self.samp_rate)
+ self.qtgui_time_sink_x_0_0_0.set_samp_rate(self.samp_rate)
+ self.qtgui_time_sink_x_1_0.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 +616,31 @@ 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
+
+ def get_access_code_symbols(self):
+ return self.access_code_symbols
+
+ def set_access_code_symbols(self, access_code_symbols):
+ self.access_code_symbols = access_code_symbols
+