{ "cells": [ { "cell_type": "markdown", "id": "b237b957-6e4f-4784-97b5-ccd1d910a4cd", "metadata": {}, "source": [ "# DDM MIMO\n", "\n", "## DDM MIMO ULA" ] }, { "cell_type": "code", "execution_count": 1, "id": "fe509725-1ac0-4347-8be0-6b1f7c5247e1", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "running from git folder, using local path (latest) mmWrt code c:\\git\\mmWrt\n", "version: 0.0.8-pre.1\n", "last run on 2024-10-27 16:58:34.442277\n" ] } ], "source": [ "# Install a pip package in the current Jupyter kernel\n", "import sys\n", "from os.path import abspath, basename, join, pardir\n", "import datetime\n", "\n", "# hack to handle if running from git cloned folder or stand alone (like Google Colab)\n", "cw = basename(abspath(join(\".\")))\n", "dp = abspath(join(\".\",pardir))\n", "if cw==\"docs\" and basename(dp) == \"mmWrt\":\n", " # running from cloned folder\n", " print(\"running from git folder, using local path (latest) mmWrt code\", dp)\n", " sys.path.insert(0, dp)\n", "else:\n", " print(\"running standalone, need to ensure mmWrt is installed\")\n", " !{sys.executable} -m pip install mmWrt\n", "\n", "from os.path import abspath, join, pardir\n", "import sys\n", "from numpy.fft import fft, fftshift\n", "from scipy.signal import find_peaks\n", "import matplotlib.pyplot as plt\n", "from numpy import arange, cos, sin, pi, zeros\n", "\n", "from mmWrt.Scene import Antenna, Medium, Radar, Receiver, Target, Transmitter\n", "from mmWrt.Raytracing import rt_points\n", "from mmWrt import __version__\n", "print(\"version:\", __version__)\n", "\n", "print(\"last run on \", datetime.datetime.now())" ] }, { "cell_type": "code", "execution_count": 2, "id": "9c51acf6-a832-4297-b517-242376d6edb6", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Generic observations about the simulation\n", "Compute: True\n", "Radar freq: 60.0 GHz\n", "ADC samples # 64\n", "range resolution 0.75\n", "Range resolution 0.75\n", "Tc 0.0007142857142857143\n", "T[-1] 0.038715\n", "ts 5e-06\n", "N adc per chirp 64\n", "t_interchirp 0.0012\n", "frame timing: 0.0015199999999999999\n", "simulation time 0.0015199999999999999\n", "Dmax 107142.85714285714\n", "Dmax as function fs 107.14285714285714\n", "radar lambda: 0.005\n", "vmax :1.0416666666666667\n", "speed resolution (within a frame of N chirps): 0.109375\n", "---- TARGETS ---\n", "IF frequency for target[0] is 18853.333333333332, which is 0.094 of fs\n", "----- target[0] covers less than one range: 0.0 < 0.75 range res.\n", "Range index: from 13.0 to 13.0\n", "vmax of target is: 0.0 < unambiguous speed: 1.0416666666666667\n", "vt_min: 0.0, vt_mean: 0.0, vt_max:0.0\n", "End of simulation time: 0.038715\n", "IF frequency for target[1] is 28186.666666666668, which is 0.14 of fs\n", "----- target[1] covers less than one range: 0.0 < 0.75 range res.\n", "Range index: from 20.0 to 20.0\n", "vmax of target is: 0.0 < unambiguous speed: 1.0416666666666667\n", "vt_min: 0.0, vt_mean: 0.0, vt_max:0.0\n", "End of simulation time: 0.038715\n", "IF frequency for target[2] is 37520.0, which is 0.19 of fs\n", "----- target[2] covers less than one range: 0.0 < 0.75 range res.\n", "Range index: from 26.0 to 26.0\n", "vmax of target is: 0.0 < unambiguous speed: 1.0416666666666667\n", "vt_min: 0.0, vt_mean: 0.0, vt_max:0.0\n", "End of simulation time: 0.038715\n" ] }, { "data": { "text/plain": [ "" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from scipy.fft import fft, fft2\n", "\n", "f0 = 62e9\n", "# Number of ADC samples\n", "NA = 64\n", "# Number of TX channels\n", "NT = 2\n", "# Number of RX channels\n", "NR = 8\n", "# Number of chirps (used for speed)\n", "NC=32\n", "\n", "tic0 = 1.2e-3\n", "\n", "void = Medium()\n", "c = void.v\n", "lambda0 = c/f0\n", "_fs = 2e5\n", "_k = 28e10 # chirp slope\n", "tic0 = 1.2e-3\n", "\n", "TXs = [Antenna(x=NR*lambda0/2*i) for i in range(NT)]\n", "RXs = [Antenna(x=lambda0/2*i) for i in range(NR)]\n", "\n", "radar = Radar(transmitter=Transmitter(bw=0.2e9, slope=_k,\n", " antennas=TXs,\n", " t_inter_chirp=tic0,\n", " chirps_count=NC,\n", " conf={\"mimo_mode\":\"DDM\",\n", " \"TX_phase_offsets\":[0,0.5]}),\n", " receiver=Receiver(fs=_fs, max_adc_buffer_size=2048,\n", " n_adc=NA,\n", " antennas=RXs),\n", " debug=False)\n", "r1, theta1 = 10.1, 0\n", "x1, y1 = r1*cos(theta1), r1*sin(theta1)\n", "r2, theta2 = 15.1, pi/2\n", "x2, y2 = r2*cos(theta2), r2*sin(theta2)\n", "r3, theta3 = 20.1, pi*0.8\n", "x3, y3 = r3*cos(theta3), r3*sin(theta3)\n", "\n", "target1 = Target(x1, y1, 0) # 0 degrees on x-axis <=> -pi/2 vs bore sight\n", "target2 = Target(x2, y2, 0) # pi/2 degrees vs x-ax <=> 0 degree vs bore sight\n", "target3 = Target(x3, y3, 0) # 180 degrees on x-axis <=> pi/2 vs boresight\n", "targets = [target1, target2, target3]\n", "\n", "bb = rt_points(radar, targets,\n", " debug=True)\n", "fast_time_axis = 4\n", "slow_time_axis = 1\n", "cube = bb[\"adc_cube\"]\n", "# bb[frame_i, chirp_i, tx_i, rx_i, adc_i]\n", "virtual_cube_RX0 = bb[\"adc_cube\"][0,:,0,0,:]\n", "virtual_cube_RX1 = bb[\"adc_cube\"][0,:,0,1,:]\n", "Z = fft(fft(cube, axis=fast_time_axis), axis=slow_time_axis)\n", "Z0 = abs(fft2(virtual_cube_RX0))\n", "Z1 = abs(fft2(virtual_cube_RX1))\n", "\n", "fig, (ax0) = plt.subplots(ncols=1)\n", "ax0.set_xlabel(\"Range\")\n", "ax0.set_ylabel(\"Velocity\")\n", "ax0.set_title('Velocity-Range 2D FFT')\n", "# ax0.imshow(Z0[:,:NA//2])\n", "ax0.imshow(abs(Z[0,:,0, 0,:NA//2]))\n", "sub_doppler_ghost1 = plt.Circle((0.34, 0.48), 0.02, fill=False, color=\"white\")\n", "sub_doppler_ghost2 = plt.Circle((0.4, 0.48), 0.02, fill=False, color=\"white\")\n", "sub_doppler_ghost3 = plt.Circle((0.45, 0.48), 0.02, fill=False, color=\"white\")\n", "fig.text(0.3, 0.55, f\"Doppler ghost from DDM\", color=\"white\", fontsize=12)\n", "fig.add_artist(sub_doppler_ghost1)\n", "fig.add_artist(sub_doppler_ghost2)\n", "fig.add_artist(sub_doppler_ghost3)\n", "# ax1.imshow(Z1[:,:NA//2])" ] }, { "cell_type": "code", "execution_count": 6, "id": "aa089eaf-d7c6-4274-98a7-d9b5b9fa72e7", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(16, 16, 32)\n" ] }, { "data": { "text/plain": [ "" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjIAAAFNCAYAAAAaUIXQAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/H5lhTAAAACXBIWXMAAA9hAAAPYQGoP6dpAAA0y0lEQVR4nO3deXQUVf7+8aezdUgIYSeJbCEwIFtUNkEQkIzA8AubgqA4gUFRhEHEBZlBcVSM4oCgMiCi4LBFUYKOiorILvsiMiIQCBCEgAskkJgAyf394dce2ySQpBuqi7xf59Q59K17qz4py/BQdbvKYYwxAgAAsCE/qwsAAAAoLYIMAACwLYIMAACwLYIMAACwLYIMAACwLYIMAACwLYIMAACwLYIMAACwLYIMAACwLYIMAACwLYIM4MP+9a9/yeFwqE2bNl7b5p49e+RwOBQcHKzTp08Xe9yqVavkcDhci7+/v6pXr67bb79de/bs8Vp9VtuyZYtGjhypJk2aKDQ0VLVr11b//v21b9++An07derkOh5+fn6qUKGCGjZsqLvvvlvLly8v9j4HDx7sdmx/u3zyySeSpEOHDhXZ58Ybb9RTTz1V5PrfLp06dfLWoQJ8QoDVBQAo2oIFC1S3bl1t3rxZKSkpql+/vsfbnD9/viIiInTq1Cm9++67uueee0o0ftSoUWrVqpXOnz+vXbt2aebMmVq1apV2796tiIgIj+uz2gsvvKD169erX79+at68udLT0/Xqq6/qhhtu0MaNG9W0aVO3/jVr1lRiYqIkKSsrSykpKVqyZInmz5+v/v37a/78+QoMDLzkfp1Op2bPnl2gPTY21u3zwIED9ac//cmtrVq1aoqMjHQ7P86ePavhw4erT58+6tu3r6u9Ro0alz4IgJ0YAD7p4MGDRpJZsmSJqVatmnnqqac83mZ+fr6pW7euGTNmjOnTp4/p1KlTsceuXLnSSDKLFy92a58xY4aRZF544QWP6/MF69evN7m5uW5t+/btM06n09x1111u7R07djRNmjQpsI0LFy6YBx54wEgyjz322CX3mZCQYEJDQy/aJzU11UgyL774YjF+CmO+//57I8lMmDChWP0Bu+LWEuCjFixYoEqVKqlHjx66/fbbtWDBgkL7HTx4UP369VPlypUVEhKiG2+8UR999FGhfdevX69Dhw5pwIABGjBggNasWaOjR496VGeHDh0kSQcOHHBr/+c//6l27dqpSpUqKleunFq0aKF33323wHiHw6GRI0dq6dKlatq0qZxOp5o0aeK6pfJbq1atUsuWLRUcHKyYmBi99tprrlsqvzd//ny1aNFC5cqVU+XKlTVgwAClpaVd8udp166dgoKC3NoaNGigJk2aFPsWmr+/v15++WU1btxYr776qjIyMoo1DkDJEWQAH7VgwQL17dtXQUFBGjhwoPbv368tW7a49Tlx4oTatWunTz/9VA888IAmTpyonJwc9ezZU8nJyYVuMyYmRq1atVJ8fLxCQkK0aNEij+o8dOiQJKlSpUpu7dOmTdP111+vp59+Ws8995wCAgLUr1+/QkPWunXr9MADD2jAgAGaNGmScnJydNttt+nHH3909dmxY4e6deumH3/8Uf/4xz80dOhQPf3001q6dGmB7U2cOFF//vOf1aBBA02ZMkWjR4/WihUrdPPNN5doXtCvjDE6ceKEqlatWuwx/v7+GjhwoLKzs7Vu3bpijfnhhx/clsICUHZ2doF+58+fL3ZdwFXH6ktCAAraunWrkWSWL19ujPnlllDNmjXNgw8+6NZv9OjRRpJZu3atq+3MmTMmOjra1K1b1+Tl5bnaz507Z6pUqWL+/ve/u9ruvPNOExsbW6yafr219Oabb5rvv//eHDt2zHzyySemfv36xuFwmM2bN7v1z87Odvt87tw507RpU3PLLbe4tUsyQUFBJiUlxdX21VdfGUnmlVdecbXFx8ebkJAQ891337na9u/fbwICAsxvf5UdOnTI+Pv7m4kTJ7rt5+uvvzYBAQEF2otj3rx5RpJ544033NqLurX0q+TkZCPJTJs27aLbT0hIMJIKLB07dnT1+fXWUmHLypUrC2yTW0soK5jsC/igBQsWqEaNGurcubOkX26/3HHHHZo/f74mT54sf39/SdLHH3+s1q1bq3379q6x5cuX17BhwzRu3Dh98803rsmpy5Yt048//qiBAwe6+g4cOFDx8fH673//qyZNmhSrtr/85S9un6tVq6Z58+apVatWbu3lypVz/fnUqVPKy8tThw4dCr0CFBcXp5iYGNfn5s2bq0KFCjp48KAkKS8vT59//rn69OmjqKgoV7/69eure/fu+s9//uNqW7JkifLz89W/f3/98MMPrvaIiAg1aNBAK1eu1N/+9rdi/ayS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S6mCzNy5c/Xkk0/qT3/6k06cOKGdO3fq+uuv1+eff661a9d6rbiDBw9qxowZatCggT799FMNHz5co0aN0ltvvVXkmHHjxikjI8O1pKWlea0eAADgWxzmt9+hLoGjR49qyJAh2rFjh7KysjR48GBNnjxZISEhXisuKChILVu21JdffulqGzVqlLZs2aINGzYUaxuZmZkKDw9XJ/VSgCPQa7Xh4vw9nMeUd+qUlyopO/wrhns0Pu90hpcqAQDPXTDntUrvKyMjQxUqVCiyn0cPezl37pzy8vKUl5enyMhIBQcHe7K5AiIjI9W4cWO3tmuvvVZHjhzx6n4AAIA9lSrIJCUlqVmzZgoPD9e+ffv00UcfadasWerQoYMOHjzoteJuuukm7d27161t3759qlOnjtf2AQAA7KtUQWbo0KF67rnn9MEHH6hatWr64x//qK+//lrXXHONrrvuOq8V99BDD2njxo167rnnlJKSooULF2rWrFkaMWKE1/YBAADsq1Rfv96+fbsaNmzo1lapUiW98847mjdvnlcKk6RWrVopOTlZ48aN09NPP63o6GhNnTpVd911l9f2AQAA7KvUk33tgsm+1mCy75XHZF8AV5PiTvYt9hWZMWPGFHvnU6ZMKXZfXKVMvtUVlJ7DUfqxVv67wMGLWgGUPcUOMjt27HD7vH37dl24cMF1i2nfvn3y9/dXixYtvFshAABAEYodZFauXOn685QpUxQWFqa33nrL9d6jU6dOaciQIerQoYP3qwQAAChEqebIXHPNNfrss8/UpEkTt/bdu3fr1ltv1bFjx7xWoKeYI2MNW8/XsOmtJeYlAbiaXNYH4mVmZur7778v0P7999/rzJkzpdkkAABAiZUqyPTp00dDhgzRkiVLdPToUR09elTvvfeehg4dqr59+3q7RgAAgEKV6jkyM2fO1COPPKI777xT58+f/2VDAQEaOnSoXnzxRa8WCAAAUBSPniOTlZWlAwcOSJJiYmIUGhrqtcK8hTky1mCOzJXHHBkAVxOvP0emMKGhoWrevLknmwAAACi1YgeZvn37au7cuapQocIl58EsWbLE48IAAAAupdhBJjw8XI7/u+QeHu7ZbQMAAABvKHaQmTNnTqF/BgAAsAovZwEAALZV7CDTrVs3bdy48ZL9zpw5oxdeeEHTp0/3qDAAAIBLKfatpX79+um2225T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plKlSiYkJMT06dPHHD9+3LqiLXapY3bkyBFz8803m8qVKxun02nq169vHn30UZORkWFt4Rb7y1/+YurUqWOCgoJMtWrVTJcuXVwhxhjrzzOHMcZcmWs/AAAA3lUm58gAAICrA0EGAADYFkEGAADYFkEGAADYFkEGAADYFkEGAADYFkEGAADYFkEGAADYFkEGQJnxxBNPuL3duFOnTho9evRFx9StW1dTp04t9j4GDBigyZMnl7JCACVFkAFwSYMHD5bD4ZDD4VBgYKCio6P12GOPKScnx+rSii09PV3Tpk3T3//+d1fbkiVL9Mwzz3h1P+PHj9fEiROVkZHh1e0CKBxBBkCxdOvWTcePH9fBgwf10ksv6bXXXtOECROsLqvYZs+erXbt2qlOnTqutsqVKyssLMyr+2natKliYmI0f/58r24XQOEIMgCKxel0KiIiQrVq1VLv3r0VFxen5cuXu9b/+OOPGjhwoK655hqFhISoWbNmWrRokds2OnXqpFGjRumxxx5T5cqVFRERoaeeesqtz7fffqv27dsrODhYjRs31ueffy6Hw6GlS5e6+qSlpal///6qWLGiKleurF69eunQoUMXrT8pKUnx8fEF6vntraWTJ08qPj5e5cqVU3R0tBYsWODWf9WqVQoKCtLatWtdbZMmTVL16tV14sQJV1t8fLySkpIuWg8A7yDIACix3bt368svv1RQUJCrLScnRy1atNBHH32k3bt3a9iwYbr77ru1efNmt7FvvfWWQkNDtWnTJk2aNElPP/20KxDl5eWpd+/eCgkJ0aZNmzRr1iy3W0GSdP78eXXt2lVhYWFau3at1q9fr/Lly6tbt246d+5cofX+9NNP+uabb9SyZcuL/lyDBw9WWlqaVq5cqXfffVf/+te/dPLkSdf6X4PP3XffrYyMDO3YsUNPPPGEZs+erRo1arj6tW7dWps3b1Zubm7xDiiA0rti79kGYFsJCQnG39/fhIaGGqfTaSQZPz8/8+677150XI8ePczDDz/s+tyxY0fTvn17tz6tWrUyY8eONcYYs2zZMhMQEGCOHz/uWr98+XIjySQnJxtjjJk3b55p2LChyc/Pd/XJzc015cqVM59++mmhdezYscNIMkeOHHFr79ixo3nwwQeNMcbs3bvXSDKbN292rd+zZ4+RZF566SW3fV133XWmf//+pnHjxubee+8tsL+vvvrKSDKHDh26yNEB4A0BVoYoAPbRuXNnzZgxQ1lZWXrppZcUEBCg2267zbU+Ly9Pzz33nN555x199913OnfunHJzcxUSEuK2nebNm7t9joyMdF312Lt3r2rVqqWIiAjX+tatW7v1/+qrr5SSklJgbktOTo4OHDhQaO0///yzJCk4OLjIn2/Pnj0KCAhQixYtXG2NGjVSxYoV3foFBQVpwYIFat68uerUqaOXXnqpwLbKlSsnScrOzi5yfwC8gyADoFhCQ0NVv359SdKbb76p2NhYvfHGGxo6dKgk6cUXX9S0adM0depUNWvWTKGhoRo9enSB2z2BgYFunx0Oh/Lz84tdx9mzZ9WiRYsC81ckqVq1aoWOqVq1qiTp1KlTRfYpiS+//FLSL7esfvrpJ4WGhrqt/+mnny5aDwDvYY4MgBLz8/PT3/72N40fP951tWP9+vXq1auXBg0apNjYWNWrV0/79u0r0XYbNmyotLQ0t4mzW7Zscetzww03aP/+/apevbrq16/vtoSHhxe63ZiYGFWoUEHffPNNkftu1KiRLly4oG3btrna9u7dq9OnT7v1O3DggB566CG9/vrratOmjRISEgoEsd27d6tmzZquAAXg8iHIACiVfv36yd/fX9OnT5ckNWjQQMuXL9eXX36pPXv26L777nMLJMXxxz/+UTExMUpISNCuXbu0fv16jR8/XtIvV24k6a677lLVqlXVq1cvrV27VqmpqVq1apVGjRqlo0ePFrpdPz8/xcXFad26dUXuu2HDhurWrZvuu+8+bdq0Sdu2bdM999zjuk0k/XL7bNCgQeratauGDBmiOXPmaNeuXQUegLd27VrdeuutJfrZAZQOQQZAqQQEBGjkyJGaNGmSsrKyNH78eN1www3q2rWrOnXqpIiICPXu3btE2/T399fSpUt19uxZtWrVSvfcc4/rW0u/zm8JCQnRmjVrVLt2bfXt21fXXnuthg4dqpycHFWoUKHIbd9zzz1KSkq66G2sOXPmKCoqSh07dlTfvn01bNgwVa9e3bV+4sSJOnz4sF577TVJv8zvmTVrlsaPH6+vvvpK0i9zdZYuXap77723RD87gNJxGGOM1UUAQFHWr1+v9u3bKyUlRTExMaXejjFGbdq00UMPPaSBAwd6sUJ3M2bMUHJysj777LPLtg8A/8NkXwA+JTk5WeXLl1eDBg2UkpKiBx98UDfddJNHIUb65dbUrFmz9PXXX3up0sIFBgbqlVdeuaz7APA/XJEB4FP+/e9/69lnn9WRI0dUtWpVxcXFafLkyapSpYrVpQHwQQQZAABgW0z2BQAAtkWQAQAAtkWQAQAAtkWQAQAAtkWQAQAAtkWQAQAAtkWQAQAAtkWQAQAAtvX/AdfZ37Lo2GS8AAAAAElFTkSuQmCC", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from scipy.signal import find_peaks\n", "# generate virtual antennas\n", "\n", "# important to declare the zeros as complex otherwise assignement\n", "# forces a type cast to real\n", "virtual_cube = zeros(( NC//NT, NT * NR, NA//2)).astype(complex)\n", "print(virtual_cube.shape)\n", "for tx_idx in range(NT):\n", " for rx_idx in range(NR):\n", " # virtual antenna index =\n", " # tx_idx*NT+ rx_idx\n", " virtual_rx_idx = tx_idx*NR+ rx_idx\n", " virtual_cube[:,virtual_rx_idx,:] = Z[0, tx_idx*NC//NT:(tx_idx+1)*NC//NT, 0, rx_idx, :NA//2]\n", "\n", "doppler_axis=0\n", "rx_axis = 1\n", "range_axis=2\n", "A = fftshift(fft(virtual_cube, axis=rx_axis), axes=1)\n", "# plot AoA at zero Doppler\n", "plt.xlabel(\"Range (idx)\")\n", "plt.ylabel(\"AoA (idx)\")\n", "plt.title('AoA-Range 2D FFT')\n", "plt.imshow(abs(A[0,:,:]))" ] }, { "cell_type": "markdown", "id": "71a0b855-096d-403a-aa9d-f92a56174a6b", "metadata": {}, "source": [ "## Dummy sub doppler" ] }, { "cell_type": "code", "execution_count": 12, "id": "8fc20144-646f-479d-8619-0f0929102d32", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "range peaks (array([ 6, 9, 12, 52, 55, 58], dtype=int64), {})\n", "first range bin 6\n", "doppler peaks (array([16, 26], dtype=int64), {})\n", "sub doppler width 10\n", "min 16\n", "15.0\n" ] }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAbQAAAHHCAYAAADXgq0pAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/H5lhTAAAACXBIWXMAAA9hAAAPYQGoP6dpAAA3VUlEQVR4nO3de3wU1f3/8ffmthBygZAbFAgBlDtYI2CUqwSS1CoIRdEoIFTUBuWmaPhWUXtBsBXFIvbbKtiWgEAFtFUpUAgCgQrITRQFQwEh4fYlgWBCyJ7fH/5YWZNABrLsMryej8c8HtmZs2c/sxN458zMnnUYY4wAALjKBfi6AAAAagKBBgCwBQINAGALBBoAwBYINACALRBoAABbINAAALZAoAEAbIFAAwDYAoGGq4LD4dBzzz3nlb737t0rh8Oh2bNne6V/AFcGgYYadeeddyo0NFQnT56ssk1GRoZCQkJ07NixK1iZNR988IFXAvS5556Tw+FwL8HBwWratKkef/xxnThxosZfz1feffdd3XPPPWrWrJlCQ0PVsmVLjR8/vtJ9PP/9CAoKUlRUlJKSkjR69Gjt3Lmz2q/ZtGlTj77OX0pKSiRJs2fPrrLN008/rZ49e1a5/fzFW39c4fIE+boA2EtGRobef/99LVq0SEOGDKmw/fTp01qyZInS0tJUv359H1RYUUJCgr799lsFBwe7133wwQeaMWOG1/7jmjlzpsLCwlRcXKwVK1botdde0+bNm7VmzRqvvN6VNnLkSDVs2FD333+/mjRpou3bt+sPf/iDPvjgA23evFm1a9f2aN+nTx8NGTJExhgVFhZq69atevvtt/X6669rypQpGjduXLVe94YbbtD48eMrrA8JCfF4/MILLygxMdFjXbt27dS7d2/9/Oc/d6/75JNPNH36dE2cOFGtW7d2r+/QoUO16sEVZoAadPr0aRMeHm5SU1Mr3Z6dnW0kmXnz5lnqV5KZNGlSDVRYPZmZmcYb/zwmTZpkJJkjR454rL/nnnuMJLNhw4Yaf01fWLlyZYV1b7/9tpFk/vSnP3msl2QyMzMrtD969KhJTk42ksw///nPi75mQkKCuf322y/YZtasWUaS+eSTTy7anzHGLFiwwEiqdH/gfzjliBpVu3ZtDRgwQCtWrNDhw4crbM/OzlZ4eLjuvPNOSdKJEyc0ZswYNW7cWE6nUy1atNCUKVPkcrku+lqffvqp0tPTFRERobCwMPXu3Vvr16+v0O7EiRMaO3asmjZtKqfTqUaNGmnIkCE6evSopIrX0IYNG6YZM2ZI8jwdZoxR06ZN1a9fvwqvUVJSosjISD388MPVfq/O161bN0nSnj173OuOHz+uJ554Qu3bt1dYWJgiIiKUnp6urVu3ejx31apVcjgcmj9/vn7zm9+oUaNGqlWrlnr37q3du3dXeK0ZM2aoWbNmql27tjp37qyPP/5YPXv2VM+ePT3alZaWatKkSWrRooWcTqcaN26sCRMmqLS09KL788O+JOmuu+6SJH3++ecXfb4k1a9fX/PmzVNQUJB+85vfVOs5uLZxyhE1LiMjQ2+//bbmz5+vUaNGudcfP35cS5cu1b333qvatWvr9OnT6tGjh7755hs9/PDDatKkidatW6esrCwdOnRIr7zySpWv8dlnn6lbt26KiIjQhAkTFBwcrD/+8Y/q2bOncnJy1KVLF0nSqVOn1K1bN33++ecaPny4brzxRh09elTvvfeeDhw4oOjo6Ap9P/zwwzp48KCWLVumv/71r+71DodD999/v6ZOnarjx48rKirKve39999XUVGR7r///kt6z/bu3StJqlevnnvd119/rcWLF2vQoEFKTExUQUGB/vjHP6pHjx7auXOnGjZs6NHHiy++qICAAD3xxBMqLCzU1KlTlZGRoQ0bNrjbzJw5U6NGjVK3bt00duxY7d27V/3791e9evXUqFEjdzuXy6U777xTa9as0ciRI9W6dWtt375d06ZN05dffqnFixdb3sf8/HxJqvQ9r0qTJk3Uo0cPrVy5UkVFRYqIiLhg+7KyMvcfKueEhoYqNDTUY11hYWGFdlbqgp/y9RAR9nP27FnToEEDk5yc7LH+jTfeMJLM0qVLjTHG/OpXvzJ16tQxX375pUe7p59+2gQGBpp9+/a51+kHpxz79+9vQkJCzJ49e9zrDh48aMLDw0337t3d65599lkjybz77rsV6nS5XMYYY/Ly8owkM2vWLPe2qk457tq1y0gyM2fO9Fh/5513mqZNm7r7rMq5U467du0yR44cMXv37jVvvfWWqV27tomJiTHFxcXutiUlJaa8vNzj+Xl5ecbpdJoXXnjBvW7lypVGkmndurUpLS11r3/11VeNJLN9+3ZjjDGlpaWmfv36plOnTqas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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from numpy import mean, concatenate, array\n", "radar = Radar(transmitter=Transmitter(bw=0.2e9, slope=_k,\n", " antennas=TXs,\n", " t_inter_chirp=tic0,\n", " chirps_count=NC,\n", " conf={\"mimo_mode\":\"DDM\",\n", " \"TX_phase_offsets\":[0,0.3]}),\n", " receiver=Receiver(fs=_fs, max_adc_buffer_size=2048,\n", " n_adc=NA,\n", " antennas=RXs),\n", " debug=False)\n", "r1, theta1 = 10.1, 0\n", "x1, y1 = r1*cos(theta1), r1*sin(theta1)\n", "r2, theta2 = 15.1, pi/2\n", "x2, y2 = r2*cos(theta2), r2*sin(theta2)\n", "r3, theta3 = 20.1, pi*0.8\n", "x3, y3 = r3*cos(theta3), r3*sin(theta3)\n", "\n", "v1 = 1.0\n", "target1 = Target(x1, y1, 0, xt= lambda t: x1+v1*t) # 0 degrees on x-axis <=> -pi/2 vs bore sight\n", "target2 = Target(x2, y2, 0) # pi/2 degrees vs x-ax <=> 0 degree vs bore sight\n", "target3 = Target(x3, y3, 0) # 180 degrees on x-axis <=> pi/2 vs boresight\n", "targets = [target1, target2, target3]\n", "\n", "bb = rt_points(radar, targets,\n", " debug=False)\n", "fast_time_axis = 4\n", "slow_time_axis = 1\n", "cube = bb[\"adc_cube\"]\n", "# bb[frame_i, chirp_i, tx_i, rx_i, adc_i]\n", "virtual_cube_RX0 = bb[\"adc_cube\"][0,:,0,0,:]\n", "virtual_cube_RX1 = bb[\"adc_cube\"][0,:,0,1,:]\n", "Z = fft(fft(cube, axis=fast_time_axis), axis=slow_time_axis)\n", "Z0 = abs(fft2(virtual_cube_RX0))\n", "Z1 = abs(fft2(virtual_cube_RX1))\n", "\n", "fig, (ax0) = plt.subplots(ncols=1)\n", "ax0.set_xlabel(\"Range\")\n", "ax0.set_ylabel(\"Velocity\")\n", "ax0.set_title('Velocity-Range 2D FFT')\n", "ax0.imshow(abs(Z[0,:,0, 0,:NA//2]))\n", "\n", "# find peaks\n", "range_pks = find_peaks(abs(Z[0,0,0,0,:]))\n", "print(\"range peaks\", range_pks)\n", "range_bin_idx = range_pks[0][0]\n", "print(\"first range bin\",range_bin_idx)\n", "doppler_peaks = find_peaks(concatenate((array([0]),abs(Z[0,:,0,0,range_bin_idx]))))\n", "print(\"doppler peaks\", doppler_peaks)\n", "doppler_peaks = doppler_peaks[0]\n", "sub_dop_width = NC//(NT+1)\n", "print(\"sub doppler width\", sub_dop_width)\n", "print(\"min\", min(doppler_peaks))\n", "if min(doppler_peaks) >= sub_dop_width:\n", " dopplers = [d-(idx+1)*sub_dop_width-1 for idx,d in enumerate(doppler_peaks)]\n", " # print(\"dopplers shifted\", dopplers)\n", " print(sub_dop_width+mean(dopplers))" ] }, { "cell_type": "code", "execution_count": 11, "id": "4c94a91c-38f0-460b-b7ca-c08a7486de0f", "metadata": {}, "outputs": [], "source": [ "# non regression hook\n", "# ensure first range bin does not have velocity \n", "# < NF//NT\n", "assert min(doppler_peaks) == 16\n", "assert min(doppler_peaks) >= NC//NT" ] } ], "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.11.1" } }, "nbformat": 4, "nbformat_minor": 5 }