aboutsummaryrefslogtreecommitdiffstats
path: root/notebooks/FrameSynchronization.ipynb
blob: 911ddd6b34304c805b9f26105f4f723dcb0bb607 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "57a55a8c",
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "dc4b9dfd",
   "metadata": {},
   "source": [
    "# Digital Frame Synchronization\n"
   ]
  },
  {
   "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": 2,
   "id": "20dcd173-2889-4e21-9746-3d0a0ab060e8",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "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": [
       "<Figure size 1440x288 with 2 Axes>"
      ]
     },
     "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": "iVBORw0KGgoAAAANSUhEUgAABIkAAAEICAYAAADbZqSCAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8rg+JYAAAACXBIWXMAAAsTAAALEwEAmpwYAABBwklEQVR4nO3deXyddZn///fVfaWldE2glKUFutAUYxFxQQGBsqQuIOAoOo7V+YkzzjhfRZ0RBjeccUNBoSICgyDoSFqgbCKLjBQpNNCWFlqg0CZp0n3fkly/P+77LqfhnPSkZ7nvc87r+Xj0keQ+9zn3J3dPkvtc53N93ubuAgAAAAAAQGXrEfcAAAAAAAAAED+KRAAAAAAAAKBIBAAAAAAAAIpEAAAAAAAAEEUiAAAAAAAAiCIRAAAAAAAARJEIQAGY2UozOyP8/Cozuz2Hx1piZqfla2zdPPY3zOymOI4NAABQDsxsnJm5mfU6yPtzPQYUEUUioAjM7HEz22hmfdPcdqmZLTCzbWbWbGYPmNl7unis6WY2z8w2mdkGM/ubmX2mwON3Mzu2kMcIj3OLmX0ndZu7T3L3xwtwrMfNbJeZbTWzLWb2nJldkfp/5O7fc/d/yPexAQBA6crndV14n6vCa63pBzGOsrpOMbPTzGx16jaux4DiokgEFJiZjZP0Xkku6YJOt/2rpJ9K+p6kUZLGSvqFpLoMj3WKpD9LekLSsZIOk/SPks4pyODL3+XuPljSGElfkXSxpHlmZoU86MG+kwYAAOKVz+u68D4m6ZOSNki6rBBjzqd01zBc1wDlhSIRUHifkjRf0i1K+eNvZkMkXS3pi+7+R3ff7u573f1ed/9/GR7rvyXd6u4/cPd1HnjO3S9KedzPmdmKcJbRXDOrSrnNzewLZrY8fAfs+qggYmbHmtkTZrbZzNaZ2V3h9ifDu78Qviv28XD7eWbWEM5o+quZnZjNyTCz35vZmvA4T5rZpHD7LEmfkPTV8Dj3httTW9f6mtlPzawp/PfT6F286J0nM/uKmbWG795lNcMqPPePK7jYO0XSueFj7tcql2ns4W2Hmdm94aykZ83sO2b2VKdz/0UzWy5pebjtWjNblTKT6b0p+18VHu/2cLbTIjObYGZfD7+/VWb2oWy+PwAAkDf5vK6TgoJTlaR/lnSxmfVJeczO1yH72rbM7Lvhfa8Lr5uuC/d5d3gdsjn8+O6U+w8zs9+E11Abzaw+5bYDXT/uu4ZJueb6mpmtkfQbM+thwYzsV81svZndbWbD0n3DZvYZM1saXt+8ZmafD7cPlPSApKrwe9pmZlVpzsMFFixHsMmC2VQnpNy20sz+zcxeDM/BXWbWr4vzD6ATikRA4X1K0m/Df2eZ2ahw+ymS+km6J5sHMbMB4X3+0MU+H5T0fUkXKZgd84ak33Xa7TxJ75Q0NdzvrHD7tyU9LOlQSYdL+rkkufv7wtunuvsgd7/LzE6SdLOkzyuYzXSjpLmWZtp1Gg9IGi9ppKTnFZwXufvs8PP/Co9zfpr7flPSuyTVhOOfLunfU24fLWmIpGpJn5V0vZkdmsWYFI7hTUkLFFx0ZT320PWStodjuEzp3w2cKelkSRPDr58Nv5dhku6Q9PtOFzLnS/ofBf8nCyU9pOD3drWCC9Ebs/3eAABAXuTlui7FZZLulXRX+PV52dzJ3b8p6S8KZkUPcvfLw6LM/ZJ+puD67MeS7jezw8K7/Y+kAZImKbiW+YmU9fXjTO1/DTNawfXLkZJmSfqncJ/3Kyh6bVRwbZROa/h9HiLpM5J+YmYnuft2BbPjm8LvaZC7N6Xe0cwmSLpT0pcljZA0T9K9qcW18Ps4W9JRkk6U9OkM4wCQBkUioIAs6EE/UtLd7v6cpFclXRrefJikde7eluXDHargZ7a5i30+Ielmd3/e3XdL+rqkUyyYGh25xt03hQWRxxQUKSRpbzjWKnff5e5PKbPPSbrR3Z9x93Z3v1XSbgUFnC65+83uvjUc31WSpobvvmXjE5KudvdWd18r6T8VTNGO7A1v3+vu8yRtk3Rclo8daVJw0ZP12M2sp6SPSrrS3Xe4+0uSbk3zEN939w3uvjN8vNvdfb27t7n7jyT17TTev7j7Q+Fz5PcKLoaucfe9Ci7expnZ0G5+fwAA4CDk+bouegPwQkl3hH/b/6DcWs7OlbTc3f8nvLa4U9IySeeb2RgFBZgvuPvG8FrpifB+2Vw/7ncNI6lDwXXP7nDb5yV9091Xp1wnfczStKK5+/3u/mo4I/4JBW9SZnqDrrOPS7rf3R8Jz9kPJfWX9O6UfX7m7k3uvkFBAa4my8cGIIpEQKFdJulhd18Xfn2H3vrjv17S8HR/PDPYqOAP8pgu9qlS8O6PJMndt4XHqU7ZZ03K5zskDQo//6okk/S3cArv33dxnCMlfSWc5rvJzDZJOiI8fkZm1tPMrgmnIm+RtDK8aXhX90ux3/cXfp56zPWdLs5Sv79sVStYF2A/Bxj7CEm9JK1Kucsqvd1+2yxojVsaTofepGAWVOq5aEn5fKeCi8/2lK+l7n9/AADg4OTzuk6SPiypTcFsGCmYnXSOmY04yPF1vk5S+HW1guu0De6+8UD3y3D92Pm6Zq2770r5+khJ96RcFy6V1K5gbab9mNk5ZjY/bG3bJGmGDvJa0N07wrFlc60LIAsUiYACMbP+Cqa7vt+CdWzWSPoXBbNPpkp6WtIuBVNzD8jdd4T3+WgXuzUp+CMdjWGggne2GrN4/DXu/jl3r1LwbtAvLHOi2SpJ33X3oSn/BoTvWHXlUgWLN56hoCAyLhpqNIwD3H+/70/BgpBNGfbtNjM7QtI7FEzf7qyrsa9VcJF3eMr+R6R5jH3fnwXrD31NwXPkUHcfKmmz3joXAAAgIfJ9XRe6TEEB483w8X4vqbekS8LbtytoD4uM7nT/ztdNna+TpOBaqVHBtduwDDOQs7l+7Hyszl+vknROp2vDfu6+3zVouDTB/yqYATQqvP6Zp4O8FjQzU3DNdcBrXQDZoUgEFM5MBe+gTFQwzbVG0gkKChCfcvfNkr6lYN2cmWY2wMx6h++u/FeGx/yqpE+b2f+L+svNbKqZRX3jd0j6jJnVhH+EvyfpGXdfeaDBmtmFZhYVOTYq+CMdzVppkXR0yu6/kvQFMzvZAgPN7FwzG3yAwwxW0Ja2XsFFz/c63d75OJ3dKenfzWyEmQ1XcP5u72L/rITn/v2S5kj6m956Ry+rsYeze/4o6arwsY5XsGZBVwYrKCytldTLzL6loDcfAAAkz0zl8brOzKolna5gbZ7o8aZK+oHemp3UIOl9ZjY2bM3/eqeH6XzdNE/SBDO71ILFrT8ejvc+d29WsLbiL8zs0HBs0bqTB339mOIGSd81syPD72+EmaVLdeujoL1+raQ2MztHUmoQR4ukw7pYiuBuSeea2elm1ltBOu1uSX/txlgBdIEiEVA4l0n6jbu/Gc7SWePuayRdJ+kTZtbL3X8s6V8VLL68VsG7MJdLqk/3gO7+V0kfDP+9ZmYbJM1WWNRw90cl/YeCd2iaJR2jINY9G++U9IyZbZM0V9I/u/vr4W1XSbo1nEJ8kbsvULAu0XUKCkorlN2igLcpmCLcKOklBekgqX4taWJ4nPo09/+OgoWlX5S0SMHi0d/J8vtL5zoz26rgguSnCs7b2eHU5e6O/XIFM4zWKFgY8k4FFy2ZPKTgYu2V8HF3KX2LGgAAiF++r+s+KanB3R/u9Hg/k3SimU1290cULGj9oqTnJN3X6TGuVbDuz0Yz+5m7r1dQdPqKgje1virpvJT2uE8qWL9xmYLFo78s5Xz9mDqWuZIeDq+t5itY6Ho/7r5VwSLXdyu4hrw0vF90+zIF11CvhdeDVZ3u/7Kkv1MQsLJOQcjH+e6+p5vjBZCBuR9oRh8AoLvM7AeSRrt7LgtQAgAAAEDRMJMIAPLAzI43sxPD9rvpkj6r7sfgAgAAAEBsurP6PgAgs8EKpkdXKZjC/SMFaxwBAAAAQEmg3QwAAAAAAAC0mwEAAAAAACDh7WbDhw/3cePGxT0MAABQIM8999w6dx8R9zjwFq6/AAAof5muwfJSJDKzmxXELba6++Q0t5+mYG2OKE77j+5+9YEed9y4cVqwYEE+hggAABLIzN6IewzYH9dfAACUv0zXYPmaSXSLpOsk3dbFPn9x9/PydDwAAAAAAADkUV7WJHL3JyVtyMdjAQAAAAAAoPiKuXD1KWb2gpk9YGaTMu1kZrPMbIGZLVi7dm0RhwcAAAAAAFC5ilUkel7Ske4+VdLPJdVn2tHdZ7t7rbvXjhjBOpYAAAAAAADFUJQikbtvcfdt4efzJPU2s+HFODYAAAAAAAAOrChFIjMbbWYWfj49PO76YhwbAAAAAAAAB5aXdDMzu1PSaZKGm9lqSVdK6i1J7n6DpI9J+kcza5O0U9LF7u75ODYAAAAAAAByl5cikbtfcoDbr5N0XT6OBQAAimPVhh36l7sa9NWzj9f0o4bFPRwAQAH87fUNGti3pyZVDYl7KAASIC9FIgAAUD7ue7FJl9+xcN/XF934tFZec26MIwIAFMq//f4FHX5of93xuXfFPRQACUCRCAAAaE9bh/69fpHuXrA67qEAAIpkx542vblhh3bsaYt7KAASgiIRAAAVbNWGHfroL/+q1q27920b3K+X6r94qo4ZMUjjrrg/xtEBAArp1dbtkqR12/Zow/Y9GjawT8wjAhA3ikQAAFSg+19s1hfveH6/bedPrdJ/f+xE9evdM6ZRAQCK6ZWWrfs+X96yVScffViMowGQBBSJAACoEJlayn544VR97B2HxzQqAEBcXmndmvL5NopEACgSAQBQ7g7UUgYAqEwrWrbpuFGDtXrjDq1ImVUEoHJRJAIAoEzRUgYA6MorrVs19fCh6tenp15p2Rb3cAAkAEUiAADKyN72Dv37PYt114JV+23/74+dqAtrj4hpVACApNmxp02rNuzUhe84Qv1799RjL7fGPSQACUCRCACAMkBLGQCgO6JkswmjBql/7576/XOrSTgDQJEIAIBSRksZAOBgRMlmx44crL7h3wsSzgBQJAIAoMTQUgYAyNUrrVvVp2cPjTtsgPr36RluI+EMqHQUiQAAKBGrNuzQx274q1q2pLSU9e2le754qo4dSUtZJTOzfpKelNRXwfXdH9z9SjMbJukuSeMkrZR0kbtvjGucAJJjRcs2HT1ioHr17KGqIf00sE9PEs4AUCQCACDp5i1q1v/32/1bys47cYx+eOFUWsoQ2S3pg+6+zcx6S3rKzB6Q9BFJj7r7NWZ2haQrJH0tzoECSIYo2UySzEzHjhpMwhkAikQAACQRLWXoDnd3SdGru97hP5dUJ+m0cPutkh4XRSKg4qUmm0UmjBxEwhkAikQAACQJLWU4WGbWU9Jzko6VdL27P2Nmo9y9WZLcvdnMRma47yxJsyRp7NixxRoygJikJptFJowaTMIZAIpEAAAkAS1lyJW7t0uqMbOhku4xs8nduO9sSbMlqba21gszQgBJkZpsFjk2LBiRcAZUNopEAADEhJYyFIK7bzKzxyWdLanFzMaEs4jGSKKXBMB+yWaRCaMGh7eRcAZUMopEAAAUGS1lyDczGyFpb1gg6i/pDEk/kDRX0mWSrgk/zolvlACSIjXZLELCGQCJIhEAAEVDSxkKaIykW8N1iXpIutvd7zOzpyXdbWaflfSmpAvjHCSAZEhNNouQcAZAokgEAEBB0VKGYnD3FyVNS7N9vaTTiz8iAEmVLtksQsIZAIpEAAAUwKoNO3ThDU9rzZZd+7bRUgYAiFu6ZLMICWcAKBIBAJBHtJQBAJIsXbJZhIQzABSJAADIES1lAIBSkS7ZLELCGQCKRAAAHKR0LWWD+vZSPS1lAICESpdsFiHhDABFIgAAuildS9m5J47Rj2gpAwAkXLpkswgJZwAoEgEAkIW97R36j/rF+t2z+7eU/dfHTtRFtJQBAErAjj1tWr0xfbJZJEg4W1vEUQFIkrwUiczsZknnSWp198lpbjdJ10qaIWmHpE+7+/Od9wMAIGloKQMAlItXW7fLPX2yWSRKONu4fY8OJeEMqDj5mkl0i6TrJN2W4fZzJI0P/50s6ZfhRwAAEomWMgBAuekq2SwSJZy9QsIZUJHyUiRy9yfNbFwXu9RJus3dXdJ8MxtqZmPcvTkfxwcAIB/2tnfoW3MW686/0VIGACg/y1u3ZUw2i0QJZ8tJOAMqUrHWJKqWlHrFvTrc9rYikZnNkjRLksaOHVuUwQEAKlvmlrJ3d/luKwAApWR5y9aMyWaRKOFsOQlnQEUqVpHI0mzzdDu6+2xJsyWptrY27T4AAOQDLWUAgErSVbJZhIQzoLIVq0i0WlLqPP3DJTUV6dgAAOxDSxkAoBJlk2wWIeEMqFzFKhLNlXS5mf1OwYLVm1mPCABQTLSUAQAqWTbJZhESzoDKlZcikZndKek0ScPNbLWkKyX1liR3v0HSPEkzJK2QtEPSZ/JxXAAADoSWMgAAsks2i5BwBlSufKWbXXKA213SF/NxLAAADoSWMgAA9pdNslmEhDOgchWr3QwAgIKjpQwAgPSySTaLkHAGVC6KRACAkvfAomb9Y+eWsilj9KOLaCkDAEDKLtksQsIZULkoEgEASlLGlrKPnqiL3klLGQAAke4km0VIOAMqE0UiAEBJWbVhhy668Wk1b6alDACAbHQn2SxCwhlQmSgSAQBKAi1lAAAcnO4km0VIOAMqE0UiAEBi0VIGAEDuupNsFiHhDKhMFIkAAImzeuMOXXTD02pKaSkb0Ken5nzxVI0fRUsZAADd0Z1kswgJZ0BlokgEAEgMWsoAAMi/7iSbRUg4AyoTRSIAQKxoKQMAoHAOJtksQsIZUHkoEgEAYkFLGQAAhRclm40fmX2yWWT8qEEknAEVhiIRAKCoHlzcrC/cTksZAADFECWbHcwbMNF9SDgDKgdFIgBAwQUtZUt059/e3G/7Dz46RR9/59iYRgUAQPlb3rpNvXtat5LNIiScAZWHIhEAoGBoKQOKw8yOkHSbpNGSOiTNdvdrzewqSZ+TFC0q8g13nxfPKAHEYXnLVh09fFC3ks0iJJwBlYciEQAg72gpA4quTdJX3P15Mxss6TkzeyS87Sfu/sMYxwYgRgeTbBYh4QyoPBSJAAB5QUsZEB93b5bUHH6+1cyWSqqOd1QA4pZLslmEhDOgslAkAgDkhJYyIFnMbJykaZKekXSqpMvN7FOSFiiYbbQxzX1mSZolSWPHUtQFykUuyWYREs6AykKRCABwUGgpA5LHzAZJ+l9JX3b3LWb2S0nfluThxx9J+vvO93P32ZJmS1Jtba0Xb8QACimXZLMICWdAZaFIBADIGi1lQHKZWW8FBaLfuvsfJcndW1Ju/5Wk+2IaHoAY5JJsFiHhDKgsFIkAAAdESxmQbGZmkn4taam7/zhl+5hwvSJJ+rCkxXGMD0A8ckk2i5BwBlQWikQAgIzStZSdM3m0fvLxGlrKgGQ5VdInJS0ys4Zw2zckXWJmNQrazVZK+nwcgwMQj1ySzSIknAGVhSIRAGA/mVrKrvnIFF08nZYyIInc/SlJluamecUeC4BkyEeyWYSEM6ByUCQCAEiipQwAgHKSj2SzCAlnQOWgSAQAFe7BxWv0hduf228bLWUAAJS2fCSbRUg4AyoHRSIAqEBt7R361twluuMZWsoAAChH+Ug2i5BwBlQOikQAUEFWb9yhj984X42bdu7b1r93T825/NR9F4AAAKD05SPZLELCGVA5KBIBQAWgpQwAgMqSj2SzCAlnQOXIS5HIzM6WdK2knpJucvdrOt1+mqQ5kl4PN/3R3a/Ox7EBAOnRUgYAQGXKZ7JZhIQzoDLkXCQys56Srpd0pqTVkp41s7nu/lKnXf/i7uflejwAQNdoKQMAoLLlM9ksQsIZUBnyMZNouqQV7v6aJJnZ7yTVSepcJAIAFBAtZQAAQMpvslmEhDOgMuSjSFQtaVXK16slnZxmv1PM7AVJTZL+zd2XpHswM5slaZYkjR1LOwQAdIWWMgAA0Fk+k80iJJwBlSEfRSJLs807ff28pCPdfZuZzZBUL2l8ugdz99mSZktSbW1t58cBAIiWMgAAkFk+k80iJJwBlSEfRaLVklJXRDtcwWyhfdx9S8rn88zsF2Y23N3X5eH4AFAxaCkDAAAHks9kswgJZ0BlyEeR6FlJ483sKEmNki6WdGnqDmY2WlKLu7uZTZfUQ9L6PBwbAMoeLWUAACBbhUg2i5BwBpS/nItE7t5mZpdLekhST0k3u/sSM/tCePsNkj4m6R/NrE3STkkXuzutZADQBVrKAABAdxUi2SxCwhlQ/vIxk0juPk/SvE7bbkj5/DpJ1+XjWABQ7mgpAwAAB6sQyWYREs6A8peXIhEAIDdt7R26cu4S/bZTS9n3PzJFl9BSBgAAslSIZLMICWdA+aNIBAAxaty0Uxfd8PR+LWX9evfQ3MvfQ0sZAADotkIkm0VIOAPKH0UiAIhBupaysycFLWX9+9BSBgAADk4hks0iJJwB5Y8iEQAUCS1lAACgkAqZbBYh4QwobxSJAKDAaCkDAADFUMhkswgJZ0B5o0gEAAXy0JI1+vz/0FIGAACKY3lr4ZLNIuNTFq+eftSwgh0HQDwoEgFAHtFSBgAA4vJKS+GSzSLRLOhXWrZSJALKEEUiAMgDWsoAAEDcCplsFiHhDChvFIkAIAe0lAEAgKRY3rpNJx4+pKDHiBLOlreScAaUI4pEANBNbe0duureJbp9Pi1lAAAgGXbuadeqjTv0sXccXvBjkXAGlC+KRACQJVrKAABAUq1o3VbwZLMICWdA+aJIBAAHQEsZAABIumIkm0VIOAPKF0UiAEiDljIApcTMjpB0m6TRkjokzXb3a81smKS7JI2TtFLSRe6+Ma5xAiicYiSbRUg4A8oXRSIASNG4aac+fuPTWr3xrZayvr2ClrLjRtNSBiCx2iR9xd2fN7PBkp4zs0ckfVrSo+5+jZldIekKSV+LcZwACqQYyWYREs6A8kWRCAAkPbxkjWZ1aik7a9Io/fTj02gpA5B47t4sqTn8fKuZLZVULalO0mnhbrdKelwUiYCyVIxkswgJZ0D5okgEoGJlain73oen6NKTaSkDUJrMbJykaZKekTQqLCDJ3ZvNbGSG+8ySNEuSxo7l9x9QaqJks4+eVPhks8j4kYP0OAlnQNmhSASg4tBSBqBcmdkgSf8r6cvuvsXMsrqfu8+WNFuSamtrvXAjBFAIUbLZhFGFTzaLTBg1SH8g4QwoOxSJAFQMWsoAlDMz662gQPRbd/9juLnFzMaEs4jGSGqNb4QACqWYyWYREs6A8kSRCEBZo6UMQCWwYMrQryUtdfcfp9w0V9Jlkq4JP86JYXgACixKNjuyCMlmkfEjB4XHJuEMKCcUiQCUJVrKAFSYUyV9UtIiM2sIt31DQXHobjP7rKQ3JV0Yz/AAFFKUbNa7CMlmkeqh/Uk4A8oQRSIAZYWWMgCVyN2fkpRpAaLTizkWAMVXzGSzCAlnQHmiSASg5NFSBgAAKlUcyWYREs6A8kORCEDJStdS1qdXD91LSxkAAKgQcSSbRUg4A8oPRSIAJYeWMgAAgEAcyWYREs6A8kORCEBJoKUMAADg7eJINouQcAaUH4pEABKtadNOfXz201q1gZYyAACAzuJINouQcAaUn7wUiczsbEnXSuop6SZ3v6bT7RbePkPSDkmfdvfn83FsAOUpXUvZhyaO0rUX01IGAAAQiSPZLELCGVB+ci4SmVlPSddLOlPSaknPmtlcd38pZbdzJI0P/50s6ZfhRwDYp629Q/9570v6n/lv7Lf9ux+erE+cfGRMowIAAEimOJPNIiScAeUlHzOJpkta4e6vSZKZ/U5SnaTUIlGdpNvc3SXNN7OhZjbG3ZvzcHwAJY6WMgAAgO6LM9ksQsIZUF7yUSSqlrQq5evVevssoXT7VEt6W5HIzGZJmiVJY8eyGC1QzmgpAwAAOHhxJptFSDgDyks+ikSWZpsfxD7BRvfZkmZLUm1tbdp9AJSutvYOXX3fS7rtaVrKAAAAchFnslmEhDOgvOSjSLRa0hEpXx8uqekg9gFQxmgpAwAAyK84k80iJJwB5SUfRaJnJY03s6MkNUq6WNKlnfaZK+nycL2ikyVtZj0ioDJkain76cU1GtAnLwGLAAAAFSnOZLMICWdAecn5FZq7t5nZ5ZIektRT0s3uvsTMvhDefoOkeZJmSFohaYekz+R6XADJRUsZAABAYSUh2SxCwhlQPvLyNr67z1NQCErddkPK5y7pi/k4FoDkoqUMAACgOJKQbBYh4QwoH/R6AMhZupayMyeO0rW0lAEAABREEpLNIiScAeWDV28ADkqmlrLvzJysv3sXLWUAAACFlIRkswgJZ0D5oEgEoFtoKQMAAIhfEpLNIiScAeWDIhGArPzppRb9w20L9ttGSxkAAEA8kpBsFiHhDCgfvLIDkBEtZQAAAMmTpGSzCAlnQHmgSATgbdK2lPXsoblfOlXHjz4kxpEBAAAgSclmERLOgPJAkQjAPrSUAQAAJF+Sks0iJJwB5YFXfUCFo6UMAACgtCQp2SxCwhlQHigSARWqefNOXTx7vt5Yv2Pftt49Tfd+6T20lAEAACRYkpLNIiScAeWBIhFQYWgpAwAAKG1JSjaLkHAGlAdeEQIVgJYyAACA8pDEZLMICWdA6aNIBJQxWsoAAADKSxKTzSIknAGljyIRUIZoKQOAymNmN0s6T1Kru08Ot10l6XOSorf2v+Hu8+IZIYB8SGKyWYSEM6D08WoRKBNt7R369n0v6dZOLWXfnjlZn6SlDAAqwS2SrpN0W6ftP3H3HxZ/OAAKIYnJZhESzoDSR5EIKHGZWsrmXv4enTCGljIAqBTu/qSZjYt7HAAKK4nJZhESzoDSR5EIKFG0lAEAsnS5mX1K0gJJX3H3jZ13MLNZkmZJ0tixY4s8PADdkcRkswgJZ0Dp45UkUEJoKQMAdNMvJX1bkocffyTp7zvv5O6zJc2WpNraWi/mAAFkL8nJZhESzoDSRpEIKAG0lAEADoa7t0Sfm9mvJN0X43AA5CjJyWYREs6A0kaRCEiwdC1lZ5wwSj+7hJYyAMCBmdkYd28Ov/ywpMVxjgdAbt5KNktukWj8SBLOgFLGq0wgYWgpAwAcDDO7U9Jpkoab2WpJV0o6zcxqFLSbrZT0+bjGByB3byWbDYx7KBlFBSwSzoDSRJEISAhaygAAuXD3S9Js/nXRBwKgYFa0JjfZLBIlnK1g8WqgJFEkAmKWvqVspH52yTRaygAAALDPKy3bNCWhyWYRM9OxIwfplZatcQ8FwEHgFSgQA1rKAAAA0B2lkGwWGT9qMAlnQImiSAQUES1lAAAAOBivrk1+slmEhDOgdFEkAorg0aUt+uyttJQBAADg4ETtW0lONouQcAaULl6dAgXS3uH69n0v6Za/rtxvOy1lAAAA6K5SSDaLkHAGlK6cikRmNkzSXZLGKYhVvcjdN6bZb6WkrZLaJbW5e20uxwWSLF1LWa8eQUvZxCpaygAAANB9pZBsFiHhDChduc4kukLSo+5+jZldEX79tQz7fsDd1+V4PCCxaCkDAABAoZRCslmEhDOgdOX6yrVO0mnh57dKelyZi0RA2aGlDAAAAIVWSslmERLOgNKUa5FolLs3S5K7N5vZyAz7uaSHzcwl3ejuszM9oJnNkjRLksaOHZvj8IDCaN68U5fMnq+VtJQBAACgwEop2SxCwhlQmg5YJDKzP0kaneamb3bjOKe6e1NYRHrEzJa5+5PpdgwLSLMlqba21rtxDKDgaCkDAABAsZVSslmEhDOgNB3wVa27n5HpNjNrMbMx4SyiMZJaMzxGU/ix1czukTRdUtoiEZA0GVvK6ibpk6eMi2VMAAAAqByllGwWIeEMKE25Tn2YK+kySdeEH+d03sHMBkrq4e5bw88/JOnqHI8LFBwtZQAAAEiCUko2i5BwBpSmXItE10i628w+K+lNSRdKkplVSbrJ3WdIGiXpHjOLjneHuz+Y43GBgqGlDAAAAElSSslmERLOgNKU0yted18v6fQ025skzQg/f03S1FyOAxRappayq+sm6VO0lAEAACAmpZhsFiHhDCg9TItARUvXUtazh+leWsoAAACQAKWYbBYh4QwoPRSJUJFoKQMAAEApKMVkswgJZ0Dp4dUwKgYtZQAAACg1pZhsFiHhDCg9FIlQ9tZs3qVLfjVfr6/bvm8bLWUAAAAoBaWYbBYh4QwoPRSJULbStZSdfnzQUjawL099AAAAJF8pJptFSDgDSg+vlFFWaCkDAABAuSjlZLMICWdAaaFIhLJASxkAAADKTSknm0VIOANKC0UilDRaygAAAFCuSjnZLELCGVBaeBWNkkNLGQAAACpBKSebRUg4A0oLRSKUDFrKAAAAUElKOdksQsIZUFooEiHx/rysRX9/Cy1lAAAAqCylnGwWIeEMKC28wkYi0VIGAACASlYOyWYREs6A0kGRCImSrqWsh0n3fuk9mlRV2u+iAABQSGZ2s6TzJLW6++Rw2zBJd0kaJ2mlpIvcfWNcYwSQvXJINouQcAaUDopESIR0LWUfPH6kfk5LGQAA2bpF0nWSbkvZdoWkR939GjO7Ivz6azGMDUA3lUOyWYSEM6B08OobsWnvcH3n/pf0m/9bud92WsoAAOg+d3/SzMZ12lwn6bTw81slPS6KREBJKIdkswgJZ0DpoEiEoluzeZcu/dV8vUZLGQAAhTbK3Zslyd2bzWxk3AMCkJ1ySDaLkHAGlA6KRCiax5a16jO3PLvfNlrKAACIn5nNkjRLksaOHRvzaABI5ZFsFiHhDCgdvDJHQWVqKfvPCybpsnePi2VMAABUkBYzGxPOIhojqTXdTu4+W9JsSaqtrfViDhDA25VTslmEhDOgNFAkQkHQUgYAQCLMlXSZpGvCj3PiHQ6AbJRTslmEhDOgNFAkQl7RUgYAQDzM7E4Fi1QPN7PVkq5UUBy628w+K+lNSRfGN0IA2SqnZLMICWdAaeBVO3JGSxkAAPFz90sy3HR6UQcCIGfllGwWIeEMKA0UiXDQ0rWUmUn30VIGAAAAHLQVrVt11PCBZZFsFqka0l8DSDgDEo8iEbqNljIAAACgcMop2SzSo4dpPAlnQOLxih5ZoaUMAAAAKLxyTDaLkHAGJB9FInSJljIAAACgeKJks3JatDoyfiQJZ0DSUSRCWulayj5w3Ahdd+lJtJQBAAAABRK1Y00owyLRhFEknAFJl9OrfTO7UNJVkk6QNN3dF2TY72xJ10rqKekmd78ml+OiMDK1lF11/kR9+tSj4hkUAAAAUEHKMdksQsIZkHy5TglZLOkjkm7MtIOZ9ZR0vaQzJa2W9KyZzXX3l3I8NvKkZcsuXfKr+XptLS1lAAAAQJzKMdksQsIZkHw5FYncfakkmVlXu02XtMLdXwv3/Z2kOkkUiWJGSxkAAACQLOWYbBYh4QxIvmJUAqolrUr5erWkkzPtbGazJM2SpLFjxxZ2ZBWIljIAAAAgmco52SxCwhmQbAcsEpnZnySNTnPTN919ThbHSDfNyDPt7O6zJc2WpNra2oz7oXtoKQMAAACSrZyTzSIknAHJdsAikbufkeMxVks6IuXrwyU15fiYyBItZQAAAEBpKOdkswgJZ0CyFaNK8Kyk8WZ2lKRGSRdLurQIx61Y7R2u781bql8/9fp+22kpAwAAAJJreWv5JptFollSy1tJOAOSKKcikZl9WNLPJY2QdL+ZNbj7WWZWpSDqfoa7t5nZ5ZIektRT0s3uviTnkeNtaCkDAAAAStfylvJNNotECWfLW0g4A5Io13SzeyTdk2Z7k6QZKV/PkzQvl2MhM1rKAAAAgNJXzslmERLOgGSjglCiaCkDAAAAykclJJtFxo8arCdeIeEMSCKKRCWGljIAAACg/FRCslkkSjjbtGOPhg4g4QxIEopEJSJdS9lpx43Q9bSUAQAAACWvEpLNIlHC2SstJJwBSUN1IcFoKQMAAAAqQyUkm0VIOAOSiyJRAqVrKZOClrLJ1bSUAQAAAOWmEpLNIiScAclFkShBHn+5VZ/+DS1lAAAAQKWphGSzCAlnQHJReYgZLWUAAABAZaukZLMICWdAMlEkigktZQAAAACkyko2i5BwBiQTRaIiy9RSdt2lJ2kQLWUAAABAxamkZLMICWdAMlGVKAJaygAAAABkUknJZhESzoBkokhUQC1bdunSX83Xq7SUAQAAxGpve4eefGWtXl27TR88fpSOHVk5MzZS7dzTrkeXtah1y26dNXm0qof2j3tIsdiya68eWrxGu9s6dPbk0Ro+qG+s46mkZLNIkhLOGjft1EOL12jkIX11+vGj1L9Pz7iHFIsVrdv052UtOmbEIL1vwoiKej5G3F2LG7foqRXrNPWIIXrXUYepRw+Le1hFRZGoAGgpAwAAiJ+767k3Nqq+oVH3v9isjTv2SpK+N2+ZplQPUV1Nlc6fWqVRh/SLeaSF1dbeob++ul71DY16aPEabd/TLkm6+r6XNP2oYZpZU60ZU0aX/bowu9va9diytZrT0KhHl7VqT1uHJOnKuUv03vHDNbOmWmdOHBVLqnAlJZtF4k4427Rjj+5f1Kw5C5v0t5Ub9m0f2Kenzpo8WjNrqvXuYw5TrzIvlLRs2aV7X2hSfUOjFjdu2bf90AG9de6JYzSzplrvOPJQmZV3oeSN9ds1pyE4D6nrBo8+pJ8uqKlSXU2VJo45pOzPg0SRKG8ytZRdef5EfYaWMgAAgKJZ3rJV9Q2NmtPQpNUbd6pf7x4644RRmllTrePHDNaDi9doTkOTvnP/Un1v3lKdcsxhqqup1tmTR+uQfr3jHn5euLteXL1Z9Q2NuveFZq3btluD+/Xa96Kvamj/fS8Mv3HPIl05d7HeP2GkZk6r0hknjFK/3uUxk6KjwzX/9fWa29CkeYuatWVXm4YP6qNLp49VXU2V+vfpqTkNTZrb0KQv39Wg/r176syJozRzWpXeO744MykqMdksUuyEs5172vWnpS2a09CkJ15p1d521zEjBuorZ07Q+VOr1LRpp+obGvXAojX64/ONGj6or86fGvzMnHj4kLIpEGzZtVcPLlqjOS806q+vrpe7NKV6iP793BN09uTRWtYc/A79w3Ordfv8N3X4of1VV1OlmTXVGh+uJVUO1m3brftfbFZ9Q6MWvrlJkjT9qGH6h/ccrQ8cP0LPrtyoOQsbdfNTr2v2k69p/MhBmjmtWhdMrdIRwwbEO/gCMnePewwZ1dbW+oIFC+IeRpdat+zSpTc9oxWt+0+TpKUMAFAOxl1xvyRp5TXnFuTxzew5d68tyINjHzNbKWmrpHZJbV2d81K4/kqnefNOzW1oUn1Dk5Y2b1EPk94zfoRm1lTpQ5NGp53NvaJ1m+Y2NKq+oUlvbtihPr166IwTRqquplqnHTdCfXuVXqHk9XXbVb+wUXNfaNLr67arT88e+uDxQfHntONGvq344+5a0rRl331at+7WoL69dNak0Zo5rUrvPma4epZYq4W766XmLfuKP2u27Apmh0warbpp1To1zeyQjg7XgnDW2bxFzdq0Y6+GDeyjc6eM0cxpVTppbOFmUixu3Kzzfv6UfvGJkzRjypiCHCOpbnziVX3/gWVq+NaZBZvJlm4m3ahD+uqCqVWqq6nWpKq3zw7Ztbddjy1rVX1Dox5btlZ72jt01PCBqqsJ7nPU8NJbOyrdTLojDxuguqlVqptWrWNGvL0Fd9vuNj20eI3qGxr1fyvWqcOliWMO0cxpVbpgarVGDym9WZjbd7fpkZdaVN/QqL8sX6f2DtfxowerrqZaF9RUpW3B3bA9mnXWqAVvbJQk1R55qOqmVevcKWM0bGBpzsLMdA1Gkegg0VIGAKgEFInKQ1gkqnX3dQfaN8nXX51t3rlXDywK3gV+5vUNcpemHjFUM2uqdN6JVRoxOLt1ZtxdC1dt0pyFjbrvxWat375Hh4SzbupqqjV93LBEr0nRunWX7nuhWXMaGvXC6s0yk9511GGaOa1KZ08eoyH9s5sd1d7hmv/aetUvbNSDi9do6+42jRjcV+efWKWZ06o0pTrZMylWbdihuS80qX5ho5a3blOvHqb3TxihumnVOvOE7NeZ2dPWoSdeWav6hkb96aUW7W7r0BHD+qtuarVmTqvSsSPzO5Pij8+v1r/e/YL+9K/vy/tjJ91jy1r1mVue1d2fPyWvi1ennUnXt5fOmRK0kZ189GFZFz8379irBxZ3+j1z+BDV1VTr/KnZ/56JQ0eH65nXN2hOWPzcsqtNhw3so/OnBu1TNUcMzfpneu3W3brvxaAQ/8KqTTKTTg7bVc+Zkv3vmTjsbe/QX5avVf3CJj3yUot27m1X9dD+uiCcHXXc6Ox/7qLfM3MaGvVKS/B75n0TRqiupkofmji6pNazokiUB7SUAQAqDUWi8lBORaJCv8O/t71DT61YpzkLG/XwSy3asaddY4b00wVTqzRzWrVOGHNInr6T3HT1Dv/5U6s0ZkhuC1Lv2tuuPy9rVf3CRj3+cnCejx4+cN+LqnEJmUlR6Hf4t+7aq4eWtGhOAWdS/ODBZbrpL6/ppavPrriFgldv3KH3/OAxfffDk/WJk4/M+fFWrtu+r9U0mkn3geNHaGZNtT5w/Ntn0nVX8+adQZvmwia9FM5YPPXYYD2rsyann7FYbO6upc1bNachmB3YvHmXBkQz6Wqq9J5jh+e8ztLr67ZrTgHPcz64u55/c6PqFzbp/kXN2rB9j4YO6K0ZU4L2wdojD82p+F+M81xoFIlyQEsZAKBSUSQqD2b2uqSNklzSje4+u9PtsyTNkqSxY8e+44033ij+ILsQ1wyXHXuCtoQ5DU168pW1autwHTdq8L5FTA8/tLhrUqSb4VKMtULSzqQ4iBlb+bJzT7seWdqiOQsb9UT4/1KMtULyNWOrs3+49Vm9uWGHHv6X9+d5xMnX0eGafNVDuqj2CF11waSDeowuZ7hMHqMhAwozw6Wrtc/eN2GE+vQqboFg9cYdmtOQfobLmRNHaUCf/BewMq19ds7k7s/YypcVrVtVv7BJc15o1KoNO9W3Vw+dMTH4f3l/gf5f0s3YGj6oj847sfsztoqJItFBSNdS9v4JI3T9J2gpAwBUBopE5cHMqty9ycxGSnpE0pfc/cl0+8Z9/RVJXSvn3heb1LJl/7VyTjm6uKlD67ft1rxFzapvaNJz4YyVd447VHU1wYyVQwu0JkW6tXIOHdB734uPYqcONW0KZ1KEaz/17GHhTIrMaz/lQ1s0w6uhSQ8tWaMde9o1+pB+qqup0gUxpA69tnbbvhfkK9cH61l98LjMaz915X3/9ZimHD5E1196UgFHnFx11z2lgX176Y7PvSvr+xR6Jl13pEtRHDqgd7ieVbXeMTa3GStd2bh9j+5LyFo5B7P2U76s2bxLc19oTMQMr4xrP9VUq66mKu3aT3GhSJSl9g7X9+ct1U20lAEAQJGoDJnZVZK2ufsP090ed5HozfU7NKehUfUNjXp17Xb17mmJS91atSEaY5NWtG4LxzhCdTXVOqMba9905eU1wSyFuQ1NatwUzFL40MTRRU3dOpBXWraqfmEwkyIa45kTR6tualVeZlK4uxpWbdKchibd92KT1m0L1oqaMSVYK+rko+JfK8rd9cLqzapf2LhvjIP79dKMyWNUV1N1wJkUO/e0a+KVD+rLp0/QP58xvogjT45/+/0LeuKVtXr2m2d0ud+etg49Gc2kW9qiXXuLM5OuO/a2R2Ns0iMvrdGuvR2qHtp/Xztsd9a+ySSumXTdHWPnFLljRw7SzJqgTXPsYbmPcfPOvXpwcbPqFzZp/uvr91sr6rypYzRycPyLamdKkaurqdIFU6s08pB4x0iR6ABoKQMA4O0oEpU+MxsoqYe7bw0/f0TS1e7+YLr94ygSrd+2W/cvalb9wkY9H8UQjxumumlVmjG5cLN0chXNdpr7QqcUrcmjVVeTPkWrK02bdu5beHnZmq3q2cP0nmOHa+a0YEHUgQmdyd7R4XruzY2akzKT4tBo7Y+DmEnx2tptqm9o0tyUWTqnHx+kzn3g+OSmzrW1d+j/Xl2vOQsb9dCSYCbF6EP66fypYzLOpKjkZLNIVwln0XOrfmGj7k+ZSXfuicG6MsWeSdcd23a36eEla1Tf0KT/W/FWilZUzKlKk6KVSabnVtT6WuyZdN2xcfsezVvcrDkLm/S3lRskSSeNHaqZ4WynwwZl3666a2+7Hn+5VfULm/Tnl4NZOuNSZukcnaBZOp21bNkVzsJs1OLGYLbTu48ZrrqaKp09ebQG9yv+wt8UiTJI11L2vgkj9AtaygAAoEhUBszsaEn3hF/2knSHu3830/7FKhJF6/3UL2zUk2EM8XGjBqtuWvAOa7HX+8lVe4frmdfXa87CJs1b3Kytu9o0fFBfnXdiUCiZenj6dZM279ireYuDAtnfVgbr/dRE6/1MrdLwbryASoI9bWGKUJqZFDOnVWtChtkerVt36d5wvZ8Xw/V+Tjn6MM2sqdbZU0brkBheQOXirZkUwcLfbR1vzaSoq6neN9ujkpPNIukSzjLNUptZE8xSS8JMuu5Yu3W37g/XTWoI102aPm6YZk6r1owM6yZ1OUttWpVOPqr46/3kavXGMBlsYZNebtmqXj1M7x0/XDOnVWdcN6mjwzX/bb9bg/V+uvrdmmQrWreG7apNenPDjmDdpBNGqa4maFct1npWFIlS0FIGAEB2KBJVnkIWifa2d+ip5etU39Coh5cEMcRVQ/rpgpogWvz40clIDsvVfu92L2vdl8AWJaSNGdJPjy4NEtoefzloxTh6+MB974YnJTksV6kzKZ5avlYdLp0w5pCg5aSmSoP69npbctikqkM0M4wWz0dyWBJsjBLYGhr17Mpg3Zh3HHmoZtZUaemarfr9glUVmWwWiRLO/un08RrYp2fR17sqtpXrtu9bz+q1MBnstONGaOa0an3w+JFq2rRz//WuevbQB48/uPWukmxp85Z9LbVRMtiHJo5S3bRqvffY4Vq2ZuvbZ2lOGq26ad2fpZlUQQLbJs1paNR9LwYJbEP6RwlsVXrnuMK21FIkCr2+brs+8MPH37Z9/MjkTk0DACAuy8M2bIpElaNQRaL7XmzSlXOWaH2RL4Ljlm7djH69e2jX3g6NGBws6jqzplqTq5PbLpIP6RKoevfsoT1tHTpiWH/NDAtk5T6bZtWGcCZFmEAlSRNGDarIZLNIlHC2Y0+7pLdm0p0bQ3JeMbm7FjVuVv3CJt37YpPWbt2973dD6ky6syaPPujkvFLQ0eH628oN+9pVt+xq23ceevUwnXZcftd7S6q90eL8Cxv1UMqbKD/+eI3edfRhBTkmRaLQ+m279Y7v/ElS0FY2qG/5PtEAAMjVvEVr9Ol3jzvoaOIDoUiUPIUqEj3/5kb9+i+vq66mSu8/LrnryhRS8+YgGWzVhp06a9JonXJM6bWL5MPr67ZrbkOTtuzaqxlTxuikscmMhy4kd9fS5q2678UmTa4eUrHrEUVun/+GNmzfowumls9Muu5o73A9/ep6PbRkjcYOG1BWM+m6Y3dbu554ea0ee3mtJlUdUtDkyCRLbcf+7oendGv9qu6gSAQAABKHIlHycP0FAED5y3QNVvqNfAAAAAAAAMhZTkUiM7vQzJaYWYeZZXwX0MxWmtkiM2swM96aAgAAAAAASJhcl4hfLOkjkm7MYt8PuPu6HI8HAAAAAACAAsipSOTuSyVV3EJzAAAAAAAA5aZYaxK5pIfN7Dkzm9XVjmY2y8wWmNmCtWvXFml4AAAAAAAAle2AM4nM7E+SRqe56ZvuPifL45zq7k1mNlLSI2a2zN2fTLeju8+WNFsK0jWyfHwAAAAAAADk4IBFInc/I9eDuHtT+LHVzO6RNF1S2iIRAAAAAAAAiq/g7WZmNtDMBkefS/qQggWvAQAAAAAAkBDmfvAdXWb2YUk/lzRC0iZJDe5+lplVSbrJ3WeY2dGS7gnv0kvSHe7+3Swff62kNw6w23BJpKblhnOYH5zH3HEO84PzmDvOYX5kcx6PdPcRxRgMspPl9dfB4mcrwHkIcB4CnIcA5yHAeQhwHgKFPA9pr8FyKhIlgZktcPfauMdRyjiH+cF5zB3nMD84j7njHOYH5xGd8ZwIcB4CnIcA5yHAeQhwHgKch0Ac56FY6WYAAAAAAABIMIpEAAAAAAAAKIsi0ey4B1AGOIf5wXnMHecwPziPueMc5gfnEZ3xnAhwHgKchwDnIcB5CHAeApyHQNHPQ8mvSQQAAAAAAIDclcNMIgAAAAAAAOSIIhEAAAAAAABKr0hkZhea2RIz6zCzjFFwZrbSzBaZWYOZLSjmGJOuG+fwbDN72cxWmNkVxRxjKTCzYWb2iJktDz8emmE/noudHOi5ZYGfhbe/aGYnxTHOJMviHJ5mZpvD512DmX0rjnEmmZndbGatZrY4w+08D7OQxXnkuQhJXFdIkpkdYWaPmdnS8Frsn+MeU1zMrKeZLTSz++IeS5zMbKiZ/cHMloXPi1PiHlOxmdm/hD8Pi83sTjPrF/eYiiXd39BsX2OUiwzn4L/Dn4kXzeweMxsa4xCLoqvrKTP7NzNzMxtejLGUXJFI0mJJH5H0ZBb7fsDda9w9YyGkQh3wHJpZT0nXSzpH0kRJl5jZxOIMr2RcIelRdx8v6dHw60x4LoayfG6dI2l8+G+WpF8WdZAJ142fz7+Ez7sad7+6qIMsDbdIOruL23keZucWdX0eJZ6LFY/rin3aJH3F3U+Q9C5JX6zQ8yBJ/yxpadyDSIBrJT3o7sdLmqoKOydmVi3pnyTVuvtkST0lXRzvqIrqFr39b2h3XmOUg1v09nPwiKTJ7n6ipFckfb3Yg4rBLUpzPWVmR0g6U9KbxRpIyRWJ3H2pu78c9zhKWZbncLqkFe7+mrvvkfQ7SXWFH11JqZN0a/j5rZJmxjeUkpLNc6tO0m0emC9pqJmNKfZAE4yfzzxw9yclbehiF56HWcjiPAISv7ckSe7e7O7Ph59vVVAQqI53VMVnZodLOlfSTXGPJU5mdoik90n6tSS5+x533xTroOLRS1J/M+slaYCkppjHUzQZ/oZW1GuMdOfA3R9297bwy/mSDi/6wIqsi+upn0j6qqSiJY6VXJGoG1zSw2b2nJnNinswJaha0qqUr1erAi9iDmCUuzdLwUWfpJEZ9uO5uL9snls8/7qW7fk5xcxeMLMHzGxScYZWVnge5g/PRfDz1ImZjZM0TdIzMQ8lDj9V8KKnI+ZxxO1oSWsl/SZsvbvJzAbGPahicvdGST9UMEuiWdJmd3843lHFLtvXGJXi7yU9EPcg4mBmF0hqdPcXinncXsU8WLbM7E+SRqe56ZvuPifLhznV3ZvMbKSkR8xsWVidqwh5OIeWZlvRqpdJ0dV57MbDVPRzMY1snls8/7qWzfl5XtKR7r7NzGZIqlfQNoXs8TzMD56LkPh52o+ZDZL0v5K+7O5b4h5PMZnZeZJa3f05Mzst5uHErZekkyR9yd2fMbNrFbQW/Ue8wyqecL2dOklHSdok6fdm9nfufnusA0MimNk3FbTp/jbusRSbmQ1Q8JrzQ8U+diKLRO5+Rh4eoyn82Gpm9yiY5lwxL8zzcA5XSzoi5evDVUFTPyNdnUczazGzMe7eHLagtGZ4jIp+LqaRzXOL51/XDnh+Ul90uPs8M/uFmQ1393VFGmM54HmYBzwXEeLnKWRmvRUUiH7r7n+MezwxOFXSBWHRuJ+kQ8zsdnf/u5jHFYfVkla7ezSb7A8q//VnOjtD0uvuvlaSzOyPkt4tqZKLRFm9xih3ZnaZpPMkne7ulfimwjEKiqcvmJkU/N183symu/uaQh64LNvNzGygmQ2OPldQfUubuoKMnpU03syOMrM+ChaQmxvzmJJmrqTLws8vk/S2GVo8F9PK5rk1V9KnLPAuBVOPm4s90AQ74Dk0s9EW/kUxs+kKft+vL/pISxvPwzzguYgQ1xUKUhMVrD+z1N1/HPd44uDuX3f3w919nILnwZ8rtECk8IXeKjM7Ltx0uqSXYhxSHN6U9C4zGxD+fJyuClu8O40DvsYod2Z2tqSvSbrA3XfEPZ44uPsidx/p7uPC35erJZ1U6AKRlNCZRF0xsw9L+rmkEZLuN7MGdz/LzKok3eTuMySNknRPeE3aS9Id7v5gbINOmGzOobu3mdnlkh5SkDJws7sviXHYSXSNpLvN7LMK/sBdKEk8F7uW6bllZl8Ib79B0jxJMyStkLRD0mfiGm8SZXkOPybpH82sTdJOSRdX6LswGZnZnZJOkzTczFZLulJSb4nnYXdkcR55LiLj762YhxWHUyV9UtIiM2sIt33D3efFNyTE7EuSfhsWT19Thf2tCdvs/qCgNblN0kJJs+MdVfFk+Bua9jVGucpwDr4uqa+CpTokab67fyG2QRZBuvPg7r+OZSxcpwEAAAAAAKAs280AAAAAAADQPRSJAAAAAAAAQJEIAAAAAAAAFIkAAAAAAAAgikQAAAAAAAAQRSIAAAAAAACIIhEAAAAAAAAk/f9RMmuQb9SrLwAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<Figure size 1440x288 with 2 Axes>"
      ]
     },
     "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), np.imag(syms))\n",
    "left.set_title(\"AC Constellation Diagram\")\n",
    "\n",
    "xc = np.convolve(fir_syms, syms)\n",
    "right.plot(np.abs(xc))\n",
    "right.set_title(\"AC Autocorrelation\")\n",
    "\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",
    "# print(chunks)\n",
    "# print(syms)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "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.8.11"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}