{ "cells": [ { "cell_type": "markdown", "id": "f3474114", "metadata": {}, "source": [ "# FMCW Intro - Grouping\n", "\n", "You can open this workbook in Google Colab to experiment with mmWrt \n", "[![](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/matt-chv/mmWrt/blob/main/docs/Grouping.ipynb)\n", "\n", "Below is an intro to mmWrt for simple targets position estimation\n", "\n", "For a generic introduction to mmWave sensors:\n", "[Watch Here](https://www.youtube.com/watch?v=XJ6JhB8wOPU)" ] }, { "cell_type": "markdown", "id": "592128ec", "metadata": {}, "source": [ "## The problem\n", "\n", "As distance estimation is based on FFT, spectral leakage even after CFAR may lead to detection of too many targets.\n", "\n", "Changing synthetic target distances in order to make this more visible in the below code\n", "\n", "## The solution\n", "\n", "Pass the index of FFT bin which are over the CFAR threshold to a peak_grouping function which groups them.\n", "\n", "Multiple grouping algorithms are possible:\n", " * 1D: Adjacent grouping to lead or tail, or interpolation grouping to find the more likely position of the point target " ] }, { "cell_type": "code", "execution_count": 1, "id": "24748fe1", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "running from git folder, using local path (latest) mmWrt code c:\\git\\mmWrt\n", "2024-05-23 13:57:54.525423\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", "print(datetime.datetime.now())" ] }, { "cell_type": "code", "execution_count": 2, "id": "7931099f", "metadata": {}, "outputs": [], "source": [ "from os.path import abspath, join, pardir\n", "import sys\n", "import matplotlib.pyplot as plt\n", "import matplotlib.cm as cm\n", "from matplotlib import colors\n", "from numpy import where, expand_dims\n", "from numpy import complex_ as complex\n", "\n", "from mmWrt.Raytracing import rt_points # noqa: E402\n", "from mmWrt.Scene import Radar, Transmitter, Receiver, Target # noqa: E402\n", "from mmWrt import RadarSignalProcessing as rsp # noqa: E402" ] }, { "cell_type": "markdown", "id": "f77b057f", "metadata": {}, "source": [ "## Exposing the problem" ] }, { "cell_type": "code", "execution_count": 17, "id": "ade80218", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "synthetic targets [7.2, 12.1]\n", "found targets [6.696428571428571, 7.533482142857142, 11.71875, 12.555803571428571]\n", "amplitude found targets [69.56788153259075, 91.09148943355741, 82.76276086905901, 79.16993976450007]\n", "error is 5.070089285714286\n" ] }, { "data": { "image/png": "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PRAVizmjtJj7z9cxb948HD16FPv378fixYvx+uuvAwC6dOmC06dP49NPP8WJEycwb948LF++3OUlY2JisHLlSqjVaowbN86eYerSpQs++ugjHD58GNu3b8fkyZOdMktjxoxB586dMWXKFOzbtw+bN2/G008/DUAMIAFg8uTJaNWqFSZOnIhNmzYhLy8P69evx4MPPojff//dv8+AiIgaYYASBuLj47Fx40Zcd911uPzyy/H000/jtddew7hx4+znjB49Gl26dMFVV12F2267DTfccANmz55tf/65557DM888g7lz56J79+4YO3YsVq5caZ8iSk5Oxrp161BRUYGRI0di4MCBePfdd+3ZlPvuuw9du3bFoEGD0Lp1a2zevLnxQG0dZJ++rgMGDBiInJwcjBo1Cmlpad41eXMnOhl/GhCF916agcWLF6N3794YOXIkPvjgA/v4b7jhBjzyyCOYPn06+vXrhy1btuCZZ55xe8nY2Fj873//gyAIGD9+PCorK/H++++jpKQEAwYMwF133YUHH3wQKSkp9teoVCp8/fXXqKiowODBg/GnP/3JnrHR6cSeL9HR0di4cSPat2+Pm266Cd27d8fUqVNhMpmYUSEikpFCEBzWskaIsrIyGAwGGI3GFvGlcM8996C0tNSpF0dIHPgS+OKPQPss4I+rfHqp9GcmZSKcvDsaOLsLuH0p0G28HCOVzebNmzF8+HAcP34cnTt3DvVwiIgimi/f36xBIe8FsEngHXfcga5du2LOnDmNn4xpJd5Xng9gcPJYvnw5YmNj0aVLFxw/fhwPPfQQhg0bxuCEiKiZcYqHvBdAgJKYmOi+22y0FKBccP18MyovL8e0adPQrVs33HPPPRg8eDC++eabUA+LiKjFYQYlAnzwwQehHoIogAAlJycHixYtQl5eXuOl0zHJ4n3VxQAHGLi7774bd999d6iHQUTU4jGDQt4z2lap+LGL8TXXXAO1Wo0ffvih8ZMxtv4hYTDFQ0RE4YEBCnlPmoKJSfF8ngvx8fHIyspyHaCE0RQPERGFBwYo5B2rFaguFh9HJzd5+rlz51BeXu50LCcnB7m5uY17rEhFslUMUIiISMQAhbxjKgUEq/g4OqnJ06+++mrMnz/f6VhOTg7Ky8uxbds255OlgKcy9DUoREQUHhigkHeqbNkTbTyg1no89bfffsPRo0fR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jdpivAxQnJYZh6oHioSFskREspA9QCkpKcGwYcOg0Wjwv//9D4cOHcJrr72GxMRE+zmvvPIK5s2bh0WLFmH79u2IiYlBTk4OTCaT3MO59PhUJGuof2wyup/icfzSd6jbCNVSYymDonfsg+JpPx6pSLamLnQreCQMUIiIZKFu+hTfvPzyy2jXrh0WL15sP5aZmWl/LAgC3njjDTz99NOYOHEiAOC///0vUlNT8fXXX+P222+Xe0iXFl8yKEqV+MVeUwZUl6K0Smxz73ajQG282LXVRq9RoRTmZm9372sGJV7nWCQbwikex/dlgEJEFBDZMyjffvstBg0ahD/84Q9ISUlB//798e6779qfz8vLQ0FBAbKzs+3HDAYDhg4diq1bt7q8Zk1NDcrKypxuLZYvNSiAUx2KlEGJd7tRYILT4VD1QqnPoHg7xSPVoJiBylBP8Uj78bBIlogoELIHKL/99hsWLlyILl264IcffsADDzyABx98EB9++CEAoKCgAACQmprq9LrU1FT7cw3NnTsXBoPBfmvXrp3cw44cUgbFm1b3gMNS4xIPUzyl4n2DZbm6ELW7lwKUGC/7oDhtFmjfybiZ29xL9NwwkIhIDrIHKFarFQMGDMCLL76I/v374/7778d9992HRYsW+X3NGTNmwGg02m9nzpyRccQRxtcMikMvFKO7ItkGS4ztL40KVQZFnOLRu+yD4mGZMad4iIguGbIHKOnp6ejRo4fTse7du+P06dMAgLS0NABAYWGh0zmFhYX25xrSarWIj493urVYFrGOxKsaFMCeFRE8ZVDcBSihyqDUeMig1JQBVue+LPYi2do6CI59UEKBAQoRkSxkD1CGDRuGI0eOOB07evQoOnToAEAsmE1LS0Nubq79+bKyMmzfvh1ZWVlyD+fS42cGxVxZDLNF7AjrbQYlFO3uBUFAldnDXjwQGq3kibfVoAgCIIS8BoUBChGRHGQPUB555BFs27YNL774Io4fP46lS5finXfewbRp0wAACoUCDz/8MJ5//nl8++232L9/P+6++25kZGRg0qRJcg/n0mK1OmRQfCuSra0QizY1KoXz1AnQ9BRPM2ZQauqssNha6zsFKBodoLJljRoEKFq1EhqVAoAARbW0zDhENSjcj4eISBayLzMePHgwli9fjhkzZuDZZ59FZmYm3njjDUyePNl+zuOPP47K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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "c = 3e8\n", "\n", "debug_ON = False\n", "test = 0\n", "radar = Radar(transmitter=Transmitter(bw=0.2e9, slope=70e8, chirps_count=64, t_inter_chirp=0.15),\n", " receiver=Receiver(fs=5e3, n_adc=128, max_adc_buffer_size=1024,\n", " debug=debug_ON), debug=debug_ON)\n", "\n", "target1 = Target(7.2)\n", "target2 = Target(12.1)\n", "\n", "targets = [target1, target2]\n", "\n", "bb = rt_points(radar, targets, datatype=complex, debug=debug_ON)\n", "Distances, range_profile = rsp.range_fft(bb, debug=debug_ON, full_FFT=False)\n", "ca_cfar = rsp.cfar_ca_1d(range_profile)\n", "\n", "mag_r = abs(range_profile)\n", "mag_c = abs(ca_cfar)\n", "# little hack to remove small FFT ripples : mag_r> 5\n", "target_filter = ((mag_r > mag_c) & (mag_r > 20))\n", "\n", "index_peaks = where(target_filter)[0]\n", "# grouped_peaks = rsp.peak_grouping_1d(index_peaks)\n", "\n", "found_targets = [Target(Distances[i]) for i in index_peaks]\n", "error = rsp.error([target1, target2], found_targets)\n", "print(\"synthetic targets\", [t.distance() for t in targets])\n", "print(\"found targets\", [t.distance() for t in found_targets])\n", "print(\"amplitude found targets\", [mag_r[i] for i in index_peaks])\n", "print(\"error is\", error)\n", "\n", "# 2D representation of the FFT and CFAR\n", "# plot on X,Y axis the FFT and CFAR\n", "figure, axes = plt.subplots()\n", "plt.plot(Distances, mag_r, '-o')\n", "plt.plot(Distances, mag_c)\n", "plt.title(\"2D plots FFT w/ CFAR\")\n", "\n", "# Add illustration of spectral leakage\n", "# annotate\n", "# xy: position of arrow\n", "# xytext: position of text\n", "xytext = (10, 110)\n", "leak1_xy = (6.7, 70)\n", "leak2_xy = (12.6, 79)\n", "\n", "leakage_1 = plt.Circle( leak1_xy, 1, fill=False)\n", "leakage_2 = plt.Circle( leak2_xy, 1, fill=False)\n", "axes.add_artist(leakage_1)\n", "axes.add_artist(leakage_2)\n", "\n", "plt.annotate(\"spectral leakage\", xy=leak1_xy,xytext=xytext,\n", " horizontalalignment=\"center\",\n", " # Custom arrow\n", " arrowprops=dict(arrowstyle='->',lw=1)\n", " )\n", "\n", "plt.annotate(\"\", xy=leak2_xy,xytext=xytext,\n", " horizontalalignment=\"center\",\n", " # Custom arrow\n", " arrowprops=dict(arrowstyle='->',lw=1)\n", " )\n", "\n", "plt.show()" ] }, { "cell_type": "markdown", "id": "a307d617", "metadata": {}, "source": [ "## The solution: peak grouping\n", "\n", "In order to reduce the error, it is necessasry to proceed to peak grouping \n", "\n", "below code shows how to do it by calling `peak_grouping_1d`\n", "\n", "The result can be seen in that the error (distance between synthetic targets and found targets) is reduced
from 5.1 to 0.8
as demonstrated in the next code cell.\n", "\n", "> Note: this only selects the index with maximum amplitude, a further improvement would be to interpolate so instead of having an integer index, a float index which would translate in a more accurate position. " ] }, { "cell_type": "code", "execution_count": 23, "id": "1934d690", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "synthetic targets [7.2, 12.1]\n", "found targets [7.533482142857142, 12.555803571428571]\n", "RMS error reduced from: 5.070089285714286 to: 0.7892857142857137\n" ] } ], "source": [ "index_peaks = where(target_filter)[0]\n", "grouped_peaks = rsp.peak_grouping_1d(index_peaks, mag_r)\n", "\n", "found_targets = [Target(Distances[i]) for i in grouped_peaks]\n", "error_grouped = rsp.error([target1, target2], found_targets)\n", "print(\"synthetic targets\", [t.distance() for t in targets])\n", "print(\"found targets\", [t.distance() for t in found_targets])\n", "print(f\"RMS error reduced from: {error} to: {error_grouped}\")\n", "\n" ] }, { "cell_type": "markdown", "id": "5da43460", "metadata": {}, "source": [ "### NON REGRESSION" ] }, { "cell_type": "code", "execution_count": 24, "id": "143e2db0", "metadata": {}, "outputs": [], "source": [ "try:\n", " assert error_grouped <= 0.8\n", "except Exception as ex:\n", " log_msg = f\"error should be <0.8, found to be : {error}\"\n", " print(log_msg)\n", " raise" ] } ], "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 }