{ "cells": [ { "cell_type": "markdown", "id": "bca9051f-3838-4776-b7b6-d6a710f50eb5", "metadata": {}, "source": [ "# High Speed\n", "\n", "Classical FMCW chirp processing computes the speed over multiple chirps.\n", "\n", "However in the case where the range bin changes within a chirp, it is also possible to measure the speed via rate of range bin change.\n", "\n", "The following is a simple illustration leveraging a STFT for illustration purposes\n", "\n", "[![](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/matt-chv/mmWrt/blob/main/docs/High-Speed.ipynb)" ] }, { "cell_type": "code", "execution_count": 2, "id": "48a3e3b9-f542-4c19-b4c8-0def46b485af", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "running from git folder, using local path (latest) mmWrt code c:\\git\\mmWrt\n", "0.0.11-pre.3\n", "2026-06-27 09:42:51.071669\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", "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 complex128 as complex\n", "\n", "from mmWrt.Raytracing import rt_points # noqa: E402\n", "from mmWrt.Scene import Radar, Transmitter, Receiver, Scatterer # noqa: E402\n", "from mmWrt import RadarSignalProcessing as rsp # noqa: E402\n", "from mmWrt import __version__ as mmWrt_ver\n", "print(mmWrt_ver)\n", "print(datetime.datetime.now())" ] }, { "cell_type": "code", "execution_count": 6, "id": "4d6f73d2-22fe-4522-aeb8-68788a96a862", "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAWgAAAHHCAYAAACSr8LuAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjMsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvZiW1igAAAAlwSFlzAAAPYQAAD2EBqD+naQAAODdJREFUeJzt3QucVeP+x/HfTDNN9/udohRdFYUit6QklMKRJIRzOhUVoXMIhcg55VZySXFIR66n3ErJpRuFqIgSSjehMtXUXPb/9X1Y+79nN1N7ai7PzHzer9d+zey119577bX3/u5n/daznhUXCoVCBgDwTnxBLwAAIGsENAB4ioAGAE8R0ADgKQIaADxFQAOApwhoAPAUAQ0AniKgAcBTxSKg4+LibODAgVaYTJkyxS33999/b8WNXrNe+7/+9a8DznvnnXe6eX1dPvht3rx57r3U3yIR0F9++aVddNFFdsQRR1ipUqXssMMOs7PPPtseeeSRTF+YA13OOOMMN/+VV16Z7Txvv/12TI/l8woGUPAmTJjgGj2FTUJOZl6wYIGdeeaZVq9ePbv22mutVq1atm7dOlu0aJE99NBDNmjQIOvRo4c1bNgwfJ/k5GTr37+/XXjhhe62QM2aNcP/JyUl2VNPPbXP87Vs2dL+85//ZJr27LPP2uzZs/eZ3qRJk5y8FBQRt912m916660FvRgoBAFdrVo11yCMdNppp9nu3butZMmSVugD+p577rGKFSvaJ598YpUqVcp025YtW9zfY4891l0CW7dudQGtaZdffnnWC5GQkO1t0dP1Y6CAzm5+mO3cudPKli1rxYE+O7qgeMvIyLC9e/e6rfqciI+Pz/F9vC1xrFmzxpo1a7ZPOEuNGjXMd88//7wdc8wx7g1p3bq1ffDBB5lu/+GHH+zvf/+7m6d06dJWtWpVu/jii/epA6emptpdd91ljRo1co+l+dq3b+9+OCJ9/fXXrhxUpUoVN1+bNm3sf//73z7LtWLFCuvQoYN7zsMPP9zuvvtu94GLhVoE5cqVc+/Nueeea+XLl7fevXu72z788EO3/Nri0VZK3bp1bciQIa7FkNVj/PTTT9a9e3f3f/Xq1e2mm26y9PT0TPP+8ssv1qdPH6tQoYL7HPTt29eWLVvmykzRm5Cxvv79GTdunCunad2cfvrptnz58gPWoIN9Dq+99po1b97cvXZ9blUyi0VKSop73KOPPtotd+3atd3Wn9ZxtCeeeMKOOuoo9xwnnHCCa7xE+uKLL9z6bdCggXssbXVeffXVbj1m9TpWr17t5te6VWPoqquusl27dmWaV+/f9ddf71qEer8vuOAC997p/nqcSJqu59MWa7Aenn766X1eh0qUuq1MmTJWuXJl915NnTr1gOtKDbN+/fq5x9fr01bvM888k+m7ovdfryPajh073H30OQvs2bPH7rjjDrcVnvTnZ/bmm29207N6j/Wd1nJr3uze3yOPPNJ9x95///19SqxZ1aB1mz43eu/0mdM60fK89NJL7nY9zkknneQ+k8qKd999d5/njHW9H0iOmh76oixcuNB9SfQCcpNa2pESExPdBzS3aKX+97//dR9srTBt8pxzzjn28ccfh1+Lvlwq41x66aUuKBXMjz32mHvDVq5c6d4o0Zdg9OjRds0119iJJ57oPmhLliyxTz/91NXjRR+IU045xdXotQmuFu2LL77oAvDll192JR/ZtGmTKxulpaWF59OXXm9+rHTfzp07ux8J7bgKlnP69Onuy60tGP2I6LXqi7h+/Xp3WyQFsR5DHzw9hj50//73v1346P6iH43zzz/fPY6mNW7c2F5//XUX0tFiff37o3LW77//bgMGDHChqTKafsi0HySyRJaVjz76yF555RX3g6sQe/jhh61nz572448/unWRHa2H8847z+bMmeM+BzfccINbBv346nOv9RFQgOm2v/71r+5LPmbMGBfk3333nfv8iu6n6woohbPWi95f/dXWYPSPyyWXXGL169d3ny99nlT6U+Pn/vvvD8+jANe61A9l27Zt3We7a9eu+7yWzZs3u9uDMNOP7ltvveUCVZ/ZwYMHu/mefPJJ973Qj6ler9a1wmnx4sV22WWXZbuu9EOh74Z+VPT4Wm59rrR827Ztc4+l9aD3Wu/F448/nqmUoB9QBa/Wc/D50o+N3rvrrrvOlS31XutH+ptvvnHzR5o7d65bD3pu/VgpiLPy4IMPuvKrGh7//Oc/3bQDfX5+++039znQsqmRoxzQ//pB0Hr729/+5tbNAw884NabSr36nOVkvccklAOzZs0KlShRwl3atWsXuvnmm0PvvPNOaO/evdne5+eff9Z406E77rgjy9v79u3rbo++nH766VnOP2DAAHd7TgSPuWTJkvC0H374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us1o80S/tNp80xukVk1WfR19oVqxPtyR3ewkchNO3Wr04VFpQx9Qhbpqc9HdsnSbAkg7HdWSVhc7tb4jx/tQaKmloE027VRTq1Ldb/SY2iGjloKoj6eeU5u86pYUdLMLWicHS++PWiQqM+hDr/qlPjQHqsHujzZNVae88cYbXYtNz6H6tsoo0a2UWF///uhHT4+hHaD68VOw6b3QOssr2tpQ976hQ4e6HwTtpFMw6HOgHXPa9xArrXO1HLUzXUGnmrtKYmr9Hix95hQAWhcK1qCbnbYsot+D++67zzWqtI9D74E+t3qv1FDR6wneNzVStA9GNWd1P1MdWD9Q6roXdB3LirrC6UdYJbOlS5e6DND3YP78+W75ou+rQFZ4qwyqz0X00b/aj6PSh3aUarlPOeUU1zhSi1zTtUM/2Fo/mPWmrnI6xkCfKzUigp2PuS3W9R6TmPt7hEKht956y3UDaty4setGo65MDRs2DA0aNCi0efPmg+5mV7Zs2ZiX4WC72el+6g6kLl5JSUmuC1lk1xr57bffQldddVWoWrVq7vV17tzZda854ogj3HIG7r777tCJJ54YqlSpkusKpvVxzz337NPdcM2aNaErrrgiVKtWrVBiYmLosMMOC5133nmhl156KdN8X3zxhevao25/mmfUqFGhSZMmxdzNLrv1t3LlylDHjh3da9Fruvbaa8PdzSK7BWX3GFl1YdP7edlll4XKly/vugype5e6P2m+adOmHdTrjxZ0Y3vggQdC//73v0N169Z179mpp57qlv9Ayxi839Gi38fsqBvUP//5z1D9+vXdcmv5L7roIvd6opcvWvRnXd0E1VVOnxWtr4svvji0YcOGfeYLXofWbyS9T9Gfg507d7rXV6VKFffedu/ePbRq1So333333Zfp/vpeal6tw+C1qAvkE088EZ7n8ccfD5122mmuO5/W81FHHRUaNmxYaPv27QdcV3r84DujPFDXysjPVnQ3RS2HllPfoazoO3T//fe7bnFJSUmhypUru66ed911V6blye49zs6mTZtc11h9biO78WbXzS6rbof6/GTVvTarZYllvcci7s8nAA6aShHaqtIBBgfa84+8oR5Uxx13nD333HM57qIJfxWL4UaRe6IPE9cmqDZbtTl//PHHF9hyFef3QFRSUJ1XJRUUHYwyA8vpfggFhLohqi6s/qza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Bm3t95aJdnirrda14TfWu/Vq25yYbos2HGUpX1S2VavLmz1e0C8ExQkBjeLpz/qyWta2d6/ZrhSL277Lyn9mtqNcGZtSp5Wl1jdr0HSXNWyebKXa/2irSzco6KVGMUNAe+x///tftl3sNHBSw4YN9ztmNGIQMXKeC2v9u22HJe5ItsRVcbZ5XpJtKF/a4qtVtJSjyxTssqLYIaA91r17dxfG0ftxg2n62759e3vttdescuXKBbacRU5EH+nQznSL32lmm+Oswo6CXjAUN4zj6LHZs2fbCSec4P6q54Au+v+kk06ymTNn2gcffGC//PKLO/QbeRjWf3a5i0tOKeilQTFDC9pjN9xwgz3xxBN28sknh6edddZZrryh8xauWLHCHnzwQbv66qsLdDmLi6AEAuQXWtAeW7NmTZb9bTUtOB9ho0aNCuWwo4USI+UhnxHQHtOwosOGDbOff/45PE3/33zzza70Id9++63VrVu3AJeyGIk+shDIY5Q4PD/dVbdu3ezwww8Ph/C6deusQYMG9vrrr7vrycnJdttttxXwkhYP4RH2gHxCQHvsmGOOsZUrV7rhRr/55pvwtLPPPtviNUjQnz09kE8YFAH5jID2nIL4nHPOcRcUMIatQT4joD03Z84cd9myZYtlRG1iP/300wW2XMUS+Yx8RkB77K677nJn7tZ5CWvXru0OTEFBIqGRvwhoj02cONGmTJliffr0KehFgZDPyGd0s/PY3r17Mx2kgoJGQiN/EdAeu+aaa2zq1Km58liPPfaYHXvsse4gF13atWtnb731Vvj2lJQUGzBggFWtWtXKlStnPXv2tM2bN2d6DJ2stmvXrlamTBmrUaOG66Od9ud4ywByHyUOjyk0daj3u+++68I1MTHzGUjGjh0b82OpL/V9993njjzUQEvPPPOM62P92WefWbNmzWzIkCH2xhtv2PTp090ZTwYOHGg9evSw+fPnu/unp6e7cK5Vq5YtWLDANm7c6M4srmW69957rVigAY18ximvCukZvnPjrN5VqlSxBx54wC666CKrXr26a63rf/n666+tSZMmtnDhQmvbtq1rbZ933nm2YcMGq1mzZrhGfsstt7ijG0uWLOnXKa/yQFp8hs1Lf4VTXiHf0IL22HvvvZcnj6vWsFrKO3fudKWOpUuXWmpqqnXs2DE8T+PGja1evXrhgNbfFi1a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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from scipy.fft import fft, fft2\n", "from scipy.signal import stft\n", "\n", "c = 3e8\n", "\n", "debug_ON = False\n", "test = 0\n", "NC=1\n", "n=16\n", "NA=512*n*2\n", "fs0 = 10e5*n\n", "chirp_slope0 = 2e12\n", "tic0 = 1.2e-3\n", "raytracing_opt = {\"logging_level\":10}\n", "chirp_bandwidth = 4e9\n", "chirp_end_time0 = chirp_bandwidth/chirp_slope0\n", "adc_sample_rate0=fs0\n", "radar = Radar(transmitter=Transmitter(chirp_end_time=chirp_end_time0, \n", " chirp_slope=chirp_slope0,\n", " chirp_period=tic0,\n", " chirps_count=NC),\n", " receiver=Receiver(adc_sample_rate=adc_sample_rate0,\n", " adc_sample_count=NA,\n", " adc_sample_count_max=NA*2,\n", " adc_sample_rate_max=fs0*2,\n", " debug=debug_ON), debug=debug_ON)\n", "\n", "x1, v1 = 5, 10000*2\n", "scatterer1 = Scatterer(xt=lambda t: v1*t+x1)\n", "\n", "scatterers = [scatterer1]\n", "\n", "bb = rt_points([radar],\n", " scatterers,\n", " radar,\n", " datatype=complex, debug=debug_ON,\n", " raytracing_opt=raytracing_opt)\n", "\n", "cube = bb[\"adc_cube\"][0,0,0,:]\n", "\n", "seg_n = 512\n", "# nperseg: Length of each segment\n", "# noverlapint: Number of points to overlap between segments. If None, noverlap = nperseg // 2\n", "# return_onesidedbool, optional - If True, return a one-sided spectrum for real data.\n", "_, _, fft_st = stft(cube, nperseg=seg_n, return_onesided=False)\n", "plt.title(\"STFT based range bin changes over time\")\n", "plt.xlabel(\"Time base\")\n", "plt.ylabel(\"Rang bin (idx)\")\n", "plt.imshow(abs(fft_st[:,:]))\n", "plt.show()" ] }, { "cell_type": "markdown", "id": "be6d58ac-8283-46c3-a445-14af43d97cf0", "metadata": {}, "source": [ "## compute speed after STFT" ] }, { "cell_type": "code", "execution_count": 10, "id": "72cb071c-5f1f-488e-add8-e12ffed075c8", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "speed estimate: 20599.365234375\n" ] } ], "source": [ "from scipy.signal import find_peaks\n", "# find the range bin where target is at the begining of STFT\n", "peak_at_start = find_peaks(abs(fft_st[:,0]))[0][0]\n", "# find the range bin where the target is at the end of STFT\n", "peak_at_end = find_peaks(abs(fft_st[:,-1]))[0][0]\n", "\n", "# speed = Delta D/Delta T\n", "\n", "# Range bin resolution from samples\n", "R_bin_fft = fs0*c/2/chirp_slope0/NA\n", "# Range bin resolution for STFT is scaled up by nperseg\n", "R_bin_stft = R_bin_fft*NA/seg_n\n", "# compute the chirp time, which is also the divider for the speed\n", "Tc = NA*1/fs0\n", "# The target distance grows 2x (there and back) so speed needs to be divided by 2\n", "speed_estimate = (peak_at_end-peak_at_start)*R_bin_stft/Tc/2\n", "print(f\"speed estimate: {speed_estimate}\")\n" ] }, { "cell_type": "markdown", "id": "21f3e583-ded3-4180-8e5e-1b56a9604d83", "metadata": {}, "source": [ "## non regression" ] }, { "cell_type": "code", "execution_count": 11, "id": "b29c1152-521f-435f-9539-c687b55a2528", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "last run: 2026-06-27\n" ] } ], "source": [ "from datetime import datetime as dt\n", "assert speed_estimate==20599.365234375\n", "print(f\"last run: {dt.now().date()}\")" ] } ], "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.10.9" } }, "nbformat": 4, "nbformat_minor": 5 }