aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--notebooks/FIR_mehrere.ipynb237
-rw-r--r--simulation/QAM_Fading/Alte_versionen/qam_fading.grc (renamed from simulation/QAM_Fading/qam_fading.grc)0
-rwxr-xr-xsimulation/QAM_Fading/Alte_versionen/qam_fading.py724
-rw-r--r--simulation/QAM_Fading/epy_block_0.py26
-rw-r--r--simulation/QAM_Fading/qam_fading_V2.grc4
-rw-r--r--simulation/QAM_Fading/qam_fading_V2_eigerner_block.grc39
-rwxr-xr-xsimulation/QAM_Fading/qam_fading_block.py3
7 files changed, 952 insertions, 81 deletions
diff --git a/notebooks/FIR_mehrere.ipynb b/notebooks/FIR_mehrere.ipynb
index 1be4234..710db99 100644
--- a/notebooks/FIR_mehrere.ipynb
+++ b/notebooks/FIR_mehrere.ipynb
@@ -84,52 +84,22 @@
]
},
{
- "cell_type": "code",
- "execution_count": 6,
- "id": "6dc4dc1f",
- "metadata": {},
- "outputs": [
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "/tmp/ipykernel_2862/4026507591.py:1: VisibleDeprecationWarning: Creating an ndarray from ragged nested sequences (which is a list-or-tuple of lists-or-tuples-or ndarrays with different lengths or shapes) is deprecated. If you meant to do this, you must specify 'dtype=object' when creating the ndarray\n",
- " np.array(x)\n"
- ]
- },
- {
- "data": {
- "text/plain": [
- "array([list([1, 0, 0, 0, 0.2]), list([1, 0, 0, 0, 0, 0, 0.5]),\n",
- " list([1, 0, 0, 0.8])], dtype=object)"
- ]
- },
- "execution_count": 6,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "np.array(x)"
- ]
- },
- {
"cell_type": "markdown",
"id": "5ad0edf9",
"metadata": {},
"source": [
- "# Dealy\n"
+ "# Dealy Window\n"
]
},
{
"cell_type": "code",
- "execution_count": 7,
+ "execution_count": 6,
"id": "bf92d73a",
"metadata": {},
"outputs": [
{
"data": {
- "image/png": "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\n",
+ "image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
@@ -141,7 +111,7 @@
}
],
"source": [
- "d = 2.5\n",
+ "d = 3.3\n",
"k = np.linspace(-5,10,1000)\n",
"h_ideal = np.sinc(k-d)\n",
"plt.plot(k,h_ideal)\n",
@@ -151,13 +121,13 @@
},
{
"cell_type": "code",
- "execution_count": 8,
+ "execution_count": 7,
"id": "dd93e444",
"metadata": {},
"outputs": [
{
"data": {
- "image/png": "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\n",
+ "image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
@@ -169,7 +139,7 @@
}
],
"source": [
- "n = 4\n",
+ "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",
@@ -186,40 +156,39 @@
"id": "12b0c2d2",
"metadata": {},
"source": [
- "# Frequensbereich Faltung "
+ "# FIR"
]
},
{
"cell_type": "code",
- "execution_count": 12,
+ "execution_count": 8,
"id": "efc93b69",
"metadata": {},
"outputs": [],
"source": [
- "delay = 3.4\n",
- "amplitude = .2\n",
+ "delay = 3\n",
+ "amplitude = 1\n",
"\n",
"d_int = int(np.floor(delay))\n",
"d_frac = delay - d_int\n",
"\n",
- "h = np.concatenate([np.zeros(d_int-1), [amplitude], np.zeros(3)])"
+ "h_int = np.concatenate([np.zeros(d_int-1), [amplitude], np.zeros(3)])"
]
},
{
"cell_type": "code",
- "execution_count": 10,
+ "execution_count": 9,
"id": "43372541",
"metadata": {},
"outputs": [],
"source": [
"H_int = fft(h_int)\n",
- "#H = H_int * np.exp(-1j*d_frac)\n",
"h = ifft(H_int)"
]
},
{
"cell_type": "code",
- "execution_count": 13,
+ "execution_count": 10,
"id": "a32cb580",
"metadata": {},
"outputs": [
@@ -229,13 +198,13 @@
"<StemContainer object of 3 artists>"
]
},
- "execution_count": 13,
+ "execution_count": 10,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
- "image/png": "iVBORw0KGgoAAAANSUhEUgAAAW4AAAD4CAYAAADM6gxlAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAAAU+klEQVR4nO3df2wkZ33H8c+XjQ/2QlJTsgW8Ib2kQpZKrsXIor1ehWj4YWgRcU/9kSAqCqruVNEWqsppzB8N/6CLaorgj4LqEiAIOI5eHBPxyyClNAW1OXxxdE6TbgshmKxDbtNoIWkXzmd/+4d3j/the2f2ZmbnmX2/pCj2eNbzfeaZ+Xhvnpl9zN0FAAjHc/pdAAAgHoIbAAJDcANAYAhuAAgMwQ0AgbksjV961VVX+Z49e9L41QBQSCdOnHjK3StR1k0luPfs2aPFxcU0fjUAFJKZfT/qulwqAYDAENwAEBiCGwACQ3ADQGAIbgAITKS7SszsLyX9iSSXtCzpHe7+kzQLy4v5pbpmFmpabbY0MlzW1MSoJseq/S4LMdGPKJKu77jNrCrpLySNu/v1kkqSbkq7sDyYX6prem5Z9WZLLqnebGl6blnzS/V+l4YY6EcUTdRLJZdJKpvZZZJ2S1pNr6T8mFmoqbW2ft6y1tq6ZhZqfaoIvaAfUTRdg9vd65I+IGlF0hOSfuTuX7twPTM7aGaLZrbYaDSSr7QPVputWMuRT/QjiibKpZIXSLpR0rWSRiRdbmZvu3A9d59193F3H69UIj21mXsjw+VYy5FP9COKJsqlktdJ+p67N9x9TdKcpN9It6x8mJoYVXmodN6y8lBJUxOjfaoIvaAfUTRR7ipZkfTrZrZbUkvSayUNxAeRdO46uOXYSZ1e31CVuxGCRD+iaLoGt7vfb2bHJD0g6YykJUmzaReWF5NjVR05viJJOnpoX5+rQa/oRxRJpPu43f02SbelXAsAIAKenASAwBDcABAYghsAAkNwA0BgCG4ACAzBDQCBIbgBIDAENwAEhuAGgMAQ3AAQGIIbAAJDcANAYAhuAAgMwQ0AgSG4ASAwBDcABKbrRApmNirp6DmLrpP0N+7+obSKSsv8Ul0zCzWtNlsaSXH6qqy2g3Rl0Y8cK+hFlKnLapJeIUlmVpJUl3R3umUlb36prum5ZbXW1iVJ9WZL03PLkpToiZLVdpCuLPqRYwW9inup5LWSvuvu30+jmDTNLNTOniAdrbV1zSzUgtwO0pVFP3KsoFdxg/smSUe2+oGZHTSzRTNbbDQal15ZwlabrVjL874dpCuLfuRYQa8iB7eZ7ZL0Fkn/tNXP3X3W3cfdfbxSqSRVX2JGhsuxlud9O0hXFv3IsYJexXnH/SZJD7j7k2kVk6apiVGVh0rnLSsPlTQ1MRrkdpCuLPqRYwW96jo4eY6btc1lkhB0BntuOXZSp9c3VE1pBD+r7SBdWfQjxwp6FSm4zWy3pNdLOpRuOemaHKvqyPEVSdLRQ/uC3w7SlUU/cqygF5GC293/T9ILU64FABABT04CQGAIbgAIDMENAIEhuAEgMAQ3AASG4AaAwBDcABAYghsAAkNwA0BgCG4ACAzBDQCBIbgBIDAENwAEhuAGgMAQ3AAQGIIbAAITdQacYUkfk3S9JJf0Tnf/txTrGijzS3XNLNS02mxpJMXpq7LaDoB0RZ1z8sOSvuruv9ee7X13ijUNlPmluqbnltVaW5ck1ZstTc8tS1KioZrVdgCkr+ulEjO7UtKrJd0hSe5+2t2bKdc1MGYWamfDtKO1tq6ZhVqQ2wGQvijXuK+T1JD0CTNbMrOPmdnlF65kZgfNbNHMFhuNRuKFFtVqsxVred63AyB9UYL7MkmvlPRRdx+T9L+Sbr1wJXefdfdxdx+vVCoJl1lcI8PlWMvzvh0A6YsS3I9Letzd729/f0ybQY4ETE2MqjxUOm9ZeaikqYnRILcDIH1dg9vdfyjpB2bWOcNfK+nhVKsaIJNjVR0+sFe7SptdUR0u6/CBvYkPGGa1HQDpi3pXyZ9L+kz7jpJHJb0jvZIGz+RYVUeOr0iSjh7aF/x2AKQrUnC7+4OSxtMtBQAQBU9OAkBgCG4ACAzBDQCBIbgBIDAENwAEhuAGgMAQ3AAQGIIbAAJDcANAYAhuAAgMwQ0AgSG4ASAwBDcABIbgBoDAENwAEJhIn8dtZo9JekbSuqQz7p74Z3PPL9U1s1DTarOlkeGypiZGmZ0FW+JYySf6JTtRZ8CRpN9y96fSKGJ+qa7puWW11tYlSfVmS9Nzy5JEx+M8HCv5RL9kKxeXSmYWamc7vKO1tq6ZhVqfKkJecazkE/2SrajB7ZK+ZmYnzOzgViuY2UEzWzSzxUajEauI1WYr1nIMLo6VfKJfshU1uPe7+yslvUnSu8zs1Reu4O6z7j7u7uOVSiVWESPD5VjLMbg4VvKJfslWpOB299X2/09JulvSq5IsYmpiVOWh0nnLykMlTU2MJrkZFADHSj7RL9nqGtxmdrmZXdH5WtIbJD2UZBGTY1UdPrBXu0qb5VSHyzp8YC+DGrgIx0o+0S/ZinJXyYsk3W1mnfU/6+5fTbqQybGqjhxfkSQdPbQv6V+PAuFYySf6JTtdg9vdH5X0qxnUAgCIIBe3AwIAoiO4ASAwBDcABIbgBoDAENwAEBiCGwACQ3ADQGAIbgAIDMENAIEhuAEgMAQ3AASG4AaAwBDcABAYghsAAkNwA0BgCG4ACEyUGXAkSWZWkrQoqe7ub06vJEQxv1TXzEJNq82WRobLmpoYZZooYEBEDm5J75b0iKQrU6oFEc0v1TU9t6zW2rokqd5saXpuWZIIb2AARLpUYmZXS/odSR9LtxxEMbNQOxvaHa21dc0s1PpUEYAsRb3G/SFJt0ja2G4FMztoZotmtthoNJKoDdtYbbZiLQdQLF2D28zeLOmUu5/YaT13n3X3cXcfr1QqiRWIi40Ml2MtB1AsUd5x75f0FjN7TNLnJN1gZp9OtSrsaGpiVOWh0nnLykMlTU2M9qkiAFnqGtzuPu3uV7v7Hkk3SbrX3d+WemXY1uRYVYcP7NWu0mb3VYfLOnxgLwOTwICIc1cJcmRyrKojx1ckSUcP7etzNQCyFCu43f0bkr6RSiUAgEh4chIAAkNwA0BgCG4ACAzBDQCBIbgBIDAENwAEhuAGgMAQ3AAQGIIbAAJDcANAYAhuAAgMwQ0AgSG4ASAwBDcABIbgBoDAENwAEJiuEymY2fMk3Sfpue31j7n7bWkXBiAZ80t1zSzUtNpsaWS4rKmJUaa5C1yUGXB+KukGd3/WzIYkfdPMvuLu/55ybQAu0fxSXdNzy2qtrUuS6s2WpueWJYnwDliUyYLd3Z9tfzvU/s9TrQpAImYWamdDu6O1tq6ZhVqfKkISIl3jNrOSmT0o6ZSkr7v7/Vusc9DMFs1ssdFoJFwmgF6sNluxliMMkYLb3dfd/RWSrpb0KjO7fot1Zt193N3HK5VKwmUC6MXIcDnWcoQh1l0l7t7U5izvb0yjGADJmpoYVXmodN6y8lBJUxOjfaoISega3GZWMbPh9tdlSa+T9J8p1wUgAZNjVR0+sFe7SpunenW4rMMH9jIwGbgod5W8RNKdZlbSZtB/3t2/mG5ZAJIyOVbVkeMrkqSjh/b1uRokoWtwu/tJSWMZ1AIAiIAnJwEgMAQ3AASG4AaAwBDcABAYghsAAkNwA0BgCG4ACAzBDQCBIbgBIDAENwAEhuAGgMAQ3AAQGIIbAAJDcANAYAhuAAhM18/jNrOXSvqUpBdL2pA06+4fTruwbuaX6ppZqGm12dLIcFlTE6PM6pGwrPYxfQnEE2UGnDOS/srdHzCzKySdMLOvu/vDKde2rfmluqbnltVaW5ck1ZstTc8tSxInfEKy2sf0JRBf10sl7v6Euz/Q/voZSY9I6usZNbNQO3uid7TW1jWzUOtTRcWT1T6mL4H4Yl3jNrM92pzG7P4tfnbQzBbNbLHRaCRU3tZWm61YyxFfVvuYvgTiixzcZvZ8SXdJeo+7//jCn7v7rLuPu/t4pVJJssaLjAyXYy1HfFntY/oSiC9ScJvZkDZD+zPuPpduSd1NTYyqPFQ6b1l5qKSpidE+VVQ8We1j+hKIL8pdJSbpDkmPuPsH0y+pu86g1S3HTur0+oaq3ImQuKz2MX0JxBflrpL9kv5I0rKZPdhe9l53/3JqVUUwOVbVkeMrkqSjh/b1s5TCymof05dAPF2D292/KckyqAUAEAFPTgJAYKJcKkHK5pfqWlpp6vT6hvbffi/XeAPFE6DICsHdZ50nB0+vb0jiycFQ8QQossSlkj7jycFioB+RJYK7z3hysBjoR2SJ4O4znhwsBvoRWSK4U9AZbLz/e09r/+33an6pvu26vT45GGcbSF+e+5FjpXgYnExY3MHGzrL3f/5f9JRfqZHh3V3vRmBAM386+33mrvu0euaK3PQjx0oxEdwJ22mQarsTZXKsqpd95SOSpJff+s1UtoH0TY5VNfngpze/eceXuq6fRT9yrBQTl0oSlsUgFQNhxcCxgl4R3AnLYpCKgbBi4FhBrwjuhGXxMaV5Hwjbf/u9uvbWLzEQ1kWejxXkG9e4E9bLYGMW28hyIIynB6PJ67GC/CO4UxB3sDGLbTAQlk95PFaQf1wqGRAMhAHFQXAPCAbCgOLoGtxm9nEzO2VmD2VRUJoG+QmyrAbChkrnz7kxVLJgB8LiHi/zS3Xt/+7bdG3tT4M/vvI6yJzXurIW5R33JyW9MeU6Urfd4NygdPzkWFWHD+xVxX4kk6s6XNbhA3uTv/bsXb4PRNzjpbN+/cyVclnQx9fZtjRbcuXnXMlrXf3QNbjd/T5JT2dQS6r42M3N8P7kFR/RF6+8Xd+69YbEQ3tmoaa1jfOTem3Dg9zHcY+XIh1feW1LXuvqh8SucZvZQTNbNLPFRqOR1K9NDANn6SvSPo7blkFue1byWlc/JBbc7j7r7uPuPl6pVJL6tYlh4Cx9RdrHcdsyyG3PSl7r6oeBuauEJ8jiizs4V6R9HLctg9z2rOS1rn4YmAdweIIsnl6etCzSPo7bliK2/ZZjJ3V6fUPVnEx83MtH5xZV1+A2syOSXiPpKjN7XNJt7n5H2oWlgSfIouv1Kcgi7eO4bSla248cX5EkHT20r8/V/Ezcj84tqq7B7e43Z1EI8oWBICC/BuYaN+JhIAjIL4IbW2IgCHEN8pPJWRuYwUnEU6TBNqSPuS2zRXBjW0UabEO6+EjfbHGpBMAlYzA7WwQ3gEvGYHa2CO4uGHBJX1ZzYdKP6WEwO1tc494BAy7py3IuTPoxPQxmZ4t33DvgYyTTl8U+ph+zkfbHBuNnCO4dMOCSPubCBOIjuHfAgEv6mAsTiI/g3gEDLunrZR8P8sfNSsWZd7Eo7egHBid3wIBL+uLu40H/uNlO+zvX7EMdaC1KO/qF4O6CpwfTF2cfD/rHzRblCcWitKNfuFSCoAz6QGNR2l+UdvQLwY2gDPpAY1HaX5R29Euk4DazN5pZzcy+Y2a3plFI3AEnnoQbTEUbaIxramJUQyU7b9lQyRJvf9rnV5b9GHcQtJdB06wHWqNMXVaS9PeSXi/pcUnfNrN73P3hpIqIO+DEk3CDq0gDjT3zLt9foizOr6zmj4w7CNrLoGk/BlrNfedeN7N9kt7n7hPt76clyd0Pb/ea8fFxX1xcjFzE/tvvVb3Z0qGTX9B1P/rZX6pdvqFfXvufi9Z/eOiFOm0X/2Nhu/XPtf6TZyRJpeddEbm+LF5DXdQV5TXP/uSMNrY4Z59jpuc/b/v3YXG2ccnn15Dp8pePd92OJOmHmwGnF++Ntn7M1yytNPXTM+sXLX/uZSWNXTN8yetf+JpHf66qf/iVGyVJ1eGyvnXrDV1r7DCzE+4eacdFuaukKukH53z/uKRf22KjByUdlKRrrrkmyrbP2m5AYquDp5fl54pzQmX5Guqirii2Cu2dlveyjUs9v56ze3fkbcUK7B5es1UIJ7l8p5+lOdAaJbhti2UXHSXuPitpVtp8xx2niJHhsurN1tm/VB3b/cV6Z/sd+oXi/oUDQrM/g2O/SOfXW3doyx9u0Za46+/0mjQHWqMMTj4u6aXnfH+1pNUki4g7UDHoA1QYXFkc+0U6v7LIln7sryjvuL8t6WVmdq2kuqSbJL01ySLODlQs1LTabGlkuLzjQEXc9YGiyOLYL9L5lUW29GN/dR2clCQz+21JH5JUkvRxd3//TuvHHZwEgEGX9OCk3P3Lkr58SVUBABLBk5MAEBiCGwACQ3ADQGAIbgAITKS7SmL/UrOGpO/3+PKrJD2VYDkhGeS2S4Pdfto+uDrt/0V3r0R5QSrBfSnMbDHqLTFFM8htlwa7/bR9MNsu9dZ+LpUAQGAIbgAITB6De7bfBfTRILddGuz20/bBFbv9ubvGDQDYWR7fcQMAdkBwA0BgchPcWUxInGdm9piZLZvZg2ZW6I9WNLOPm9kpM3vonGU/b2ZfN7P/bv//Bf2sMU3btP99ZlZv9/+D7U/kLBwze6mZ/bOZPWJm/2Fm724vL3z/79D22H2fi2vc7QmJ/0vnTEgs6eYkJyTOOzN7TNK4uxf+QQQze7WkZyV9yt2vby/7W0lPu/vt7T/cL3D3v+5nnWnZpv3vk/Ssu3+gn7WlzcxeIukl7v6AmV0h6YSkSUl/rIL3/w5t/wPF7Pu8vON+laTvuPuj7n5a0uck3djlNQiUu98n6ekLFt8o6c7213dq84AupG3aPxDc/Ql3f6D99TOSHtHmvLaF7/8d2h5bXoJ7qwmJw5tu49K4pK+Z2Yn2xMuD5kXu/oS0eYBL+oU+19MPf2ZmJ9uXUgp3qeBCZrZH0pik+zVg/X9B26WYfZ+X4I40IXHB7Xf3V0p6k6R3tf85jcHxUUm/JOkVkp6Q9Hd9rSZlZvZ8SXdJeo+7/7jf9WRpi7bH7vu8BHfqExLnnbuvtv9/StLd2rx8NEiebF8D7FwLPNXnejLl7k+6+7q7b0j6RxW4/81sSJvB9Rl3n2svHoj+36rtvfR9XoL77ITEZrZLmxMS39PnmjJjZpe3BytkZpdLeoOkh3Z+VeHcI+nt7a/fLukLfawlc53QavtdFbT/zcwk3SHpEXf/4Dk/Knz/b9f2Xvo+F3eVSPEnJC4SM7tOm++ypc15QD9b5Pab2RFJr9Hmx1k+Kek2SfOSPi/pGkkrkn7f3Qs5gLdN+1+jzX8qu6THJB3qXPMtEjP7TUn/KmlZ0kZ78Xu1ea230P2/Q9tvVsy+z01wAwCiyculEgBARAQ3AASG4AaAwBDcABAYghsAAkNwA0BgCG4ACMz/A4iPWGs+fJWAAAAAAElFTkSuQmCC\n",
+ "image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
@@ -248,7 +217,7 @@
],
"source": [
"test = np.random.randint(0, 10, size = 20)\n",
- "y = np.convolve(test, h)\n",
+ "y = np.convolve(test.real, h_int)\n",
"\n",
"plt.stem(test, linefmt=\"C0-\")\n",
"plt.stem(y, linefmt='C1-')"
@@ -256,8 +225,178 @@
},
{
"cell_type": "code",
+ "execution_count": 11,
+ "id": "39fb3489",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([4, 1, 7, 5, 2, 8, 1, 0, 5, 9, 6, 1, 0, 9, 5, 5, 1, 2, 6, 5])"
+ ]
+ },
+ "execution_count": 11,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "test"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 12,
+ "id": "7fd06347",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([0., 0., 1., 0., 0., 0.])"
+ ]
+ },
+ "execution_count": 12,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "h_int"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 13,
+ "id": "a9612999",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([0., 0., 4., 1., 7., 5., 2., 8., 1., 0., 5., 9., 6., 1., 0., 9., 5.,\n",
+ " 5., 1., 2., 6., 5., 0., 0., 0.])"
+ ]
+ },
+ "execution_count": 13,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "y"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "706a51b1",
+ "metadata": {},
+ "source": [
+ "# FIR mit Delay \n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 107,
+ "id": "d51e107c",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "System frequencies fs=10, T=0.1\n",
+ "Tap with amplitude=4, delay=0.7230000000000001\n",
+ "Creating filter of order N=15.0\n"
+ ]
+ },
+ {
+ "data": {
+ "text/plain": [
+ "<StemContainer object of 3 artists>"
+ ]
+ },
+ "execution_count": 107,
+ "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": [
+ "samp_rate = 10\n",
+ "period = 1 / samp_rate\n",
+ "print(f\"System frequencies fs={samp_rate}, T={period}\")\n",
+ "\n",
+ "delay = 7.23 * period\n",
+ "ampl = 4\n",
+ "print(f\"Tap with amplitude={ampl}, delay={delay}\")\n",
+ "\n",
+ "order = 2 * np.floor(delay / period) + 1\n",
+ "print(f\"Creating filter of order N={order}\")\n",
+ "\n",
+ "skip = np.floor(delay / period) - (order - 1) / 2\n",
+ "assert skip >= 0\n",
+ "\n",
+ "samples = np.arange(0, order + 1) * period - delay\n",
+ "h = ampl*(np.sin(samp_rate * samples) / (samp_rate * samples))\n",
+ "\n",
+ "plt.stem(h)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 110,
+ "id": "c89c83ae",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "<StemContainer object of 3 artists>"
+ ]
+ },
+ "execution_count": 110,
+ "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.linspace(0, delay + period, samp_rate)\n",
+ "f = np.sin(2 * np.pi * samp_rate * t)\n",
+ "\n",
+ "f_shift = np.convolve(h, f)[:len(f)]\n",
+ "\n",
+ "plt.stem(t, f, linefmt=\"C0-\")\n",
+ "plt.stem(t, f_shift, linefmt='C1-')"
+ ]
+ },
+ {
+ "cell_type": "code",
"execution_count": null,
- "id": "e7b9d068",
+ "id": "68a63dbd",
"metadata": {},
"outputs": [],
"source": []
diff --git a/simulation/QAM_Fading/qam_fading.grc b/simulation/QAM_Fading/Alte_versionen/qam_fading.grc
index 4911cce..4911cce 100644
--- a/simulation/QAM_Fading/qam_fading.grc
+++ b/simulation/QAM_Fading/Alte_versionen/qam_fading.grc
diff --git a/simulation/QAM_Fading/Alte_versionen/qam_fading.py b/simulation/QAM_Fading/Alte_versionen/qam_fading.py
new file mode 100755
index 0000000..e3b2574
--- /dev/null
+++ b/simulation/QAM_Fading/Alte_versionen/qam_fading.py
@@ -0,0 +1,724 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+
+#
+# SPDX-License-Identifier: GPL-3.0
+#
+# GNU Radio Python Flow Graph
+# Title: QAM mit Fading
+# Author: Pross Naoki, Halter Sara Cinzia
+# GNU Radio version: 3.8.2.0
+
+from distutils.version import StrictVersion
+
+if __name__ == '__main__':
+ import ctypes
+ import sys
+ if sys.platform.startswith('linux'):
+ try:
+ x11 = ctypes.cdll.LoadLibrary('libX11.so')
+ x11.XInitThreads()
+ except:
+ print("Warning: failed to XInitThreads()")
+
+from PyQt5 import Qt
+from gnuradio import qtgui
+from gnuradio.filter import firdes
+import sip
+from gnuradio import blocks
+import numpy
+from gnuradio import channels
+from gnuradio import digital
+from gnuradio import filter
+from gnuradio import gr
+import sys
+import signal
+from argparse import ArgumentParser
+from gnuradio.eng_arg import eng_float, intx
+from gnuradio import eng_notation
+from gnuradio.qtgui import Range, RangeWidget
+
+from gnuradio import qtgui
+
+class qam_fading(gr.top_block, Qt.QWidget):
+
+ def __init__(self):
+ gr.top_block.__init__(self, "QAM mit Fading")
+ Qt.QWidget.__init__(self)
+ self.setWindowTitle("QAM mit Fading")
+ qtgui.util.check_set_qss()
+ try:
+ self.setWindowIcon(Qt.QIcon.fromTheme('gnuradio-grc'))
+ except:
+ pass
+ self.top_scroll_layout = Qt.QVBoxLayout()
+ self.setLayout(self.top_scroll_layout)
+ self.top_scroll = Qt.QScrollArea()
+ self.top_scroll.setFrameStyle(Qt.QFrame.NoFrame)
+ self.top_scroll_layout.addWidget(self.top_scroll)
+ self.top_scroll.setWidgetResizable(True)
+ self.top_widget = Qt.QWidget()
+ self.top_scroll.setWidget(self.top_widget)
+ self.top_layout = Qt.QVBoxLayout(self.top_widget)
+ self.top_grid_layout = Qt.QGridLayout()
+ self.top_layout.addLayout(self.top_grid_layout)
+
+ self.settings = Qt.QSettings("GNU Radio", "qam_fading")
+
+ try:
+ if StrictVersion(Qt.qVersion()) < StrictVersion("5.0.0"):
+ self.restoreGeometry(self.settings.value("geometry").toByteArray())
+ else:
+ self.restoreGeometry(self.settings.value("geometry"))
+ except:
+ pass
+
+ ##################################################
+ # Variables
+ ##################################################
+ self.sps = sps = 4
+ self.nfilts = nfilts = 32
+ self.excess_bw = excess_bw = 350e-3
+ self.timing_loop_bw = timing_loop_bw = 2 * 3.141592653589793 / 100
+ self.time_offset = time_offset = 1.0
+ 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.phase_bw = phase_bw = 2 * 3.141592653589793 / 100
+ self.noise_volt = noise_volt = 0.0001
+ self.freq_offset = freq_offset = 0
+ self.eq_ntaps = eq_ntaps = 15
+ self.eq_mod = eq_mod = 1
+ self.eq_gain = eq_gain = .01
+ self.const = const = digital.constellation_16qam().base()
+ self.chn_taps = chn_taps = [1.0 + 0.0j, ]
+
+ ##################################################
+ # Blocks
+ ##################################################
+ self.params = Qt.QTabWidget()
+ self.params_widget_0 = Qt.QWidget()
+ self.params_layout_0 = Qt.QBoxLayout(Qt.QBoxLayout.TopToBottom, self.params_widget_0)
+ self.params_grid_layout_0 = Qt.QGridLayout()
+ self.params_layout_0.addLayout(self.params_grid_layout_0)
+ self.params.addTab(self.params_widget_0, 'Channel')
+ self.params_widget_1 = Qt.QWidget()
+ self.params_layout_1 = Qt.QBoxLayout(Qt.QBoxLayout.TopToBottom, self.params_widget_1)
+ self.params_grid_layout_1 = Qt.QGridLayout()
+ self.params_layout_1.addLayout(self.params_grid_layout_1)
+ self.params.addTab(self.params_widget_1, 'Receiver')
+ self.top_grid_layout.addWidget(self.params)
+ self._timing_loop_bw_range = Range(0, 200e-3, 10e-3, 2 * 3.141592653589793 / 100, 200)
+ self._timing_loop_bw_win = RangeWidget(self._timing_loop_bw_range, self.set_timing_loop_bw, 'Time Bandwidth', "counter_slider", float)
+ self.params_grid_layout_0.addWidget(self._timing_loop_bw_win, 1, 1, 1, 1)
+ for r in range(1, 2):
+ self.params_grid_layout_0.setRowStretch(r, 1)
+ for c in range(1, 2):
+ self.params_grid_layout_0.setColumnStretch(c, 1)
+ self._time_offset_range = Range(0.999, 1.001, 0.0001, 1.0, 200)
+ self._time_offset_win = RangeWidget(self._time_offset_range, self.set_time_offset, 'Timing Offset', "counter_slider", float)
+ self.params_grid_layout_0.addWidget(self._time_offset_win, 0, 1, 1, 1)
+ for r in range(0, 1):
+ self.params_grid_layout_0.setRowStretch(r, 1)
+ for c in range(1, 2):
+ self.params_grid_layout_0.setColumnStretch(c, 1)
+ self.plots = Qt.QTabWidget()
+ self.plots_widget_0 = Qt.QWidget()
+ self.plots_layout_0 = Qt.QBoxLayout(Qt.QBoxLayout.TopToBottom, self.plots_widget_0)
+ self.plots_grid_layout_0 = Qt.QGridLayout()
+ self.plots_layout_0.addLayout(self.plots_grid_layout_0)
+ self.plots.addTab(self.plots_widget_0, 'Constellations')
+ self.plots_widget_1 = Qt.QWidget()
+ self.plots_layout_1 = Qt.QBoxLayout(Qt.QBoxLayout.TopToBottom, self.plots_widget_1)
+ self.plots_grid_layout_1 = Qt.QGridLayout()
+ self.plots_layout_1.addLayout(self.plots_grid_layout_1)
+ self.plots.addTab(self.plots_widget_1, 'Frequency')
+ self.plots_widget_2 = Qt.QWidget()
+ self.plots_layout_2 = Qt.QBoxLayout(Qt.QBoxLayout.TopToBottom, self.plots_widget_2)
+ self.plots_grid_layout_2 = Qt.QGridLayout()
+ self.plots_layout_2.addLayout(self.plots_grid_layout_2)
+ self.plots.addTab(self.plots_widget_2, 'Time')
+ self.top_grid_layout.addWidget(self.plots)
+ self._phase_bw_range = Range(0, 1, .01, 2 * 3.141592653589793 / 100, 200)
+ self._phase_bw_win = RangeWidget(self._phase_bw_range, self.set_phase_bw, 'Phase Bandwidth', "counter_slider", float)
+ self.params_grid_layout_1.addWidget(self._phase_bw_win, 1, 0, 1, 1)
+ for r in range(1, 2):
+ self.params_grid_layout_1.setRowStretch(r, 1)
+ for c in range(0, 1):
+ self.params_grid_layout_1.setColumnStretch(c, 1)
+ self._noise_volt_range = Range(0, 1, 0.01, 0.0001, 200)
+ self._noise_volt_win = RangeWidget(self._noise_volt_range, self.set_noise_volt, 'Noise Voltage', "counter_slider", float)
+ self.params_grid_layout_0.addWidget(self._noise_volt_win, 0, 0, 1, 1)
+ for r in range(0, 1):
+ self.params_grid_layout_0.setRowStretch(r, 1)
+ for c in range(0, 1):
+ self.params_grid_layout_0.setColumnStretch(c, 1)
+ self._freq_offset_range = Range(-100e-3, 100e-3, 1e-3, 0, 200)
+ self._freq_offset_win = RangeWidget(self._freq_offset_range, self.set_freq_offset, 'Frequency Offset', "counter_slider", float)
+ self.params_grid_layout_0.addWidget(self._freq_offset_win, 1, 0, 1, 1)
+ for r in range(1, 2):
+ self.params_grid_layout_0.setRowStretch(r, 1)
+ for c in range(0, 1):
+ self.params_grid_layout_0.setColumnStretch(c, 1)
+ self._eq_gain_range = Range(0, .1, .001, .01, 200)
+ self._eq_gain_win = RangeWidget(self._eq_gain_range, self.set_eq_gain, 'Equalizer Rate', "counter_slider", float)
+ self.params_grid_layout_1.addWidget(self._eq_gain_win, 0, 0, 1, 1)
+ for r in range(0, 1):
+ self.params_grid_layout_1.setRowStretch(r, 1)
+ for c in range(0, 1):
+ self.params_grid_layout_1.setColumnStretch(c, 1)
+ self.qtgui_time_sink_x_0 = qtgui.time_sink_f(
+ 1024, #size
+ samp_rate, #samp_rate
+ "Decoded", #name
+ 3 #number of inputs
+ )
+ self.qtgui_time_sink_x_0.set_update_time(0.10)
+ self.qtgui_time_sink_x_0.set_y_axis(-1, 1)
+
+ self.qtgui_time_sink_x_0.set_y_label('Amplitude', "")
+
+ self.qtgui_time_sink_x_0.enable_tags(True)
+ self.qtgui_time_sink_x_0.set_trigger_mode(qtgui.TRIG_MODE_FREE, qtgui.TRIG_SLOPE_POS, 0.0, 0, 0, "")
+ self.qtgui_time_sink_x_0.enable_autoscale(False)
+ self.qtgui_time_sink_x_0.enable_grid(False)
+ self.qtgui_time_sink_x_0.enable_axis_labels(True)
+ self.qtgui_time_sink_x_0.enable_control_panel(False)
+ self.qtgui_time_sink_x_0.enable_stem_plot(False)
+
+
+ labels = ['Received', 'Sent', '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(3):
+ if len(labels[i]) == 0:
+ self.qtgui_time_sink_x_0.set_line_label(i, "Data {0}".format(i))
+ else:
+ self.qtgui_time_sink_x_0.set_line_label(i, labels[i])
+ self.qtgui_time_sink_x_0.set_line_width(i, widths[i])
+ self.qtgui_time_sink_x_0.set_line_color(i, colors[i])
+ self.qtgui_time_sink_x_0.set_line_style(i, styles[i])
+ self.qtgui_time_sink_x_0.set_line_marker(i, markers[i])
+ self.qtgui_time_sink_x_0.set_line_alpha(i, alphas[i])
+
+ self._qtgui_time_sink_x_0_win = sip.wrapinstance(self.qtgui_time_sink_x_0.pyqwidget(), Qt.QWidget)
+ self.plots_grid_layout_2.addWidget(self._qtgui_time_sink_x_0_win, 0, 0, 1, 1)
+ for r in range(0, 1):
+ self.plots_grid_layout_2.setRowStretch(r, 1)
+ for c in range(0, 1):
+ self.plots_grid_layout_2.setColumnStretch(c, 1)
+ self.qtgui_freq_sink_x_2_1 = qtgui.freq_sink_f(
+ 1024, #size
+ firdes.WIN_BLACKMAN_hARRIS, #wintype
+ 0, #fc
+ samp_rate, #bw
+ "", #name
+ 2
+ )
+ self.qtgui_freq_sink_x_2_1.set_update_time(0.10)
+ self.qtgui_freq_sink_x_2_1.set_y_axis(-140, 10)
+ self.qtgui_freq_sink_x_2_1.set_y_label('Relative Gain', 'dB')
+ self.qtgui_freq_sink_x_2_1.set_trigger_mode(qtgui.TRIG_MODE_FREE, 0.0, 0, "")
+ self.qtgui_freq_sink_x_2_1.enable_autoscale(False)
+ self.qtgui_freq_sink_x_2_1.enable_grid(False)
+ self.qtgui_freq_sink_x_2_1.set_fft_average(1.0)
+ self.qtgui_freq_sink_x_2_1.enable_axis_labels(True)
+ self.qtgui_freq_sink_x_2_1.enable_control_panel(False)
+
+
+ self.qtgui_freq_sink_x_2_1.set_plot_pos_half(not True)
+
+ labels = ['Fading', '', '', '', '',
+ '', '', '', '', '']
+ 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]
+
+ for i in range(2):
+ if len(labels[i]) == 0:
+ self.qtgui_freq_sink_x_2_1.set_line_label(i, "Data {0}".format(i))
+ else:
+ self.qtgui_freq_sink_x_2_1.set_line_label(i, labels[i])
+ self.qtgui_freq_sink_x_2_1.set_line_width(i, widths[i])
+ self.qtgui_freq_sink_x_2_1.set_line_color(i, colors[i])
+ self.qtgui_freq_sink_x_2_1.set_line_alpha(i, alphas[i])
+
+ self._qtgui_freq_sink_x_2_1_win = sip.wrapinstance(self.qtgui_freq_sink_x_2_1.pyqwidget(), Qt.QWidget)
+ self.top_grid_layout.addWidget(self._qtgui_freq_sink_x_2_1_win)
+ self.qtgui_freq_sink_x_0 = qtgui.freq_sink_c(
+ 1024, #size
+ firdes.WIN_BLACKMAN_hARRIS, #wintype
+ 0, #fc
+ samp_rate, #bw
+ "Channel", #name
+ 2
+ )
+ self.qtgui_freq_sink_x_0.set_update_time(0.10)
+ self.qtgui_freq_sink_x_0.set_y_axis(-140, 10)
+ self.qtgui_freq_sink_x_0.set_y_label('Relative Gain', 'dB')
+ self.qtgui_freq_sink_x_0.set_trigger_mode(qtgui.TRIG_MODE_FREE, 0.0, 0, "")
+ self.qtgui_freq_sink_x_0.enable_autoscale(False)
+ self.qtgui_freq_sink_x_0.enable_grid(False)
+ self.qtgui_freq_sink_x_0.set_fft_average(1.0)
+ self.qtgui_freq_sink_x_0.enable_axis_labels(True)
+ self.qtgui_freq_sink_x_0.enable_control_panel(False)
+
+
+
+ labels = ['Fading', '', '', '', '',
+ '', '', '', '', '']
+ 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]
+
+ for i in range(2):
+ if len(labels[i]) == 0:
+ self.qtgui_freq_sink_x_0.set_line_label(i, "Data {0}".format(i))
+ else:
+ self.qtgui_freq_sink_x_0.set_line_label(i, labels[i])
+ self.qtgui_freq_sink_x_0.set_line_width(i, widths[i])
+ self.qtgui_freq_sink_x_0.set_line_color(i, colors[i])
+ self.qtgui_freq_sink_x_0.set_line_alpha(i, alphas[i])
+
+ self._qtgui_freq_sink_x_0_win = sip.wrapinstance(self.qtgui_freq_sink_x_0.pyqwidget(), Qt.QWidget)
+ self.plots_grid_layout_1.addWidget(self._qtgui_freq_sink_x_0_win, 0, 0, 1, 1)
+ for r in range(0, 1):
+ self.plots_grid_layout_1.setRowStretch(r, 1)
+ for c in range(0, 1):
+ self.plots_grid_layout_1.setColumnStretch(c, 1)
+ self.qtgui_const_sink_x_2 = qtgui.const_sink_c(
+ 1024, #size
+ "Locked", #name
+ 2 #number of inputs
+ )
+ self.qtgui_const_sink_x_2.set_update_time(0.10)
+ self.qtgui_const_sink_x_2.set_y_axis(-2, 2)
+ self.qtgui_const_sink_x_2.set_x_axis(-2, 2)
+ self.qtgui_const_sink_x_2.set_trigger_mode(qtgui.TRIG_MODE_FREE, qtgui.TRIG_SLOPE_POS, 0.0, 0, "")
+ self.qtgui_const_sink_x_2.enable_autoscale(False)
+ self.qtgui_const_sink_x_2.enable_grid(False)
+ self.qtgui_const_sink_x_2.enable_axis_labels(True)
+
+
+ labels = ['Fading', '', '', '', '',
+ '', '', '', '', '']
+ 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(2):
+ if len(labels[i]) == 0:
+ self.qtgui_const_sink_x_2.set_line_label(i, "Data {0}".format(i))
+ else:
+ self.qtgui_const_sink_x_2.set_line_label(i, labels[i])
+ self.qtgui_const_sink_x_2.set_line_width(i, widths[i])
+ self.qtgui_const_sink_x_2.set_line_color(i, colors[i])
+ self.qtgui_const_sink_x_2.set_line_style(i, styles[i])
+ self.qtgui_const_sink_x_2.set_line_marker(i, markers[i])
+ self.qtgui_const_sink_x_2.set_line_alpha(i, alphas[i])
+
+ self._qtgui_const_sink_x_2_win = sip.wrapinstance(self.qtgui_const_sink_x_2.pyqwidget(), Qt.QWidget)
+ self.plots_grid_layout_0.addWidget(self._qtgui_const_sink_x_2_win, 1, 1, 1, 1)
+ for r in range(1, 2):
+ self.plots_grid_layout_0.setRowStretch(r, 1)
+ for c in range(1, 2):
+ self.plots_grid_layout_0.setColumnStretch(c, 1)
+ self.qtgui_const_sink_x_1 = qtgui.const_sink_c(
+ 1024, #size
+ "Equalized", #name
+ 2 #number of inputs
+ )
+ 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(False)
+ self.qtgui_const_sink_x_1.enable_grid(False)
+ self.qtgui_const_sink_x_1.enable_axis_labels(True)
+
+
+ labels = ['Fading', '', '', '', '',
+ '', '', '', '', '']
+ 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(2):
+ 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.plots_grid_layout_0.addWidget(self._qtgui_const_sink_x_1_win, 1, 0, 1, 1)
+ for r in range(1, 2):
+ self.plots_grid_layout_0.setRowStretch(r, 1)
+ for c in range(0, 1):
+ self.plots_grid_layout_0.setColumnStretch(c, 1)
+ self.qtgui_const_sink_x_0_0 = qtgui.const_sink_c(
+ 2048, #size
+ "Synchronized", #name
+ 2 #number of inputs
+ )
+ self.qtgui_const_sink_x_0_0.set_update_time(0.10)
+ self.qtgui_const_sink_x_0_0.set_y_axis(-2, 2)
+ self.qtgui_const_sink_x_0_0.set_x_axis(-2, 2)
+ self.qtgui_const_sink_x_0_0.set_trigger_mode(qtgui.TRIG_MODE_FREE, qtgui.TRIG_SLOPE_POS, 0.0, 0, "")
+ self.qtgui_const_sink_x_0_0.enable_autoscale(False)
+ self.qtgui_const_sink_x_0_0.enable_grid(False)
+ self.qtgui_const_sink_x_0_0.enable_axis_labels(True)
+
+
+ labels = ['Fading', '', '', '', '',
+ '', '', '', '', '']
+ 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(2):
+ if len(labels[i]) == 0:
+ self.qtgui_const_sink_x_0_0.set_line_label(i, "Data {0}".format(i))
+ else:
+ self.qtgui_const_sink_x_0_0.set_line_label(i, labels[i])
+ self.qtgui_const_sink_x_0_0.set_line_width(i, widths[i])
+ self.qtgui_const_sink_x_0_0.set_line_color(i, colors[i])
+ self.qtgui_const_sink_x_0_0.set_line_style(i, styles[i])
+ self.qtgui_const_sink_x_0_0.set_line_marker(i, markers[i])
+ self.qtgui_const_sink_x_0_0.set_line_alpha(i, alphas[i])
+
+ self._qtgui_const_sink_x_0_0_win = sip.wrapinstance(self.qtgui_const_sink_x_0_0.pyqwidget(), Qt.QWidget)
+ self.plots_grid_layout_0.addWidget(self._qtgui_const_sink_x_0_0_win, 0, 1, 1, 1)
+ for r in range(0, 1):
+ self.plots_grid_layout_0.setRowStretch(r, 1)
+ for c in range(1, 2):
+ self.plots_grid_layout_0.setColumnStretch(c, 1)
+ self.qtgui_const_sink_x_0 = qtgui.const_sink_c(
+ 2048, #size
+ "Channel", #name
+ 2 #number of inputs
+ )
+ self.qtgui_const_sink_x_0.set_update_time(0.10)
+ self.qtgui_const_sink_x_0.set_y_axis(-2, 2)
+ self.qtgui_const_sink_x_0.set_x_axis(-2, 2)
+ self.qtgui_const_sink_x_0.set_trigger_mode(qtgui.TRIG_MODE_FREE, qtgui.TRIG_SLOPE_POS, 0.0, 0, "")
+ self.qtgui_const_sink_x_0.enable_autoscale(False)
+ self.qtgui_const_sink_x_0.enable_grid(False)
+ self.qtgui_const_sink_x_0.enable_axis_labels(True)
+
+
+ labels = ['Fading', '', '', '', '',
+ '', '', '', '', '']
+ 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(2):
+ 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.plots_grid_layout_0.addWidget(self._qtgui_const_sink_x_0_win, 0, 0, 1, 1)
+ for r in range(0, 1):
+ self.plots_grid_layout_0.setRowStretch(r, 1)
+ for c in range(0, 1):
+ self.plots_grid_layout_0.setColumnStretch(c, 1)
+ self.freq_xlating_fir_filter_xxx_0 = filter.freq_xlating_fir_filter_ccc(1, [1]+[0 for n in range(0, 2*sps-1)]+[0.2], 0, samp_rate)
+ self.digital_pfb_clock_sync_xxx_0_0 = digital.pfb_clock_sync_ccf(sps , timing_loop_bw, rrc_taps, nfilts, nfilts/2, 1.5, 1)
+ self.digital_pfb_clock_sync_xxx_0 = digital.pfb_clock_sync_ccf(sps, timing_loop_bw, rrc_taps, nfilts, nfilts/2, 1.5, 1)
+ self.digital_map_bb_0_0 = digital.map_bb([0, 1, 3, 2])
+ self.digital_map_bb_0 = digital.map_bb([0, 1, 3, 2])
+ self.digital_diff_decoder_bb_0_0 = digital.diff_decoder_bb(4)
+ self.digital_diff_decoder_bb_0 = digital.diff_decoder_bb(4)
+ self.digital_costas_loop_cc_0_0 = digital.costas_loop_cc(phase_bw, 4, False)
+ self.digital_costas_loop_cc_0 = digital.costas_loop_cc(phase_bw, 4, False)
+ self.digital_constellation_modulator_0 = digital.generic_mod(
+ constellation=const,
+ differential=True,
+ samples_per_symbol=sps,
+ pre_diff_code=True,
+ excess_bw=excess_bw,
+ verbose=False,
+ log=False)
+ self.digital_constellation_decoder_cb_0_0 = digital.constellation_decoder_cb(const)
+ self.digital_constellation_decoder_cb_0 = digital.constellation_decoder_cb(const)
+ self.digital_cma_equalizer_cc_0_0 = digital.cma_equalizer_cc(eq_ntaps, eq_mod, eq_gain, 2)
+ self.digital_cma_equalizer_cc_0 = digital.cma_equalizer_cc(eq_ntaps, eq_mod, eq_gain, 2)
+ self.channels_channel_model_0 = channels.channel_model(
+ noise_voltage=noise_volt,
+ frequency_offset=freq_offset,
+ epsilon=time_offset,
+ taps=chn_taps,
+ noise_seed=0,
+ block_tags=False)
+ self.blocks_unpack_k_bits_bb_0_1 = blocks.unpack_k_bits_bb(2)
+ self.blocks_unpack_k_bits_bb_0_0 = blocks.unpack_k_bits_bb(2)
+ self.blocks_unpack_k_bits_bb_0 = blocks.unpack_k_bits_bb(2)
+ self.blocks_throttle_0 = blocks.throttle(gr.sizeof_gr_complex*1, samp_rate,True)
+ self.blocks_delay_0 = blocks.delay(gr.sizeof_float*1, 50)
+ self.blocks_char_to_float_0_1 = blocks.char_to_float(1, 1)
+ self.blocks_char_to_float_0_0 = blocks.char_to_float(1, 1)
+ self.blocks_char_to_float_0 = blocks.char_to_float(1, 1)
+ self.analog_random_source_x_0 = blocks.vector_source_b(list(map(int, numpy.random.randint(0, 256, 1000))), True)
+
+
+
+ ##################################################
+ # Connections
+ ##################################################
+ self.connect((self.analog_random_source_x_0, 0), (self.blocks_unpack_k_bits_bb_0_0, 0))
+ self.connect((self.analog_random_source_x_0, 0), (self.digital_constellation_modulator_0, 0))
+ self.connect((self.blocks_char_to_float_0, 0), (self.qtgui_freq_sink_x_2_1, 0))
+ self.connect((self.blocks_char_to_float_0, 0), (self.qtgui_time_sink_x_0, 0))
+ self.connect((self.blocks_char_to_float_0_0, 0), (self.blocks_delay_0, 0))
+ self.connect((self.blocks_char_to_float_0_1, 0), (self.qtgui_freq_sink_x_2_1, 1))
+ self.connect((self.blocks_char_to_float_0_1, 0), (self.qtgui_time_sink_x_0, 2))
+ self.connect((self.blocks_delay_0, 0), (self.qtgui_time_sink_x_0, 1))
+ self.connect((self.blocks_throttle_0, 0), (self.channels_channel_model_0, 0))
+ self.connect((self.blocks_unpack_k_bits_bb_0, 0), (self.blocks_char_to_float_0, 0))
+ self.connect((self.blocks_unpack_k_bits_bb_0_0, 0), (self.blocks_char_to_float_0_0, 0))
+ self.connect((self.blocks_unpack_k_bits_bb_0_1, 0), (self.blocks_char_to_float_0_1, 0))
+ self.connect((self.channels_channel_model_0, 0), (self.digital_pfb_clock_sync_xxx_0_0, 0))
+ self.connect((self.channels_channel_model_0, 0), (self.freq_xlating_fir_filter_xxx_0, 0))
+ self.connect((self.channels_channel_model_0, 0), (self.qtgui_const_sink_x_0, 1))
+ self.connect((self.channels_channel_model_0, 0), (self.qtgui_freq_sink_x_0, 1))
+ self.connect((self.digital_cma_equalizer_cc_0, 0), (self.digital_costas_loop_cc_0, 0))
+ self.connect((self.digital_cma_equalizer_cc_0, 0), (self.qtgui_const_sink_x_1, 0))
+ self.connect((self.digital_cma_equalizer_cc_0_0, 0), (self.digital_costas_loop_cc_0_0, 0))
+ self.connect((self.digital_cma_equalizer_cc_0_0, 0), (self.qtgui_const_sink_x_1, 1))
+ self.connect((self.digital_constellation_decoder_cb_0, 0), (self.digital_diff_decoder_bb_0, 0))
+ self.connect((self.digital_constellation_decoder_cb_0_0, 0), (self.digital_diff_decoder_bb_0_0, 0))
+ self.connect((self.digital_constellation_modulator_0, 0), (self.blocks_throttle_0, 0))
+ self.connect((self.digital_costas_loop_cc_0, 0), (self.digital_constellation_decoder_cb_0, 0))
+ self.connect((self.digital_costas_loop_cc_0, 0), (self.qtgui_const_sink_x_2, 0))
+ self.connect((self.digital_costas_loop_cc_0_0, 0), (self.digital_constellation_decoder_cb_0_0, 0))
+ self.connect((self.digital_costas_loop_cc_0_0, 0), (self.qtgui_const_sink_x_2, 1))
+ self.connect((self.digital_diff_decoder_bb_0, 0), (self.digital_map_bb_0, 0))
+ self.connect((self.digital_diff_decoder_bb_0_0, 0), (self.digital_map_bb_0_0, 0))
+ self.connect((self.digital_map_bb_0, 0), (self.blocks_unpack_k_bits_bb_0, 0))
+ self.connect((self.digital_map_bb_0_0, 0), (self.blocks_unpack_k_bits_bb_0_1, 0))
+ self.connect((self.digital_pfb_clock_sync_xxx_0, 0), (self.digital_cma_equalizer_cc_0, 0))
+ self.connect((self.digital_pfb_clock_sync_xxx_0, 0), (self.qtgui_const_sink_x_0_0, 0))
+ self.connect((self.digital_pfb_clock_sync_xxx_0_0, 0), (self.digital_cma_equalizer_cc_0_0, 0))
+ self.connect((self.digital_pfb_clock_sync_xxx_0_0, 0), (self.qtgui_const_sink_x_0_0, 1))
+ self.connect((self.freq_xlating_fir_filter_xxx_0, 0), (self.digital_pfb_clock_sync_xxx_0, 0))
+ self.connect((self.freq_xlating_fir_filter_xxx_0, 0), (self.qtgui_const_sink_x_0, 0))
+ self.connect((self.freq_xlating_fir_filter_xxx_0, 0), (self.qtgui_freq_sink_x_0, 0))
+
+
+ def closeEvent(self, event):
+ self.settings = Qt.QSettings("GNU Radio", "qam_fading")
+ self.settings.setValue("geometry", self.saveGeometry())
+ event.accept()
+
+ def get_sps(self):
+ return self.sps
+
+ def set_sps(self, sps):
+ self.sps = sps
+ self.set_rrc_taps(firdes.root_raised_cosine(self.nfilts, self.nfilts, 1.0/float(self.sps), self.excess_bw, 45*self.nfilts))
+ self.freq_xlating_fir_filter_xxx_0.set_taps([1]+[0 for n in range(0, 2*self.sps-1)]+[0.2])
+
+ def get_nfilts(self):
+ return self.nfilts
+
+ def set_nfilts(self, nfilts):
+ self.nfilts = nfilts
+ self.set_rrc_taps(firdes.root_raised_cosine(self.nfilts, self.nfilts, 1.0/float(self.sps), self.excess_bw, 45*self.nfilts))
+
+ def get_excess_bw(self):
+ return self.excess_bw
+
+ def set_excess_bw(self, excess_bw):
+ self.excess_bw = excess_bw
+ self.set_rrc_taps(firdes.root_raised_cosine(self.nfilts, self.nfilts, 1.0/float(self.sps), self.excess_bw, 45*self.nfilts))
+
+ def get_timing_loop_bw(self):
+ return self.timing_loop_bw
+
+ def set_timing_loop_bw(self, timing_loop_bw):
+ self.timing_loop_bw = timing_loop_bw
+ self.digital_pfb_clock_sync_xxx_0.set_loop_bandwidth(self.timing_loop_bw)
+ self.digital_pfb_clock_sync_xxx_0_0.set_loop_bandwidth(self.timing_loop_bw)
+
+ def get_time_offset(self):
+ return self.time_offset
+
+ def set_time_offset(self, time_offset):
+ self.time_offset = time_offset
+ self.channels_channel_model_0.set_timing_offset(self.time_offset)
+
+ 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)
+ self.qtgui_freq_sink_x_0.set_frequency_range(0, self.samp_rate)
+ self.qtgui_freq_sink_x_2_1.set_frequency_range(0, self.samp_rate)
+ self.qtgui_time_sink_x_0.set_samp_rate(self.samp_rate)
+
+ def get_rrc_taps(self):
+ return self.rrc_taps
+
+ def set_rrc_taps(self, rrc_taps):
+ self.rrc_taps = rrc_taps
+ self.digital_pfb_clock_sync_xxx_0.update_taps(self.rrc_taps)
+ self.digital_pfb_clock_sync_xxx_0_0.update_taps(self.rrc_taps)
+
+ def get_phase_bw(self):
+ return self.phase_bw
+
+ def set_phase_bw(self, phase_bw):
+ self.phase_bw = phase_bw
+ self.digital_costas_loop_cc_0.set_loop_bandwidth(self.phase_bw)
+ self.digital_costas_loop_cc_0_0.set_loop_bandwidth(self.phase_bw)
+
+ def get_noise_volt(self):
+ return self.noise_volt
+
+ def set_noise_volt(self, noise_volt):
+ self.noise_volt = noise_volt
+ self.channels_channel_model_0.set_noise_voltage(self.noise_volt)
+
+ def get_freq_offset(self):
+ return self.freq_offset
+
+ def set_freq_offset(self, freq_offset):
+ self.freq_offset = freq_offset
+ self.channels_channel_model_0.set_frequency_offset(self.freq_offset)
+
+ def get_eq_ntaps(self):
+ return self.eq_ntaps
+
+ def set_eq_ntaps(self, eq_ntaps):
+ self.eq_ntaps = eq_ntaps
+
+ def get_eq_mod(self):
+ return self.eq_mod
+
+ def set_eq_mod(self, eq_mod):
+ self.eq_mod = eq_mod
+ self.digital_cma_equalizer_cc_0.set_modulus(self.eq_mod)
+ self.digital_cma_equalizer_cc_0_0.set_modulus(self.eq_mod)
+
+ def get_eq_gain(self):
+ return self.eq_gain
+
+ def set_eq_gain(self, eq_gain):
+ self.eq_gain = eq_gain
+ self.digital_cma_equalizer_cc_0.set_gain(self.eq_gain)
+ self.digital_cma_equalizer_cc_0_0.set_gain(self.eq_gain)
+
+ def get_const(self):
+ return self.const
+
+ def set_const(self, const):
+ self.const = const
+
+ def get_chn_taps(self):
+ return self.chn_taps
+
+ def set_chn_taps(self, chn_taps):
+ self.chn_taps = chn_taps
+ self.channels_channel_model_0.set_taps(self.chn_taps)
+
+def snipfcn_snippet_0(self):
+ import numpy as np
+
+
+def snippets_main_after_init(tb):
+ snipfcn_snippet_0(tb)
+
+
+
+
+def main(top_block_cls=qam_fading, options=None):
+ if gr.enable_realtime_scheduling() != gr.RT_OK:
+ print("Error: failed to enable real-time scheduling.")
+
+ if StrictVersion("4.5.0") <= StrictVersion(Qt.qVersion()) < StrictVersion("5.0.0"):
+ style = gr.prefs().get_string('qtgui', 'style', 'raster')
+ Qt.QApplication.setGraphicsSystem(style)
+ qapp = Qt.QApplication(sys.argv)
+
+ tb = top_block_cls()
+ snippets_main_after_init(tb)
+ tb.start()
+
+ tb.show()
+
+ def sig_handler(sig=None, frame=None):
+ Qt.QApplication.quit()
+
+ signal.signal(signal.SIGINT, sig_handler)
+ signal.signal(signal.SIGTERM, sig_handler)
+
+ timer = Qt.QTimer()
+ timer.start(500)
+ timer.timeout.connect(lambda: None)
+
+ def quitting():
+ tb.stop()
+ tb.wait()
+
+ qapp.aboutToQuit.connect(quitting)
+ qapp.exec_()
+
+if __name__ == '__main__':
+ main()
diff --git a/simulation/QAM_Fading/epy_block_0.py b/simulation/QAM_Fading/epy_block_0.py
index 286e5f1..8fbab3d 100644
--- a/simulation/QAM_Fading/epy_block_0.py
+++ b/simulation/QAM_Fading/epy_block_0.py
@@ -27,9 +27,10 @@ class blk(gr.sync_block): # other base classes are basic_block, decim_block, in
self.amplitudes = amplitudes
self.delays = delays
self.temp = [0]
- if los:
- self.amplitudes.append(1)
- self.delays.append(0)
+ # if los:
+ # self.amplitudes.append(1)
+ # self.delays.append(0)
+ self.los= 1
#self.fir =
def work(self, input_items, output_items):
@@ -46,20 +47,25 @@ class blk(gr.sync_block): # other base classes are basic_block, decim_block, in
max_len = np.max(self.delays)
sum_x = np.zeros(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)])
+ # 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
-
+ #sum_x[0] = self.los
+ print(sum_x)
+
H_int = fft(sum_x)
- h = ifft(H_int)
+ h = ifft(H_int)
+ #h[0]=1
- y = np.convolve(inp, h)
+ y = np.convolve(inp, sum_x)
+
y+=np.concatenate([self.temp,np.zeros(len(y)-len(self.temp))])
+
oup[:] = y[:len(inp)]
self.temp = y[len(inp):]
diff --git a/simulation/QAM_Fading/qam_fading_V2.grc b/simulation/QAM_Fading/qam_fading_V2.grc
index 3bfc382..16fa2e3 100644
--- a/simulation/QAM_Fading/qam_fading_V2.grc
+++ b/simulation/QAM_Fading/qam_fading_V2.grc
@@ -790,8 +790,8 @@ blocks:
interp: '1'
maxoutbuf: '0'
minoutbuf: '0'
- samp_delay: '2'
- taps: '[amp_1]'
+ samp_delay: '0'
+ taps: '[LOS_NLOS]+(([0]*fading_1)+[amp_1])'
type: ccc
states:
bus_sink: false
diff --git a/simulation/QAM_Fading/qam_fading_V2_eigerner_block.grc b/simulation/QAM_Fading/qam_fading_V2_eigerner_block.grc
index 3b2c926..99e01b1 100644
--- a/simulation/QAM_Fading/qam_fading_V2_eigerner_block.grc
+++ b/simulation/QAM_Fading/qam_fading_V2_eigerner_block.grc
@@ -869,34 +869,35 @@ blocks:
\ out_sig=[np.complex64]\n )\n # if an attribute with\
\ the same name as a parameter is found,\n # a callback is registered\
\ (properties work, too).\n self.amplitudes = amplitudes\n self.delays\
- \ = delays\n self.temp = [0]\n if los:\n self.amplitudes.append(1)\n\
- \ self.delays.append(0)\n #self.fir = \n\n def work(self,\
- \ input_items, output_items):\n \"\"\"example: multiply with constant\"\
- \"\"\n inp = input_items[0]\n oup = output_items[0]\n \n\
- \ if len(self.amplitudes) != len(self.delays):\n raise Exception(\"\
- Amplitudes and Delay length dont match\")\n\n # raise Exception(\"\
- Delay length can't be one\")\n #if np.min(self.delays)<=1:\n #\
- \ raise Exception(\"Delay length can't be one\")\n max_len = np.max(self.delays)\n\
- \ sum_x = np.zeros(max_len)\n for(a,d) in zip(self.amplitudes,self.delays):\n\
- \ if d-1 <= 0:\n x = np.concatenate([[a], np.zeros(max_len-1)])\n\
- \ else: \n x = np.concatenate([np.zeros(d-1),\
- \ [a], np.zeros(max_len-d)])\n sum_x += x\n \n\n H_int\
- \ = fft(sum_x)\n h = ifft(H_int)\n\n\n\n y = np.convolve(inp,\
- \ h)\n y+=np.concatenate([self.temp,np.zeros(len(y)-len(self.temp))])\n\
- \n oup[:] = y[:len(inp)]\n self.temp = y[len(inp):] \n\
- \ \n\n return len(oup)"
+ \ = delays\n self.temp = [0]\n # if los:\n # self.amplitudes.append(1)\n\
+ \ # self.delays.append(0)\n self.los= 1\n #self.fir\
+ \ = \n\n def work(self, input_items, output_items):\n \"\"\"example:\
+ \ multiply with constant\"\"\"\n inp = input_items[0]\n oup =\
+ \ output_items[0]\n \n if len(self.amplitudes) != len(self.delays):\n\
+ \ raise Exception(\"Amplitudes and Delay length dont match\")\n\n\
+ \ # raise Exception(\"Delay length can't be one\")\n #if np.min(self.delays)<=1:\n\
+ \ # raise Exception(\"Delay length can't be one\")\n max_len\
+ \ = np.max(self.delays)\n sum_x = np.zeros(max_len)\n for(a,d)\
+ \ in zip(self.amplitudes,self.delays):\n # if d-1 <= 0:\n \
+ \ # x = np.concatenate([[a], np.zeros(max_len-1)])\n # else:\
+ \ \n x = np.concatenate([np.zeros(d-1), [a], np.zeros(max_len-d)])\n\
+ \ sum_x += x\n \n #sum_x[0] = self.los\n print(sum_x)\n\
+ \ \n H_int = fft(sum_x)\n\n h = ifft(H_int)\n\n \
+ \ #h[0]=1\n\n y = np.convolve(inp, sum_x)\n \n y+=np.concatenate([self.temp,np.zeros(len(y)-len(self.temp))])\n\
+ \ \n\n oup[:] = y[:len(inp)]\n self.temp = y[len(inp):]\
+ \ \n \n\n return len(oup)"
affinity: ''
alias: ''
- amplitudes: '[0.3]'
+ amplitudes: '[0.2,0.2,0.2,0.2,0.2]'
comment: ''
- delays: '[3]'
+ delays: '[sps+1,sps+1,sps+1,sps+1,sps+1]'
los: 'True'
maxoutbuf: '0'
minoutbuf: '0'
states:
_io_cache: ('Embedded Python Block', 'blk', [('amplitudes', '[]'), ('delays',
'[]'), ('los', 'True')], [('0', 'complex', 1)], [('0', 'complex', 1)], 'Embedded
- Python Block example - a simple multiply const', ['amplitudes', 'delays'])
+ Python Block example - a simple multiply const', ['amplitudes', 'delays', 'los'])
bus_sink: false
bus_source: false
bus_structure: null
diff --git a/simulation/QAM_Fading/qam_fading_block.py b/simulation/QAM_Fading/qam_fading_block.py
index 52f5fe3..8f095b5 100755
--- a/simulation/QAM_Fading/qam_fading_block.py
+++ b/simulation/QAM_Fading/qam_fading_block.py
@@ -516,7 +516,7 @@ class qam_fading_block(gr.top_block, Qt.QWidget):
self.params_grid_layout_2.setRowStretch(r, 1)
for c in range(0, 1):
self.params_grid_layout_2.setColumnStretch(c, 1)
- self.epy_block_0 = epy_block_0.blk(amplitudes=[0.3], delays=[3], los=True)
+ self.epy_block_0 = epy_block_0.blk(amplitudes=[0.2,0.2,0.2,0.2,0.2], delays=[sps+1,sps+1,sps+1,sps+1,sps+1], los=True)
self.digital_pfb_clock_sync_xxx_0_0 = digital.pfb_clock_sync_ccf(sps , timing_loop_bw, rrc_taps, nfilts, nfilts/2, 1.5, 1)
self.digital_pfb_clock_sync_xxx_0 = digital.pfb_clock_sync_ccf(sps, timing_loop_bw, rrc_taps, nfilts, nfilts/2, 1.5, 1)
self.digital_map_bb_0_0 = digital.map_bb([0, 1, 3, 2])
@@ -638,6 +638,7 @@ class qam_fading_block(gr.top_block, Qt.QWidget):
def set_sps(self, sps):
self.sps = sps
self.set_rrc_taps(firdes.root_raised_cosine(self.nfilts, self.nfilts, 1.0/float(self.sps), self.excess_bw, 45*self.nfilts))
+ self.epy_block_0.delays = [self.sps+1,self.sps+1,self.sps+1,self.sps+1,self.sps+1]
def get_nfilts(self):
return self.nfilts