{ "cells": [ { "cell_type": "markdown", "id": "43a219ed", "metadata": {}, "source": [ "# `mcsm-benchs`: Benchmarking methods for instantaneous frequency estimation" ] }, { "cell_type": "markdown", "id": "291d278b", "metadata": {}, "source": [] }, { "cell_type": "code", "execution_count": 1, "id": "04325818", "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "from numpy import pi as pi\n", "import scipy.signal as sg\n", "import pandas as pd\n", "from matplotlib import pyplot as plt\n", "from mcsm_benchs.Benchmark import Benchmark\n", "from mcsm_benchs.ResultsInterpreter import ResultsInterpreter\n", "from mcsm_benchs.SignalBank import SignalBank\n", "from utils import get_stft" ] }, { "cell_type": "markdown", "id": "dd2599c8", "metadata": {}, "source": [ "## Creating a dictionary of signals\n", "\n", "We can use the `SignalBank` class to generate a dictionary of signals to study. We are going to use three signals: 1) a linear chirp, 2) a cosenoidal chirp and 3) an exponential chirp. Below we can see how to generate the signals as well as their spectrograms, which show the trajectories of the instantaneous frequencies giving name to the signals.\n", "\n", "We use the option `return_signal=True`, so that the signals generated by the `SignalBank` are objects of the `Signal` class, which behave like a regular `numpy` array, but include additional information of the generated signals, such as the instantaneous frequency of each signal component." ] }, { "cell_type": "code", "execution_count": 2, "id": "5237de4f", "metadata": {}, "outputs": [ { "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": [ "# Create a dictionary of signals:\n", "N = 128\n", "sb = SignalBank(N=N, return_signal=True)\n", "\n", "signal_1 = sb.signal_linear_chirp()\n", "signal_2 = sb.signal_cos_chirp()\n", "signal_3 = sb.signal_exp_chirp()\n", "\n", "# Create a dictionary of signals for later.\n", "signals = {'linear_chirp':signal_1, 'cos_chirp':signal_2, 'exp_chirp':signal_3}\n", "\n", "# Display the spectrograms of the signals.\n", "stft1 = get_stft(signal_1)\n", "stft2 = get_stft(signal_2)\n", "stft3 = get_stft(signal_3)\n", "\n", "fig, axs = plt.subplots(1,3, sharey=True)\n", "axs[0].imshow(np.abs(stft1)**2, origin='lower')\n", "axs[1].imshow(np.abs(stft2)**2, origin='lower')\n", "axs[2].imshow(np.abs(stft3)**2, origin='lower')" ] }, { "cell_type": "markdown", "id": "7270230c", "metadata": {}, "source": [ "## Creating a dictionary of methods\n", "\n", "We will define two methods to estimate the instantaneous frequency of the previously created signals. Notice that all signals have only one component, which simplifies our methods, but **any method outputting a `list` of estimated instantaneous frequencies** (one per component) can be benchmarked. The benchmarking procedure takes care of matching the output of the method with the most similar component from the signal in order to compute the performance metric of each IF estimation.\n", "\n", "An instantaneous frequency estimation consists in an array of the **same length of the signal** with normalized frequency (between $0$ and $0.5$). Sometimes, signal components might not *live* the entire duration of the signal. In such cases, the IF estimation is considered valid only where the component is defined, i.e. where it is *alive*. The remaining time can be filled with zeros.\n", "\n", "The first method is based on the classical *analytical signal*. The latter is a complex signal, the real part of which is the original, real-valued signal, whereas its imaginary part is the Hilbert transform of the original signal. This way, one can estimate the instantaneous frequency as the **derivative of the phase** of the analytical signal." ] }, { "cell_type": "code", "execution_count": 3, "id": "3a58d32e", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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2FwR6tOnD6ZMmYITJ06gYcOGhZqln3zyyTILjmxnPX1er7ceGjOcZ76gorGxWqNiRYiIiOTF5kTohRdeAAC8++67hZ5js7T0rKfPG3uBjK1cRe4+n2dcR4gVISIikhebEyHrvcWofDH2+RirPPpCe40VXlk6N/8LtYqJEBERyYtNd77c3FyoVCqcPHnSXvHQQzLtNZZXzNBYSXuNcWVpIiKSGZsSIbVajcjISA5/lWPG4a28/ETHuKBiwawxw9d60/MijKNknD5PRERyY/Od780338Qbb7yBlJQUe8RDD8k0NGacPl/MgorG48ZqEMAFFYmISH5s7hH6/PPPceHCBYSHh6NKlSrw8vKyeP7w4cNlFhzZzjQ0lt8sLVr1CFk3S5snQqwIERGR3NicCPXr188OYVBZUVlXhPKHwBSFdp9H/nkFvUJMhIiISG5sToRmzZpljziojGisV5a22n3e1CxtVREShIIkiYiISC5sToSMYmJicObMGQBA/fr10bRp0zILih5cwYKKxqExw3HrBRVNQ2N67jNGRETyZXMilJSUhKFDh2Lnzp3w9/cHANy9exedOnXCunXrUKFChbKOkWxQMGvMamjMaosNUTT0D+Vx6jwREcmYzWWAl156Cenp6Th16hRSUlKQkpKCkydPIi0tDZMmTbJHjGQDTf6iiLl5BdPjgYJp88aEyPiccWhMxYoQERHJkM0Voa1bt2L79u2oW7eu6Vi9evWwePFidOvWrUyDI9up8jOeXOuVpU1DY2aJkCiahtA4NEZERHJk891Pr9cX2mgVMCy2yO03pGe915jeqlnavCFaFM1WleYaQkREJEM2J0KPP/44Jk+ejISEBNOx69evY8qUKejcuXOZBke2K7SgYn5uqrBaWdrwHCtCREQkbzbf/T7//HOkpaUhKioK1atXR/Xq1VG1alWkpaVh0aJF9oiRbKC2mj5fsNeY4XmLHiHRvEeIFSEiIpIfm3uEIiIicPjwYWzfvh1nz54FANStWxddunQp8+DIdqrihsYURQyN6QsWVFQrWBEiIiL5eaB1hARBQNeuXdG1a9eyjocekmloTG+115jV9Hnjc8amarWKFSEiIpKfB0qEoqOjER0djaSkpEIN0itXriyTwOjBmIbG8qfP663WERKse4Ty8ofGWBEiIiIZsjkReuedd/Duu++iefPmqFixIgSBlYTypPD0ecNx49CYIAhQCIbjoigiL/8EDZuliYhIhmxOhJYtW4bVq1fj2WeftUc89JDUqqL3GjPvhVYqBOh1IpuliYhI9mwuA2i1WrRp08YesVAZMDY9G5ug9Va7zwMwVfHMp89zZWkiIpIjm+9+//vf/7B27Vp7xEJloGDT1aL3GgMKGqb1+oL1hjSsCBERkQzZPDSWnZ2N5cuXY/v27WjUqFGhVabnz59fZsGR7QqvLG04bj5t3vjfevOhMTZLExGRDNmcCB0/fhxNmjQBAJw8edLiOTZOS896ZWm91fR5oGB1aYu9xlRMhIiISH5sToR27NhhjziojBgrQlqd5e7z5jmqsV9Ib7b7vFrBJJaIiOSHZQAXY72govXu84BZj5AI0/R57jVGRERyxLufizEmNHlWW2yYJ0LGipBOz+nzREQkb0yEXIzKNDRmOWtMKKJHyLxZmhUhIiKSI979XIyx16egWdpwXFnU9HlRLNh0lRUhIiKSIadJhFJSUjB8+HD4+vrC398fY8aMQUZGRonnv/TSS6hduzY8PDwQGRmJSZMmITU11YFRO56xsqMXDdUg44KK5gUf86ExrWlozGl+FIiIiMqM09z9hg8fjlOnTmHbtm3YvHkzdu/ejXHjxhV7fkJCAhISEjB37lycPHkSq1evxtatWzFmzBgHRu145r0+uTq9aYsNy6GxoipCTvOjQEREVGYeaPd5Rztz5gy2bt2KgwcPonnz5gCARYsWoVevXpg7dy7Cw8MLvaZBgwb46aefTF9Xr14dH3zwAZ555hnk5eVBpXKKb91m5glNnnlFSCi8oKJOXzC7jNPniYhIjpyiDLB37174+/ubkiAA6NKlCxQKBfbv31/q90lNTYWvr2+JSVBOTg7S0tIsHs7EPBHKzdMXubK0ebO0No97jRERkXw5xd0vMTERISEhFsdUKhUCAwORmJhYqve4desW3nvvvRKH0wBgzpw58PPzMz0iIiIeOG4pKBWCafHEXL2+YK+xorbY0IsFFSE2SxMRkQxJmgi9/vrrEAShxMfZs2cf+nPS0tLQu3dv1KtXD2+//XaJ586YMQOpqammR3x8/EN/vqOZ7zdmXEfIfOTL2COk4/R5IiKSOUkbZaZNm4bnnnuuxHOqVauGsLAwJCUlWRzPy8tDSkoKwsLCSnx9eno6evToAR8fH/z888+FNom15ubmBjc3t1LFX16pFQK0MEyhL3qvsYKVpXPZLE1ERDImaSJUoUIFVKhQ4b7ntW7dGnfv3kVMTAyaNWsGAPj777+h1+vRsmXLYl+XlpaG7t27w83NDZs2bYK7u3uZxV6eqVUKQKtDrk68/9AYV5YmIiIZc4oyQN26ddGjRw+MHTsWBw4cwL///ouJEydi6NChphlj169fR506dXDgwAEAhiSoW7duyMzMxFdffYW0tDQkJiYiMTEROp1Oym/H7lQK49BYQbO0oqjd5/Vmu88zESIiIhlymjnka9aswcSJE9G5c2coFAoMHDgQn332men53NxcxMbGIisrCwBw+PBh04yyGjVqWLzX5cuXERUV5bDYHc208apZRajIBRXZI0RERDLnNIlQYGAg1q5dW+zzUVFREPP7YQCgY8eOFl/Lidpsv7GCZunCW2yIZomQsYpEREQkJ7z7uSCVqSKkN9tio6jd5w2LLgKARsWhMSIikh8mQi5Ik18RytOLpi02iuwREgt6hFgRIiIiOeLdzwUZK0LaYpqljdUhkT1CREQkc7z7uSBjUpOnE4seGjMuqGg2fZ6zxoiISI6YCLkgtdn0eV1JK0ubTZ/nXmNERCRHvPu5IOPQWK5Zs3RRCyqKIsyGxlgRIiIi+WEi5IIs9xozHCtqiw2uI0RERHLHu58LUptNnzdtsVHMytJ53GuMiIhkjHc/F2SqCJlPnzf7P23aa0wUkas3LqjIoTEiIpIfJkIuyNj4nJunN62uXdSCinqLvcb4o0BERPLDu58LUucnOnn6gqExZRFbbOTpC/YiY7M0ERHJERMhF1RUs7RQRI9QTp7edIzT54mISI5493NBxunz5olOUUNj5s9rmAgREZEM8e7ngowVoZw8nelYUUNj5s+rODRGREQyxETIBRn7fXJyCyo+gtn/aeNUevPnOWuMiIjkiImQC7pfRahgaEyXf75g0UNEREQkF0yEXJCx8dm84qO02GIDFs+rFPwxICIieeId0AUZp8/n6MyGxorYdDWH+4wREZHMMRFyQWqVsSJUzNCYqUfIODTGHwMiIpIn3gFdkKqI6fHKInafNz7PGWNERCRXTIRckEZl2SMkCJYLKpoSoVzuPE9ERPLGO6ALMjY/G2eFKaxmhAmmlaU5NEZERPLGO6ALsl5ZWmmVCBUsqMhmaSIikjcmQi5IY1pHyJDoWM+OL9QjxOnzREQkU7wDuiBTRSi3uKExq1ljKv4YEBGRPPEO6IKMPT/Z9xkaMz6v5vYaREQkU0yEXJDauiJklegUrCxteJ7T54mISK6YCLkgY8+PNn/laKVVImRMjLQ6Tp8nIiJ54x3QBRkTm1ydCACwHvky9gwZn2ciREREcsU7oAuyng5v3Sxt3TPE6fNERCRXTIRckHWFp7ihMSMVK0JERCRTvAO6IOvmZ+uKkPVQGWeNERGRXDERckEaqwpPcQsqGrFHiIiI5Ip3QBdkPdRl3RNkXSHi0BgREckV74AuSGXdE3SfREjDZmkiIpIpJkIuSKOyHhorekFFI1aEiIhIrngHdEHWFaH7D42xIkRERPLERMgFWW+iWrgiZD00xh8DIiKSJ94BXZDaappYcStLG6msp5URERHJBO+ALsh6qOt+CyqqVRwaIyIieWIi5ILuN2us0BYbrAgREZFM8Q7oggRBsNg/rPDQmOXXbJYmIiK5YiLkosxXi77v0BibpYmISKZ4B3RR5sNj3H2eiIioaEyEXJT5ooqFVpa2+r/OihAREckV74AuynxKfKGhMe41RkREBICJkMsyb4C+/4KKHBojIiJ5YiLkosxXi7bOc6x7hLigIhERyRXvgC7KoiJklfgI3GuMiIgIABMhl2XeAM29xoiIiIrGO6CLUlkMjVknQsWfS0REJCe8A7ootfk6Qlb/l62HxriOEBERyRUTIRdlMTR23wUV+WNARETyxDugizJvgLbuCbL+ms3SREQkV0yEXJSmhB4h6woRK0JERCRXvAO6KPMqj3VPUKEtNriOEBERyRTvgC7KYtaY1f/lQj1CKg6NERGRPDlNIpSSkoLhw4fD19cX/v7+GDNmDDIyMkr1WlEU0bNnTwiCgF9++cW+gZYTFkNj1nuNWfcIsSJEREQy5TR3wOHDh+PUqVPYtm0bNm/ejN27d2PcuHGleu2CBQsKDQ+5OpWihKExTp8nIiICAKikDqA0zpw5g61bt+LgwYNo3rw5AGDRokXo1asX5s6di/Dw8GJfe/ToUcybNw+HDh1CxYoV7/tZOTk5yMnJMX2dlpb28N+ABNSqEhZUZLM0ERERACepCO3duxf+/v6mJAgAunTpAoVCgf379xf7uqysLDz99NNYvHgxwsLCSvVZc+bMgZ+fn+kRERHx0PFLwXxBxcJDY5bncvo8ERHJlVMkQomJiQgJCbE4plKpEBgYiMTExGJfN2XKFLRp0wZ9+/Yt9WfNmDEDqamppkd8fPwDxy0l8yqP9ahgoaEx9ggREZFMSXoHfP311yEIQomPs2fPPtB7b9q0CX///TcWLFhg0+vc3Nzg6+tr8XBGJe81Zlktsm6eJiIikgtJe4SmTZuG5557rsRzqlWrhrCwMCQlJVkcz8vLQ0pKSrFDXn///TcuXrwIf39/i+MDBw5E+/btsXPnzoeIvPxTl7CytHlFiI3SREQkZ5ImQhUqVECFChXue17r1q1x9+5dxMTEoFmzZgAMiY5er0fLli2LfM3rr7+O//3vfxbHGjZsiE8//RR9+vR5+ODLOYu9xkrYYoPDYkREJGdOMWusbt266NGjB8aOHYtly5YhNzcXEydOxNChQ00zxq5fv47OnTvjm2++QYsWLRAWFlZktSgyMhJVq1Z19LfgcOYN0NYjX+Zfs1GaiIjkzGnKAWvWrEGdOnXQuXNn9OrVC+3atcPy5ctNz+fm5iI2NhZZWVkSRll+lLjXmHlFiFPniYhIxpyiIgQAgYGBWLt2bbHPR0VFQRTFEt/jfs+7EvMFFQsNjQlMhIiIiAAnqgiRbcxnjVlPl2ezNBERkQETIRdV8l5jBf+tYkWIiIhkjHdBF2XZLF380JiKawgREZGMMRFyURbT50tYWVqj4o8AERHJF++CLqrEBRUVrAgREREBTIRclrqEZmmgIDnirDEiIpIz3gVdlKqEZmmgoE+IiRAREckZ74IuSq0ofmVpoGBHeq4sTUREcsZEyEWpVcXvNQZwaIyIiAhgIuSyzJugrbfYMD/GBRWJiEjOmAi5qPs1SxsPsSJERERyxrugi7JIhEoYGlMp+CNARETyxbugi1JZrCNU+PmCHiEOjRERkXwxEXJRmvsMjSk4fZ6IiIiJkKsqaa8x82OcPk9ERHLGRMhFqe+3oGL+MQ0rQkREJGO8C7ooteI+Q2P5T7MiREREcsZEyEVZDo0Vfp49QkREREyEXNZ9h8aYCBERETERclXm0+KLWkdIYVpHiENjREQkX0yEXJQgCKYkp+hZY4Y/WREiIiI5413QhRn7hIraa0zBvcaIiIiYCLkyY7WnqF00uPs8EREREyGXZkxyitx93tgjxESIiIhkjHdBF2bqESqiIVrg0BgRERETIVdmGhorqiKUf4i7zxMRkZzxLujCnmwSjroVfVG3ok+h53o3Cke1Cl5oHhUgQWRERETlgyCKoih1EOVZWloa/Pz8kJqaCl9fX6nDISIiolIo7f2bFSEiIiKSLSZCREREJFtMhIiIiEi2mAgRERGRbDERIiIiItliIkRERESyxUSIiIiIZIuJEBEREckWEyEiIiKSLSZCREREJFtMhIiIiEi2mAgRERGRbDERIiIiItliIkRERESypZI6gPJOFEUAQFpamsSREBERUWkZ79vG+3hxmAjdR3p6OgAgIiJC4kiIiIjIVunp6fDz8yv2eUG8X6okc3q9HgkJCfDx8YEgCGX2vmlpaYiIiEB8fDx8fX3L7H1dAa9N8XhtisdrUzxem+Lx2hTP2a+NKIpIT09HeHg4FIriO4FYEboPhUKBypUr2+39fX19nfIHzBF4bYrHa1M8Xpvi8doUj9emeM58bUqqBBmxWZqIiIhki4kQERERyRYTIYm4ublh1qxZcHNzkzqUcofXpni8NsXjtSker03xeG2KJ5drw2ZpIiIiki1WhIiIiEi2mAgRERGRbDERIiIiItliIkRERESyxURIIosXL0ZUVBTc3d3RsmVLHDhwQOqQHG7OnDl49NFH4ePjg5CQEPTr1w+xsbEW52RnZ2PChAkICgqCt7c3Bg4ciJs3b0oUsTQ+/PBDCIKAl19+2XRM7tfl+vXreOaZZxAUFAQPDw80bNgQhw4dMj0viiLeeustVKxYER4eHujSpQvOnz8vYcSOodPpMHPmTFStWhUeHh6oXr063nvvPYu9luRybXbv3o0+ffogPDwcgiDgl19+sXi+NNchJSUFw4cPh6+vL/z9/TFmzBhkZGQ48Luwj5KuTW5uLl577TU0bNgQXl5eCA8Px4gRI5CQkGDxHq50bZgISWD9+vWYOnUqZs2ahcOHD6Nx48bo3r07kpKSpA7NoXbt2oUJEyZg37592LZtG3Jzc9GtWzdkZmaazpkyZQp+++03bNiwAbt27UJCQgIGDBggYdSOdfDgQXzxxRdo1KiRxXE5X5c7d+6gbdu2UKvV+OOPP3D69GnMmzcPAQEBpnM+/vhjfPbZZ1i2bBn2798PLy8vdO/eHdnZ2RJGbn8fffQRli5dis8//xxnzpzBRx99hI8//hiLFi0ynSOXa5OZmYnGjRtj8eLFRT5fmuswfPhwnDp1Ctu2bcPmzZuxe/dujBs3zlHfgt2UdG2ysrJw+PBhzJw5E4cPH8bGjRsRGxuLJ5980uI8l7o2IjlcixYtxAkTJpi+1ul0Ynh4uDhnzhwJo5JeUlKSCEDctWuXKIqiePfuXVGtVosbNmwwnXPmzBkRgLh3716pwnSY9PR0sWbNmuK2bdvExx57TJw8ebIoirwur732mtiuXbtin9fr9WJYWJj4ySefmI7dvXtXdHNzE7///ntHhCiZ3r17i6NHj7Y4NmDAAHH48OGiKMr32gAQf/75Z9PXpbkOp0+fFgGIBw8eNJ3zxx9/iIIgiNevX3dY7PZmfW2KcuDAARGAePXqVVEUXe/asCLkYFqtFjExMejSpYvpmEKhQJcuXbB3714JI5NeamoqACAwMBAAEBMTg9zcXItrVadOHURGRsriWk2YMAG9e/e2+P4BXpdNmzahefPmGDx4MEJCQtC0aVOsWLHC9Pzly5eRmJhocX38/PzQsmVLl78+bdq0QXR0NM6dOwcAOHbsGPbs2YOePXsCkPe1MVea67B37174+/ujefPmpnO6dOkChUKB/fv3OzxmKaWmpkIQBPj7+wNwvWvDTVcd7NatW9DpdAgNDbU4HhoairNnz0oUlfT0ej1efvlltG3bFg0aNAAAJCYmQqPRmP7yGYWGhiIxMVGCKB1n3bp1OHz4MA4ePFjoOTlfFwC4dOkSli5diqlTp+KNN97AwYMHMWnSJGg0GowcOdJ0DYr6O+bq1+f1119HWloa6tSpA6VSCZ1Ohw8++ADDhw8HAFlfG3OluQ6JiYkICQmxeF6lUiEwMFBW1yo7OxuvvfYahg0bZtp41dWuDRMhKhcmTJiAkydPYs+ePVKHIrn4+HhMnjwZ27Ztg7u7u9ThlDt6vR7NmzfH7NmzAQBNmzbFyZMnsWzZMowcOVLi6KT1ww8/YM2aNVi7di3q16+Po0eP4uWXX0Z4eLjsrw3ZLjc3F0899RREUcTSpUulDsduODTmYMHBwVAqlYVm+Ny8eRNhYWESRSWtiRMnYvPmzdixYwcqV65sOh4WFgatVou7d+9anO/q1yomJgZJSUl45JFHoFKpoFKpsGvXLnz22WdQqVQIDQ2V5XUxqlixIurVq2dxrG7duoiLiwMA0zWQ49+xV155Ba+//jqGDh2Khg0b4tlnn8WUKVMwZ84cAPK+NuZKcx3CwsIKTWDJy8tDSkqKLK6VMQm6evUqtm3bZqoGAa53bZgIOZhGo0GzZs0QHR1tOqbX6xEdHY3WrVtLGJnjiaKIiRMn4ueff8bff/+NqlWrWjzfrFkzqNVqi2sVGxuLuLg4l75WnTt3xokTJ3D06FHTo3nz5hg+fLjpv+V4XYzatm1baJmFc+fOoUqVKgCAqlWrIiwszOL6pKWlYf/+/S5/fbKysqBQWP6zrlQqodfrAcj72pgrzXVo3bo17t69i5iYGNM5f//9N/R6PVq2bOnwmB3JmASdP38e27dvR1BQkMXzLndtpO7WlqN169aJbm5u4urVq8XTp0+L48aNE/39/cXExESpQ3OoF198UfTz8xN37twp3rhxw/TIysoynfPCCy+IkZGR4t9//y0eOnRIbN26tdi6dWsJo5aG+awxUZT3dTlw4ICoUqnEDz74QDx//ry4Zs0a0dPTU/zuu+9M53z44Yeiv7+/+Ouvv4rHjx8X+/btK1atWlW8d++ehJHb38iRI8VKlSqJmzdvFi9fvixu3LhRDA4OFl999VXTOXK5Nunp6eKRI0fEI0eOiADE+fPni0eOHDHNfCrNdejRo4fYtGlTcf/+/eKePXvEmjVrisOGDZPqWyozJV0brVYrPvnkk2LlypXFo0ePWvzbnJOTY3oPV7o2TIQksmjRIjEyMlLUaDRiixYtxH379kkdksMBKPKxatUq0zn37t0Tx48fLwYEBIienp5i//79xRs3bkgXtESsEyG5X5fffvtNbNCggejm5ibWqVNHXL58ucXzer1enDlzphgaGiq6ubmJnTt3FmNjYyWK1nHS0tLEyZMni5GRkaK7u7tYrVo18c0337S4gcnl2uzYsaPIf19GjhwpimLprsPt27fFYcOGid7e3qKvr684atQoMT09XYLvpmyVdG0uX75c7L/NO3bsML2HK10bQRTNlhwlIiIikhH2CBEREZFsMREiIiIi2WIiRERERLLFRIiIiIhki4kQERERyRYTISIiIpItJkJEREQkW0yEiIiISLaYCBGRy9m5cycEQSi0MS0RkTWuLE1ETq9jx45o0qQJFixYAADQarVISUlBaGgoBEGQNjgiKtdUUgdARFTWNBoNwsLCpA6DiJwAh8aIyKk999xz2LVrFxYuXAhBECAIAlavXm0xNLZ69Wr4+/tj8+bNqF27Njw9PTFo0CBkZWXh66+/RlRUFAICAjBp0iTodDrTe+fk5GD69OmoVKkSvLy80LJlS+zcuVOab5SI7IIVISJyagsXLsS5c+fQoEEDvPvuuwCAU6dOFTovKysLn332GdatW4f09HQMGDAA/fv3h7+/P7Zs2YJLly5h4MCBaNu2LYYMGQIAmDhxIk6fPo1169YhPDwcP//8M3r06IETJ06gZs2aDv0+icg+mAgRkVPz8/ODRqOBp6enaTjs7Nmzhc7Lzc3F0qVLUb16dQDAoEGD8O233+LmzZvw9vZGvXr10KlTJ+zYsQNDhgxBXFwcVq1ahbi4OISHhwMApk+fjq1bt2LVqlWYPXu2475JIrIbJkJEJAuenp6mJAgAQkNDERUVBW9vb4tjSUlJAIATJ05Ap9OhVq1aFu+Tk5ODoKAgxwRNRHbHRIiIZEGtVlt8LQhCkcf0ej0AICMjA0qlEjExMVAqlRbnmSdPROTcmAgRkdPTaDQWTc5loWnTptDpdEhKSkL79u3L9L2JqPzgrDEicnpRUVHYv38/rly5glu3bpmqOg+jVq1aGD58OEaMGIGNGzfi8uXLOHDgAObMmYPff/+9DKImovKAiRAROb3p06dDqVSiXr16qFChAuLi4srkfVetWoURI0Zg2rRpqF27Nvr164eDBw8iMjKyTN6fiKTHlaWJiIhItlgRIiIiItliIkRERESyxUSIiIiIZIuJEBEREckWEyEiIiKSLSZCREREJFtMhIiIiEi2mAgRERGRbDERIiIiItliIkRERESyxUSIiIiIZOv/Ac9nejakzgIIAAAAAElFTkSuQmCC", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "def method_1(signal):\n", " \"\"\" \n", " Basic method for instantaneous frequency estimation \n", " using analytic signal.\n", " \"\"\"\n", " # 1. Analytic signal using Hilbert transform\n", " analytic_signal = sg.hilbert(signal)\n", " # 2. Get the derivative of the phase\n", " phase = np.unwrap(np.angle(analytic_signal))\n", " instf = np.diff(phase,append=phase[-1])/2/pi\n", " \n", " return [instf,] # List of estimated IFs, even if its only one.\n", "\n", "# Check results using one of the signals defined before.\n", "instf = method_1(signal_2)\n", "plt.plot(instf[0], label='Estimated IF')\n", "plt.plot(signal_2.instf[0],'r--', label='Original IF') # signal_2 is a Signal object with info about its IFs.\n", "plt.xlabel('time'); plt.ylabel('norm. frequency')\n", "plt.legend()\n" ] }, { "cell_type": "markdown", "id": "b496eb4d", "metadata": {}, "source": [ "Notice that the estimation is only valid **where the original IF is different from zero** (this is taken into account in the benchmarking process)." ] }, { "cell_type": "markdown", "id": "6ec29129", "metadata": {}, "source": [ "The second method is based on the spectrogram. As shown before, the instantenous frequency of a signal component defines a trajectory in the time-frequency plane that one can track. We call this trajectory *ridge*. The method then tracks the ridge in the spectrogram and normalizes it to obtain an estimation of the instantaneous frequency." ] }, { "cell_type": "code", "execution_count": 4, "id": "9454e099", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "\n", "def get_ridge(stft):\n", " \"\"\" \n", " Get a ridge from the stft of a signal\n", " \"\"\"\n", " spectrogram = np.abs(stft)**2 \n", " ridge = np.zeros((spectrogram.shape[1]))\n", " for i in range(spectrogram.shape[1]):\n", " ridge[i] = np.argmax(spectrogram[:,i])\n", " \n", " return ridge\n", "\n", "def method_2(signal):\n", " # 1. Compute STFT\n", " stft = get_stft(signal)\n", " # 2. Get ridge from spectrogram\n", " ridge = get_ridge(stft)\n", " return [ridge/N/2,] # List of estimated IFs, even if its only one.\n", "\n", "# Check results using one of the signals defined before.\n", "instf = method_2(signal_2)\n", "plt.plot(instf[0], label='Estimated IF')\n", "plt.plot(signal_2.instf[0],'r--', label='Original IF') # signal_2 is a Signal object with info about its IFs.\n", "plt.xlabel('time'); plt.ylabel('norm. frequency')\n", "plt.legend()\n", "\n" ] }, { "cell_type": "markdown", "id": "b9b014c0", "metadata": {}, "source": [ "Finally, we create a dictionary of methods to compare." ] }, { "cell_type": "code", "execution_count": 5, "id": "c1341a56", "metadata": {}, "outputs": [], "source": [ "methods = {'method_1':method_1,'method_2':method_2}" ] }, { "cell_type": "markdown", "id": "ccd49e72", "metadata": {}, "source": [ "## Instantiating a benchmark object" ] }, { "cell_type": "code", "execution_count": 6, "id": "ceb270d5", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Running benchmark...\n", "- Signal linear_chirp\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "100%|██████████| 3/3 [00:00<00:00, 36.77it/s]\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "- Signal cos_chirp\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "100%|██████████| 3/3 [00:00<00:00, 62.48it/s]\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "- Signal exp_chirp\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "100%|██████████| 3/3 [00:00<00:00, 62.03it/s]" ] }, { "name": "stdout", "output_type": "stream", "text": [ "The test has finished.\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "\n" ] }, { "data": { "text/plain": [ "{'perf_metric': {'linear_chirp': {0: {'method_1': {'((), {})': {'Comp.0': [np.float64(0.023348895819600257),\n", " np.float64(0.03979174079021587),\n", " np.float64(0.06607565605728193),\n", " np.float64(0.04338934228611128),\n", " np.float64(0.044232638890761955),\n", " np.float64(0.041296690561244485),\n", " np.float64(0.0604138964214883),\n", " np.float64(0.03904943041841814),\n", " np.float64(0.045831869768106874),\n", " np.float64(0.035102932761945815),\n", " np.float64(0.03719034671939433),\n", " np.float64(0.03767039093357804),\n", " np.float64(0.034813859660183216),\n", " np.float64(0.06353464350871478),\n", " np.float64(0.03208352311544564),\n", " np.float64(0.06018851665366399),\n", " np.float64(0.0354311415464003),\n", " np.float64(0.034265947390530495),\n", " np.float64(0.03972605695536964),\n", " np.float64(0.028790211978313822),\n", " np.float64(0.03960982624070145),\n", " np.float64(0.026457775711775607),\n", " np.float64(0.04282145109379904),\n", " np.float64(0.04023072928762455),\n", " np.float64(0.04117138176698881),\n", " np.float64(0.03827147135419383),\n", " np.float64(0.04233926157083375),\n", " np.float64(0.06019985816335912),\n", " np.float64(0.037546421668704255),\n", " np.float64(0.03733748953870723)]}},\n", " 'method_2': {'((), {})': {'Comp.0': [np.float64(0.0003996497594576028),\n", " np.float64(0.0005240534879169077),\n", " np.float64(0.01050292921816594),\n", " np.float64(0.002819988342263428),\n", " np.float64(0.0002914080708423259),\n", " np.float64(0.0008335739771298727),\n", " np.float64(0.0038863830110109246),\n", " np.float64(0.004043109298168276),\n", " np.float64(0.012912149255358059),\n", " np.float64(0.00031682403119020325),\n", " np.float64(0.0004971461968644312),\n", " np.float64(0.002652664883139295),\n", " np.float64(0.002009163995228785),\n", " np.float64(0.001811552084260413),\n", " np.float64(0.0015354403578967714),\n", " np.float64(0.010096365546569062),\n", " np.float64(0.00020614864991711908),\n", " np.float64(0.0005948440568054132),\n", " np.float64(0.005180716827816281),\n", " np.float64(0.002429183539515842),\n", " np.float64(0.0009681918053577784),\n", " np.float64(0.0019484145678163379),\n", " np.float64(0.005358849962939993),\n", " np.float64(0.013452078002625488),\n", " np.float64(0.011429236904536757),\n", " np.float64(0.003740940622809774),\n", " np.float64(0.0011349895451492416),\n", " np.float64(0.008870681505213432),\n", " np.float64(0.008524747320102517),\n", " np.float64(0.0020501094808609045)]}}},\n", " 10: {'method_1': {'((), {})': {'Comp.0': [np.float64(0.01617519625514762),\n", " np.float64(0.017530834336494824),\n", " np.float64(0.013873121025497445),\n", " np.float64(0.019671437535354348),\n", " np.float64(0.012001401230689362),\n", " np.float64(0.009508156045883027),\n", " np.float64(0.01609817665309385),\n", " np.float64(0.013081665889286226),\n", " np.float64(0.01236801595883471),\n", " np.float64(0.007948016843391874),\n", " np.float64(0.018077550527715407),\n", " np.float64(0.013707447464055002),\n", " np.float64(0.011422855482888822),\n", " np.float64(0.02056209041483316),\n", " np.float64(0.005622824775479343),\n", " np.float64(0.012259649742845054),\n", " np.float64(0.01162661033358967),\n", " np.float64(0.01614455991623769),\n", " np.float64(0.012580381274601536),\n", " np.float64(0.014606251623267758),\n", " np.float64(0.009299146075949434),\n", " np.float64(0.005205874573343609),\n", " np.float64(0.010588544675526838),\n", " np.float64(0.00664170228651748),\n", " np.float64(0.02343738337235709),\n", " np.float64(0.005877446522622843),\n", " np.float64(0.009575406375487299),\n", " np.float64(0.03174232375837536),\n", " np.float64(0.022777763106452385),\n", " np.float64(0.020607387849783505)]}},\n", " 'method_2': {'((), {})': {'Comp.0': [np.float64(0.00012677350477121522),\n", " np.float64(0.0003974560572949114),\n", " np.float64(0.00021196654534670918),\n", " np.float64(0.0001956752213518489),\n", " np.float64(0.0002028596176630918),\n", " np.float64(0.00029668590617629707),\n", " np.float64(8.656895855815008e-05),\n", " np.float64(0.0005331865983571222),\n", " np.float64(8.796533602928083e-05),\n", " np.float64(8.50074450288136e-05),\n", " np.float64(0.00018874483037224096),\n", " np.float64(0.00025380376569314033),\n", " np.float64(0.0003367505213084616),\n", " np.float64(0.000134952085338143),\n", " np.float64(3.406177600875531e-05),\n", " np.float64(0.0003333458938136903),\n", " np.float64(0.0001280441832822512),\n", " np.float64(0.00024524906602522013),\n", " np.float64(0.0001527824339386236),\n", " np.float64(2.3433315104630195e-05),\n", " np.float64(0.0001413694681158775),\n", " np.float64(0.000242235332962965),\n", " np.float64(0.00014040516044967066),\n", " np.float64(0.0018349607723639417),\n", " np.float64(0.003638078132648407),\n", " np.float64(0.0001671293894902545),\n", " np.float64(0.0001289248364979196),\n", " np.float64(6.809653488925102e-05),\n", " np.float64(5.7485782654525596e-05),\n", " np.float64(0.00031912431129572363)]}}},\n", " 20: {'method_1': {'((), {})': {'Comp.0': [np.float64(0.0007583467392263925),\n", " np.float64(0.008539210245406662),\n", " np.float64(0.003853251284062416),\n", " np.float64(0.016767838765666027),\n", " np.float64(0.01103340800766388),\n", " np.float64(0.00997406875343795),\n", " np.float64(0.007396205414425641),\n", " np.float64(0.004675745819189061),\n", " np.float64(0.002929906142928576),\n", " np.float64(0.008328833604573191),\n", " np.float64(0.008059881207440492),\n", " np.float64(0.014572425348335362),\n", " np.float64(0.004540034263268336),\n", " np.float64(0.014488323810604081),\n", " np.float64(0.005842978677045248),\n", " np.float64(0.01281157148597327),\n", " np.float64(0.007115251966110727),\n", " np.float64(0.01797448079284178),\n", " np.float64(0.013615979554316683),\n", " np.float64(0.01697277938512097),\n", " np.float64(0.0076720492597477236),\n", " np.float64(0.006638932856630152),\n", " np.float64(0.0015395019255031455),\n", " np.float64(0.004472388923176506),\n", " np.float64(0.014634659790176623),\n", " np.float64(0.005188398070397494),\n", " np.float64(0.0068126221581318105),\n", " np.float64(0.004796785866765564),\n", " np.float64(0.01276256790552642),\n", " np.float64(0.009712328632312379)]}},\n", " 'method_2': {'((), {})': {'Comp.0': [np.float64(0.00012131097779319815),\n", " np.float64(0.00013432956585556464),\n", " np.float64(0.00010114699594912552),\n", " np.float64(0.00016733928611160548),\n", " np.float64(0.00017515054759116894),\n", " np.float64(0.00010956871763333254),\n", " np.float64(9.985545814652675e-05),\n", " np.float64(7.297782639924124e-05),\n", " np.float64(9.669842609692055e-05),\n", " np.float64(8.808049670145065e-05),\n", " np.float64(0.00010835181698335703),\n", " np.float64(0.00019506975868580895),\n", " np.float64(0.0001072229164696622),\n", " np.float64(0.00012804201043938008),\n", " np.float64(6.91223340087108e-05),\n", " np.float64(0.00014823891085295027),\n", " np.float64(0.00012408417714961946),\n", " np.float64(0.00010334265367040089),\n", " np.float64(0.00013212163157206742),\n", " np.float64(6.886648176063543e-05),\n", " np.float64(0.00011633299477544275),\n", " np.float64(8.661100306770646e-05),\n", " np.float64(0.00013094025690303483),\n", " np.float64(0.00010455108023317901),\n", " np.float64(8.777923203736868e-05),\n", " np.float64(0.00010366054058244699),\n", " np.float64(0.00012972683280165312),\n", " np.float64(8.4837854642722e-05),\n", " np.float64(7.497716776711014e-05),\n", " np.float64(0.0001565015804389907)]}}}},\n", " 'cos_chirp': {0: {'method_1': {'((), {})': {'Comp.0': [np.float64(0.06713546025141125),\n", " np.float64(0.04391631450357857),\n", " np.float64(0.03468876374857226),\n", " np.float64(0.02433134444194757),\n", " np.float64(0.034244513353550624),\n", " np.float64(0.04031359791008781),\n", " np.float64(0.046448377767963886),\n", " np.float64(0.033546628922290156),\n", " np.float64(0.017839217778833898),\n", " np.float64(0.03322345482386293),\n", " np.float64(0.030950494076459712),\n", " np.float64(0.026774830307156487),\n", " np.float64(0.04732403700826885),\n", " np.float64(0.03523861570385439),\n", " np.float64(0.04216864969537882),\n", " np.float64(0.04808738147409213),\n", " np.float64(0.03032269985669673),\n", " np.float64(0.02523792839389752),\n", " np.float64(0.0379764573992955),\n", " np.float64(0.0499511857548519),\n", " np.float64(0.054431017056141236),\n", " np.float64(0.03343218219147768),\n", " np.float64(0.0290646410258736),\n", " np.float64(0.03863880899226712),\n", " np.float64(0.04401783360777714),\n", " np.float64(0.041990573564394465),\n", " np.float64(0.04080622963375523),\n", " np.float64(0.054170577176719546),\n", " np.float64(0.03400557010080024),\n", " np.float64(0.03176509547646489)]}},\n", " 'method_2': {'((), {})': {'Comp.0': [np.float64(0.005027867769568383),\n", " np.float64(0.0014465473380559522),\n", " np.float64(0.0017514262584388011),\n", " np.float64(0.0003996044632311151),\n", " np.float64(0.00403383373603025),\n", " np.float64(0.0014851167487774863),\n", " np.float64(0.010804697255576926),\n", " np.float64(0.004098727215223186),\n", " np.float64(0.005495062016932799),\n", " np.float64(0.009773000902668577),\n", " np.float64(0.0015958385730739716),\n", " np.float64(0.00459520788145804),\n", " np.float64(0.0007080895951123113),\n", " np.float64(0.006936207396440871),\n", " np.float64(0.00774004354882346),\n", " np.float64(0.006061297751224683),\n", " np.float64(0.0006512582901323843),\n", " np.float64(0.00828641703497028),\n", " np.float64(0.007883162304012887),\n", " np.float64(0.0003511904270658229),\n", " np.float64(0.0053566352531849055),\n", " np.float64(0.0010438976017032055),\n", " np.float64(0.00588102806171002),\n", " np.float64(0.009153934536782891),\n", " np.float64(0.00622136087457728),\n", " np.float64(0.0023427967275629143),\n", " np.float64(0.0030139728732287096),\n", " np.float64(0.000624710535214106),\n", " np.float64(0.0016292612679152285),\n", " np.float64(0.010747295601058837)]}}},\n", " 10: {'method_1': {'((), {})': {'Comp.0': [np.float64(0.0074202415510260114),\n", " np.float64(0.004525215786526622),\n", " np.float64(0.013895536128199541),\n", " np.float64(0.009432547290445162),\n", " np.float64(0.009289503994354048),\n", " np.float64(0.004352433783541701),\n", " np.float64(0.005211343515328344),\n", " np.float64(0.009285178106924658),\n", " np.float64(0.0021537044498941677),\n", " np.float64(0.008768057703845982),\n", " np.float64(0.00765822054424142),\n", " np.float64(0.007669649368192998),\n", " np.float64(0.005181811514512253),\n", " np.float64(0.00820580115319737),\n", " np.float64(0.002862736885358519),\n", " np.float64(0.004435128291591239),\n", " np.float64(0.0031874705506861937),\n", " np.float64(0.006786522396407998),\n", " np.float64(0.005069743664899327),\n", " np.float64(0.004081715516511666),\n", " np.float64(0.006177326707871613),\n", " np.float64(0.0030966206220662566),\n", " np.float64(0.006797983320791352),\n", " np.float64(0.009914970952949412),\n", " np.float64(0.006784652241574983),\n", " np.float64(0.0062638822440971315),\n", " np.float64(0.0047210295793866895),\n", " np.float64(0.007833245923834133),\n", " np.float64(0.007971682879042739),\n", " np.float64(0.009236788744341789)]}},\n", " 'method_2': {'((), {})': {'Comp.0': [np.float64(0.0002780533816757823),\n", " np.float64(7.85804918914274e-05),\n", " np.float64(4.632409561253925e-05),\n", " np.float64(0.00012297888172552055),\n", " np.float64(0.0002487323085125485),\n", " np.float64(0.00011715598939896549),\n", " np.float64(8.06754487385047e-05),\n", " np.float64(0.0007632664381073627),\n", " np.float64(0.0001009173232821352),\n", " np.float64(8.923153313607313e-05),\n", " np.float64(6.997794319971299e-05),\n", " np.float64(0.00015610992308380834),\n", " np.float64(8.516634312207476e-05),\n", " np.float64(8.970259288204324e-05),\n", " np.float64(7.194757482587793e-05),\n", " np.float64(0.0001352020324270963),\n", " np.float64(0.00015369506718292846),\n", " np.float64(8.975699335306731e-05),\n", " np.float64(8.248119846745578e-05),\n", " np.float64(0.000119791036978783),\n", " np.float64(8.909887002266526e-05),\n", " np.float64(9.698598236370811e-05),\n", " np.float64(0.00014051018392516746),\n", " np.float64(0.001274905690751098),\n", " np.float64(9.257238625131505e-05),\n", " np.float64(0.0001464802467516096),\n", " np.float64(8.88420083908612e-05),\n", " np.float64(5.4318759002906455e-05),\n", " np.float64(9.806750705504462e-05),\n", " np.float64(0.00021638391002495966)]}}},\n", " 20: {'method_1': {'((), {})': {'Comp.0': [np.float64(0.0030163400182413418),\n", " np.float64(0.001741428770945631),\n", " np.float64(0.006037251540039526),\n", " np.float64(0.007748066213013297),\n", " np.float64(0.0033339308701335934),\n", " np.float64(0.005293510568639822),\n", " np.float64(0.002109897883029059),\n", " np.float64(0.005907912802761008),\n", " np.float64(0.0004746677258947496),\n", " np.float64(0.007663240820494584),\n", " np.float64(0.00405049069438651),\n", " np.float64(0.0050679022667702335),\n", " np.float64(0.004114146136005769),\n", " np.float64(0.005929610962515874),\n", " np.float64(0.0011763291144998012),\n", " np.float64(0.0019044322413731085),\n", " np.float64(0.002327029837895789),\n", " np.float64(0.006051220191460699),\n", " np.float64(0.0018897754786871227),\n", " np.float64(0.0010777610529745746),\n", " np.float64(0.002530477654547212),\n", " np.float64(0.0017556152858099697),\n", " np.float64(0.001959355418750472),\n", " np.float64(0.005476516546844996),\n", " np.float64(0.005326217513764403),\n", " np.float64(0.0017391729968647778),\n", " np.float64(0.0032902154800630292),\n", " np.float64(0.0011606978875274264),\n", " np.float64(0.013328465045554837),\n", " np.float64(0.005222277490023573)]}},\n", " 'method_2': {'((), {})': {'Comp.0': [np.float64(5.010116368700873e-05),\n", " np.float64(5.70327912532897e-05),\n", " np.float64(4.251960280754958e-05),\n", " np.float64(5.5514287269228476e-05),\n", " np.float64(0.00011160627220126949),\n", " np.float64(7.32431470143492e-05),\n", " np.float64(4.7639073719906206e-05),\n", " np.float64(7.278405381336114e-05),\n", " np.float64(4.864391447996169e-05),\n", " np.float64(4.956723133507284e-05),\n", " np.float64(5.7806937132616796e-05),\n", " np.float64(6.966585690215086e-05),\n", " np.float64(5.217840420614338e-05),\n", " np.float64(5.3838086585830514e-05),\n", " np.float64(5.575796849985641e-05),\n", " np.float64(7.107235002913263e-05),\n", " np.float64(6.991854417549201e-05),\n", " np.float64(5.5547133924886e-05),\n", " np.float64(5.302922328494471e-05),\n", " np.float64(7.579029911387984e-05),\n", " np.float64(5.164709173092462e-05),\n", " np.float64(7.06958209319083e-05),\n", " np.float64(6.1010322067964156e-05),\n", " np.float64(7.277546616197334e-05),\n", " np.float64(4.682646649496672e-05),\n", " np.float64(7.713166275010349e-05),\n", " np.float64(4.50429683489418e-05),\n", " np.float64(4.491735593891848e-05),\n", " np.float64(5.377537580254456e-05),\n", " np.float64(5.909828798783119e-05)]}}}},\n", " 'exp_chirp': {0: {'method_1': {'((), {})': {'Comp.0': [np.float64(0.03677580750530742),\n", " np.float64(0.03551565319391838),\n", " np.float64(0.03676784068470964),\n", " np.float64(0.030701406376701913),\n", " np.float64(0.03253368603212754),\n", " np.float64(0.029916200888793147),\n", " np.float64(0.02722272520624418),\n", " np.float64(0.023953038706149402),\n", " np.float64(0.025349028560320678),\n", " np.float64(0.025867332847503557),\n", " np.float64(0.03138665675665843),\n", " np.float64(0.018992139775609432),\n", " np.float64(0.018581004987902064),\n", " np.float64(0.04145923858543026),\n", " np.float64(0.03714011525906623),\n", " np.float64(0.03296293029955267),\n", " np.float64(0.02380787017873268),\n", " np.float64(0.043695138933205466),\n", " np.float64(0.023399361034023982),\n", " np.float64(0.03649986301621358),\n", " np.float64(0.04029163782767058),\n", " np.float64(0.035940357926863474),\n", " np.float64(0.02765129547867609),\n", " np.float64(0.04137134149337557),\n", " np.float64(0.021544263725525054),\n", " np.float64(0.025346274561539237),\n", " np.float64(0.03266521402848918),\n", " np.float64(0.049532690352138),\n", " np.float64(0.042874202420869506),\n", " np.float64(0.02838847375462569)]}},\n", " 'method_2': {'((), {})': {'Comp.0': [np.float64(0.01842704218939824),\n", " np.float64(0.0029459126484588432),\n", " np.float64(0.005277269339811568),\n", " np.float64(0.005519695231673428),\n", " np.float64(0.0023922549846587845),\n", " np.float64(0.0017162335913330708),\n", " np.float64(0.0011285244727690523),\n", " np.float64(0.002916179018172669),\n", " np.float64(0.0021167839473422907),\n", " np.float64(0.002154133261873915),\n", " np.float64(0.011892918990011736),\n", " np.float64(0.0003313331421848894),\n", " np.float64(0.001596461824617257),\n", " np.float64(0.0017852919381354789),\n", " np.float64(0.004840968909552708),\n", " np.float64(0.00391030258819797),\n", " np.float64(0.018877793931226242),\n", " np.float64(0.005642124488442879),\n", " np.float64(0.00833496874315418),\n", " np.float64(0.007890210777038782),\n", " np.float64(0.0024796331726072915),\n", " np.float64(0.0020669210996269055),\n", " np.float64(0.0005639071070792048),\n", " np.float64(0.007751693240202398),\n", " np.float64(0.007040742720055547),\n", " np.float64(0.0062865814331663),\n", " np.float64(0.0013423481449511155),\n", " np.float64(0.0057983265818411555),\n", " np.float64(0.003087828788231774),\n", " np.float64(0.0012369215734523216)]}}},\n", " 10: {'method_1': {'((), {})': {'Comp.0': [np.float64(0.010738786474278658),\n", " np.float64(0.013802882027159756),\n", " np.float64(0.01687042036494829),\n", " np.float64(0.013262290330917297),\n", " np.float64(0.013519126714961518),\n", " np.float64(0.009262827734237453),\n", " np.float64(0.009399266182708707),\n", " np.float64(0.0058635249994053494),\n", " np.float64(0.00420567976054402),\n", " np.float64(0.00719588375655173),\n", " np.float64(0.012463014447718227),\n", " np.float64(0.007769467950306802),\n", " np.float64(0.004648749837753013),\n", " np.float64(0.02202996233586865),\n", " np.float64(0.0053660396704958285),\n", " np.float64(0.01199584818740554),\n", " np.float64(0.005864695128497068),\n", " np.float64(0.011391848489456456),\n", " np.float64(0.012700539807646828),\n", " np.float64(0.011639859272662444),\n", " np.float64(0.013932483768640189),\n", " np.float64(0.005733722430154064),\n", " np.float64(0.0027172090182651675),\n", " np.float64(0.015637260235499145),\n", " np.float64(0.011344378736426491),\n", " np.float64(0.005567435266007055),\n", " np.float64(0.007413559487125304),\n", " np.float64(0.016284979796288145),\n", " np.float64(0.009238342348092085),\n", " np.float64(0.014442786782072023)]}},\n", " 'method_2': {'((), {})': {'Comp.0': [np.float64(0.00035643612725529784),\n", " np.float64(0.0003079207999692433),\n", " np.float64(0.00037572569733007165),\n", " np.float64(0.0002816251811158664),\n", " np.float64(0.0002704646311960085),\n", " np.float64(0.0001954278777493699),\n", " np.float64(0.00014037353661370297),\n", " np.float64(0.0008247429876478514),\n", " np.float64(0.0003044601009147114),\n", " np.float64(0.00021793572568970288),\n", " np.float64(0.00015435785236527186),\n", " np.float64(0.0002402096356212838),\n", " np.float64(0.0001861572393418597),\n", " np.float64(0.0004933956332376928),\n", " np.float64(0.0001543579157089018),\n", " np.float64(0.0006321418363534974),\n", " np.float64(0.00017979717572875326),\n", " np.float64(0.0001559465510919802),\n", " np.float64(0.00044669600947488784),\n", " np.float64(0.0002142042870854082),\n", " np.float64(0.00042796224850322656),\n", " np.float64(0.0004935509630436006),\n", " np.float64(0.00047796647426810376),\n", " np.float64(0.001672382887461569),\n", " np.float64(0.0010825764190505194),\n", " np.float64(0.0003751312071261922),\n", " np.float64(0.00026307181662476355),\n", " np.float64(0.0002028364554471725),\n", " np.float64(0.00010634285222379932),\n", " np.float64(0.0005331404978170177)]}}},\n", " 20: {'method_1': {'((), {})': {'Comp.0': [np.float64(0.0007237827326920581),\n", " np.float64(0.008789312206833832),\n", " np.float64(0.007141993886385917),\n", " np.float64(0.008079139772341051),\n", " np.float64(0.012119399712150184),\n", " np.float64(0.002336786349071315),\n", " np.float64(0.00821945697139762),\n", " np.float64(0.004246035539334252),\n", " np.float64(0.00392506752232883),\n", " np.float64(0.008223484339565393),\n", " np.float64(0.008170768827501725),\n", " np.float64(0.005511721073265225),\n", " np.float64(0.004354847338329765),\n", " np.float64(0.015237560624833649),\n", " np.float64(0.0047994829211792265),\n", " np.float64(0.013186658534998686),\n", " np.float64(0.0010564258455054265),\n", " np.float64(0.008159341857642355),\n", " np.float64(0.0072265855910970695),\n", " np.float64(0.010049713382782302),\n", " np.float64(0.007201180241581152),\n", " np.float64(0.008497319560221511),\n", " np.float64(0.0016396451212835012),\n", " np.float64(0.00875633829080253),\n", " np.float64(0.006255304949046061),\n", " np.float64(0.004859169136081111),\n", " np.float64(0.006748572972958572),\n", " np.float64(0.006483747247248712),\n", " np.float64(0.006982635532762834),\n", " np.float64(0.013377054572411824)]}},\n", " 'method_2': {'((), {})': {'Comp.0': [np.float64(0.00032493261574456823),\n", " np.float64(0.000289124553879715),\n", " np.float64(0.0003422792030885124),\n", " np.float64(0.0002780611952529101),\n", " np.float64(0.0003080283201682128),\n", " np.float64(0.0002177946718286901),\n", " np.float64(0.0001900891455858367),\n", " np.float64(0.000292202488724123),\n", " np.float64(0.00021171854353544035),\n", " np.float64(0.00038775350097304344),\n", " np.float64(0.00021691946168140376),\n", " np.float64(0.0002717702074134243),\n", " np.float64(0.0003837928287335054),\n", " np.float64(0.0003312647507645092),\n", " np.float64(0.0002080999376327204),\n", " np.float64(0.00028188833321330666),\n", " np.float64(0.00021878966129653622),\n", " np.float64(0.000200256357008888),\n", " np.float64(0.0003866887720471437),\n", " np.float64(0.00023990605672819372),\n", " np.float64(0.000350349308344533),\n", " np.float64(0.0003819011006422336),\n", " np.float64(0.00040115776630415633),\n", " np.float64(0.00022324893292307237),\n", " np.float64(0.00015633897869330227),\n", " np.float64(0.0003506555888282646),\n", " np.float64(0.00027582497032353526),\n", " np.float64(0.00022230792575164628),\n", " np.float64(0.0002049335153061638),\n", " np.float64(0.0004211929407041127)]}}}}}}" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "benchmark = Benchmark(task='inst_frequency',\n", " methods=methods,\n", " # parameters=parameters,\n", " signal_ids=signals,\n", " SNRin=[0,10,20],\n", " repetitions=30,\n", " N = N)\n", "benchmark.run()" ] }, { "cell_type": "markdown", "id": "d395e85a", "metadata": {}, "source": [ "## Displaying results." ] }, { "cell_type": "code", "execution_count": 7, "id": "806505f3", "metadata": {}, "outputs": [], "source": [ "results = benchmark.results # Get dictionary with the results.\n", "df = benchmark.dic2df(results) # Transform dictionary to DataFrame" ] }, { "cell_type": "markdown", "id": "9e03b16b", "metadata": {}, "source": [ "Before displaying the results, we need to format the `DataFrame` in the correct way:" ] }, { "cell_type": "code", "execution_count": 8, "id": "be658cbd", "metadata": {}, "outputs": [ { "data": { "application/vnd.microsoft.datawrangler.viewer.v0+json": { "columns": [ { "name": "index", "rawType": "int64", "type": "integer" }, { "name": "Method", "rawType": "object", "type": "string" }, { "name": "Parameter", "rawType": "object", "type": "string" }, { "name": "Signal_id", "rawType": "object", "type": "string" }, { "name": "Repetition", "rawType": "int64", "type": "integer" }, { "name": "0", "rawType": "float64", "type": "float" }, { "name": "10", "rawType": "float64", "type": "float" }, { "name": "20", "rawType": "float64", "type": "float" } ], "ref": "ecdf0e36-3b5b-4a0b-a18f-0a2aa9789fa4", "rows": [ [ "0", "method_1", "((), {})", "cos_chirp", "0", "0.06713546025141125", "0.0074202415510260114", "0.0030163400182413418" ], [ "1", "method_1", "((), {})", "cos_chirp", "1", "0.04391631450357857", "0.004525215786526622", "0.001741428770945631" ], [ "2", "method_1", "((), {})", "cos_chirp", "2", "0.03468876374857226", "0.013895536128199541", "0.006037251540039526" ], [ "3", "method_1", "((), {})", "cos_chirp", "3", "0.02433134444194757", "0.009432547290445162", "0.007748066213013297" ], [ "4", "method_1", "((), {})", "cos_chirp", "4", "0.034244513353550624", "0.009289503994354048", "0.0033339308701335934" ], [ "5", "method_1", "((), {})", "cos_chirp", "5", "0.04031359791008781", "0.004352433783541701", "0.005293510568639822" ], [ "6", "method_1", "((), {})", "cos_chirp", "6", "0.046448377767963886", "0.005211343515328344", "0.002109897883029059" ], [ "7", "method_1", "((), {})", "cos_chirp", "7", "0.033546628922290156", "0.009285178106924658", "0.005907912802761008" ], [ "8", "method_1", "((), {})", "cos_chirp", "8", "0.017839217778833898", "0.0021537044498941677", "0.0004746677258947496" ], [ "9", "method_1", "((), {})", "cos_chirp", "9", "0.03322345482386293", "0.008768057703845982", "0.007663240820494584" ], [ "10", "method_1", "((), {})", "cos_chirp", "10", "0.030950494076459712", "0.00765822054424142", "0.00405049069438651" ], [ "11", "method_1", "((), {})", "cos_chirp", "11", "0.026774830307156487", "0.007669649368192998", "0.0050679022667702335" ], [ "12", "method_1", "((), {})", "cos_chirp", "12", "0.04732403700826885", "0.005181811514512253", "0.004114146136005769" ], [ "13", "method_1", "((), {})", "cos_chirp", "13", "0.03523861570385439", "0.00820580115319737", "0.005929610962515874" ], [ "14", "method_1", "((), {})", "cos_chirp", "14", "0.04216864969537882", "0.002862736885358519", "0.0011763291144998012" ], [ "15", "method_1", "((), {})", "cos_chirp", "15", "0.04808738147409213", "0.004435128291591239", "0.0019044322413731085" ], [ "16", "method_1", "((), {})", "cos_chirp", "16", "0.03032269985669673", "0.0031874705506861937", "0.002327029837895789" ], [ "17", "method_1", "((), {})", "cos_chirp", "17", "0.02523792839389752", "0.006786522396407998", "0.006051220191460699" ], [ "18", "method_1", "((), {})", "cos_chirp", "18", "0.0379764573992955", "0.005069743664899327", "0.0018897754786871227" ], [ "19", "method_1", "((), {})", "cos_chirp", "19", "0.0499511857548519", "0.004081715516511666", "0.0010777610529745746" ], [ "20", "method_1", "((), {})", "cos_chirp", "20", "0.054431017056141236", "0.006177326707871613", "0.002530477654547212" ], [ "21", "method_1", "((), {})", "cos_chirp", "21", "0.03343218219147768", "0.0030966206220662566", "0.0017556152858099697" ], [ "22", "method_1", "((), {})", "cos_chirp", "22", "0.0290646410258736", "0.006797983320791352", "0.001959355418750472" ], [ "23", "method_1", "((), {})", "cos_chirp", "23", "0.03863880899226712", "0.009914970952949412", "0.005476516546844996" ], [ "24", "method_1", "((), {})", "cos_chirp", "24", "0.04401783360777714", "0.006784652241574983", "0.005326217513764403" ], [ "25", "method_1", "((), {})", "cos_chirp", "25", "0.041990573564394465", "0.0062638822440971315", "0.0017391729968647778" ], [ "26", "method_1", "((), {})", "cos_chirp", "26", "0.04080622963375523", "0.0047210295793866895", "0.0032902154800630292" ], [ "27", "method_1", "((), {})", "cos_chirp", "27", "0.054170577176719546", "0.007833245923834133", "0.0011606978875274264" ], [ "28", "method_1", "((), {})", "cos_chirp", "28", "0.03400557010080024", "0.007971682879042739", "0.013328465045554837" ], [ "29", "method_1", "((), {})", "cos_chirp", "29", "0.03176509547646489", "0.009236788744341789", "0.005222277490023573" ], [ "30", "method_1", "((), {})", "exp_chirp", "0", "0.03677580750530742", "0.010738786474278658", "0.0007237827326920581" ], [ "31", "method_1", "((), {})", "exp_chirp", "1", "0.03551565319391838", "0.013802882027159756", "0.008789312206833832" ], [ "32", "method_1", "((), {})", "exp_chirp", "2", "0.03676784068470964", "0.01687042036494829", "0.007141993886385917" ], [ "33", "method_1", "((), {})", "exp_chirp", "3", "0.030701406376701913", "0.013262290330917297", "0.008079139772341051" ], [ "34", "method_1", "((), {})", "exp_chirp", "4", "0.03253368603212754", "0.013519126714961518", "0.012119399712150184" ], [ "35", "method_1", "((), {})", "exp_chirp", "5", "0.029916200888793147", "0.009262827734237453", "0.002336786349071315" ], [ "36", "method_1", "((), {})", "exp_chirp", "6", "0.02722272520624418", "0.009399266182708707", "0.00821945697139762" ], [ "37", "method_1", "((), {})", "exp_chirp", "7", "0.023953038706149402", "0.0058635249994053494", "0.004246035539334252" ], [ "38", "method_1", "((), {})", "exp_chirp", "8", "0.025349028560320678", "0.00420567976054402", "0.00392506752232883" ], [ "39", "method_1", "((), {})", "exp_chirp", "9", "0.025867332847503557", "0.00719588375655173", "0.008223484339565393" ], [ "40", "method_1", "((), {})", "exp_chirp", "10", "0.03138665675665843", "0.012463014447718227", "0.008170768827501725" ], [ "41", "method_1", "((), {})", "exp_chirp", "11", "0.018992139775609432", "0.007769467950306802", "0.005511721073265225" ], [ "42", "method_1", "((), {})", "exp_chirp", "12", "0.018581004987902064", "0.004648749837753013", "0.004354847338329765" ], [ "43", "method_1", "((), {})", "exp_chirp", "13", "0.04145923858543026", "0.02202996233586865", "0.015237560624833649" ], [ "44", "method_1", "((), {})", "exp_chirp", "14", "0.03714011525906623", "0.0053660396704958285", "0.0047994829211792265" ], [ "45", "method_1", "((), {})", "exp_chirp", "15", "0.03296293029955267", "0.01199584818740554", "0.013186658534998686" ], [ "46", "method_1", "((), {})", "exp_chirp", "16", "0.02380787017873268", "0.005864695128497068", "0.0010564258455054265" ], [ "47", "method_1", "((), {})", "exp_chirp", "17", "0.043695138933205466", "0.011391848489456456", "0.008159341857642355" ], [ "48", "method_1", "((), {})", "exp_chirp", "18", "0.023399361034023982", "0.012700539807646828", "0.0072265855910970695" ], [ "49", "method_1", "((), {})", "exp_chirp", "19", "0.03649986301621358", "0.011639859272662444", "0.010049713382782302" ] ], "shape": { "columns": 7, "rows": 180 } }, "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
SNRMethodParameterSignal_idRepetition01020
0method_1((), {})cos_chirp00.0671350.0074200.003016
1method_1((), {})cos_chirp10.0439160.0045250.001741
2method_1((), {})cos_chirp20.0346890.0138960.006037
3method_1((), {})cos_chirp30.0243310.0094330.007748
4method_1((), {})cos_chirp40.0342450.0092900.003334
........................
175method_2((), {})linear_chirp250.0037410.0001670.000104
176method_2((), {})linear_chirp260.0011350.0001290.000130
177method_2((), {})linear_chirp270.0088710.0000680.000085
178method_2((), {})linear_chirp280.0085250.0000570.000075
179method_2((), {})linear_chirp290.0020500.0003190.000157
\n", "

180 rows × 7 columns

\n", "
" ], "text/plain": [ "SNR Method Parameter Signal_id Repetition 0 10 \\\n", "0 method_1 ((), {}) cos_chirp 0 0.067135 0.007420 \n", "1 method_1 ((), {}) cos_chirp 1 0.043916 0.004525 \n", "2 method_1 ((), {}) cos_chirp 2 0.034689 0.013896 \n", "3 method_1 ((), {}) cos_chirp 3 0.024331 0.009433 \n", "4 method_1 ((), {}) cos_chirp 4 0.034245 0.009290 \n", ".. ... ... ... ... ... ... \n", "175 method_2 ((), {}) linear_chirp 25 0.003741 0.000167 \n", "176 method_2 ((), {}) linear_chirp 26 0.001135 0.000129 \n", "177 method_2 ((), {}) linear_chirp 27 0.008871 0.000068 \n", "178 method_2 ((), {}) linear_chirp 28 0.008525 0.000057 \n", "179 method_2 ((), {}) linear_chirp 29 0.002050 0.000319 \n", "\n", "SNR 20 \n", "0 0.003016 \n", "1 0.001741 \n", "2 0.006037 \n", "3 0.007748 \n", "4 0.003334 \n", ".. ... \n", "175 0.000104 \n", "176 0.000130 \n", "177 0.000085 \n", "178 0.000075 \n", "179 0.000157 \n", "\n", "[180 rows x 7 columns]" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df = df.reset_index()\n", "df = df.iloc[:,[3,4,1,5,2,6]]\n", "col_names = list(df.columns)\n", "col_names[0:6] = ['Method','Parameter', 'Signal_id','Repetition','SNR','QRF']\n", "df.columns = col_names\n", "df = df.pivot_table(index= ['Method','Parameter', 'Signal_id','Repetition'], columns='SNR', values='QRF')\n", "df = df.reset_index()\n", "df" ] }, { "cell_type": "markdown", "id": "d9baf321", "metadata": {}, "source": [ "Finally, we can use the functionality from the `ResultsInterpreter` class to display the result on interactive plots (using `plotly`).\n", "\n", "Here we display the mean squared error (MSE), which is the default performance metric for instantaneous frequency estimation (the lower, the better)." ] }, { "cell_type": "code", "execution_count": 9, "id": "f9eabe9f", "metadata": {}, "outputs": [ { "data": { "text/html": [ " \n", " " ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.plotly.v1+json": { "config": { "linkText": "Export to plot.ly", "plotlyServerURL": "https://plot.ly", "showLink": false }, "data": [ { "alignmentgroup": "True", "error_x": { "array": [ "0", "10", "20" ] }, "error_y": { "array": [ 0.004437329552989387, 0.002492676032044479, 0.0019792518154660398 ], "arrayminus": [ 0.004018249085880186, 0.002330655093884892, 0.001885687455717231 ] }, "hovertemplate": "Method + Param=method_1
SNRin=%{x}
QRF=%{y}", "legendgroup": "method_1", "marker": { "color": "#636efa", "pattern": { "shape": "" } }, "name": "method_1", "offsetgroup": "method_1", "orientation": "v", "showlegend": true, "textposition": "auto", "type": "bar", "x": [ "0", "10", "20" ], "xaxis": "x", "y": [ 0.0416071132877819, 0.014020640730853422, 0.008816025221866818 ], "yaxis": "y" }, { "alignmentgroup": "True", "error_x": { "array": [ "0", "10", "20" ] }, "error_y": { "array": [ 0.0017445447364282975, 0.0003280201939652653, 0.000013224096310666345 ], "arrayminus": [ 0.0015487995838940716, 0.00019706145544924662, 0.000012136939096184842 ] }, "hovertemplate": "Method + Param=method_2
SNRin=%{x}
QRF=%{y}", "legendgroup": "method_2", "marker": { "color": "#EF553B", "pattern": { "shape": "" } }, "name": "method_2", "offsetgroup": "method_2", "orientation": "v", "showlegend": true, "textposition": "auto", "type": "bar", "x": [ "0", "10", "20" ], "xaxis": "x", "y": [ 0.004034051143564306, 0.0003597707594277045, 0.00011422798443734606 ], "yaxis": "y" } ], "layout": { "barmode": "group", "legend": { "title": { "text": "Method + Param" }, "tracegroupgap": 0 }, "template": { "data": { "bar": [ { "error_x": { "color": "#2a3f5f" }, "error_y": { "color": "#2a3f5f" }, "marker": { "line": { "color": "#E5ECF6", "width": 0.5 }, "pattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 } }, "type": "bar" } ], "barpolar": [ { "marker": { "line": { "color": "#E5ECF6", "width": 0.5 }, "pattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 } }, "type": "barpolar" } ], "carpet": [ { "aaxis": { "endlinecolor": "#2a3f5f", "gridcolor": "white", "linecolor": "white", "minorgridcolor": "white", "startlinecolor": "#2a3f5f" }, "baxis": { "endlinecolor": "#2a3f5f", "gridcolor": "white", "linecolor": "white", "minorgridcolor": "white", "startlinecolor": "#2a3f5f" }, "type": "carpet" } ], "choropleth": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "choropleth" } ], "contour": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "contour" } ], "contourcarpet": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "contourcarpet" } ], "heatmap": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "heatmap" } ], "heatmapgl": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "heatmapgl" } ], "histogram": [ { "marker": { "pattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 } }, "type": "histogram" } ], "histogram2d": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "histogram2d" } ], "histogram2dcontour": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "histogram2dcontour" } ], "mesh3d": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "mesh3d" } ], "parcoords": [ { "line": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "parcoords" } ], "pie": [ { "automargin": true, "type": "pie" } ], "scatter": [ { "fillpattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 }, "type": "scatter" } ], "scatter3d": [ { "line": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatter3d" } ], "scattercarpet": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattercarpet" } ], "scattergeo": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattergeo" } ], "scattergl": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattergl" } ], "scattermapbox": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattermapbox" } ], "scatterpolar": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterpolar" } ], "scatterpolargl": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterpolargl" } ], "scatterternary": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterternary" } ], "surface": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "surface" } ], "table": [ { "cells": { "fill": { "color": "#EBF0F8" }, "line": { "color": "white" } }, "header": { "fill": { "color": "#C8D4E3" }, "line": { "color": "white" } }, "type": "table" } ] }, "layout": { "annotationdefaults": { "arrowcolor": "#2a3f5f", "arrowhead": 0, "arrowwidth": 1 }, "autotypenumbers": "strict", "coloraxis": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "colorscale": { "diverging": [ [ 0, "#8e0152" ], [ 0.1, "#c51b7d" ], [ 0.2, "#de77ae" ], [ 0.3, "#f1b6da" ], [ 0.4, "#fde0ef" ], [ 0.5, "#f7f7f7" ], [ 0.6, "#e6f5d0" ], [ 0.7, "#b8e186" ], [ 0.8, "#7fbc41" ], [ 0.9, "#4d9221" ], [ 1, "#276419" ] ], "sequential": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "sequentialminus": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ] }, "colorway": [ "#636efa", "#EF553B", "#00cc96", "#ab63fa", "#FFA15A", "#19d3f3", "#FF6692", "#B6E880", "#FF97FF", "#FECB52" ], "font": { "color": "#2a3f5f" }, "geo": { "bgcolor": "white", "lakecolor": "white", "landcolor": "#E5ECF6", "showlakes": true, "showland": true, "subunitcolor": "white" }, "hoverlabel": { "align": "left" }, "hovermode": "closest", "mapbox": { "style": "light" }, "paper_bgcolor": "white", "plot_bgcolor": "#E5ECF6", "polar": { "angularaxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" }, "bgcolor": "#E5ECF6", "radialaxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" } }, "scene": { "xaxis": { "backgroundcolor": "#E5ECF6", "gridcolor": "white", "gridwidth": 2, "linecolor": "white", "showbackground": true, "ticks": "", "zerolinecolor": "white" }, "yaxis": { "backgroundcolor": "#E5ECF6", "gridcolor": "white", "gridwidth": 2, "linecolor": "white", "showbackground": true, "ticks": "", "zerolinecolor": "white" }, "zaxis": { "backgroundcolor": "#E5ECF6", "gridcolor": "white", "gridwidth": 2, "linecolor": "white", "showbackground": true, "ticks": "", "zerolinecolor": "white" } }, "shapedefaults": { "line": { "color": "#2a3f5f" } }, "ternary": { "aaxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" }, "baxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" }, "bgcolor": "#E5ECF6", "caxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" } }, "title": { "x": 0.05 }, "xaxis": { "automargin": true, "gridcolor": "white", "linecolor": "white", "ticks": "", "title": { "standoff": 15 }, "zerolinecolor": "white", "zerolinewidth": 2 }, "yaxis": { "automargin": true, "gridcolor": "white", "linecolor": "white", "ticks": "", "title": { "standoff": 15 }, "zerolinecolor": "white", "zerolinewidth": 2 } } }, "title": { "text": "linear_chirp" }, "xaxis": { "anchor": "y", "domain": [ 0, 1 ], "title": { "text": "SNRin (dB)" } }, "yaxis": { "anchor": "x", "domain": [ 0, 1 ], "title": { "text": "Mean Squared Error" } } } }, "text/html": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.plotly.v1+json": { "config": { "linkText": "Export to plot.ly", "plotlyServerURL": "https://plot.ly", "showLink": false }, "data": [ { "alignmentgroup": "True", "error_x": { "array": [ "0", "10", "20" ] }, "error_y": { "array": [ 0.004393949439850477, 0.00106725631515457, 0.0011710094323532693 ], "arrayminus": [ 0.004096937557412493, 0.0010048960892915897, 0.0010205339621518518 ] }, "hovertemplate": "Method + Param=method_1
SNRin=%{x}
QRF=%{y}", "legendgroup": "method_1", "marker": { "color": "#636efa", "pattern": { "shape": "" } }, "name": "method_1", "offsetgroup": "method_1", "orientation": "v", "showlegend": true, "textposition": "auto", "type": "bar", "x": [ "0", "10", "20" ], "xaxis": "x", "y": [ 0.038401416066590734, 0.006609024847054711, 0.003956798550317093 ], "yaxis": "y" }, { "alignmentgroup": "True", "error_x": { "array": [ "0", "10", "20" ] }, "error_y": { "array": [ 0.0013557300936775539, 0.00011240093777451033, 0.000006149099755228754 ], "arrayminus": [ 0.0012942020596793005, 0.00007301719230510971, 0.000005253249394809937 ] }, "hovertemplate": "Method + Param=method_2
SNRin=%{x}
QRF=%{y}", "legendgroup": "method_2", "marker": { "color": "#EF553B", "pattern": { "shape": "" } }, "name": "method_2", "offsetgroup": "method_2", "orientation": "v", "showlegend": true, "textposition": "auto", "type": "bar", "x": [ "0", "10", "20" ], "xaxis": "x", "y": [ 0.00450464966132521, 0.00017593040473810144, 0.00006020590532173356 ], "yaxis": "y" } ], "layout": { "barmode": "group", "legend": { "title": { "text": "Method + Param" }, "tracegroupgap": 0 }, "template": { "data": { "bar": [ { "error_x": { "color": "#2a3f5f" }, "error_y": { "color": "#2a3f5f" }, "marker": { "line": { "color": "#E5ECF6", "width": 0.5 }, "pattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 } }, "type": "bar" } ], "barpolar": [ { "marker": { "line": { "color": "#E5ECF6", "width": 0.5 }, "pattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 } }, "type": "barpolar" } ], "carpet": [ { "aaxis": { "endlinecolor": "#2a3f5f", "gridcolor": "white", "linecolor": "white", "minorgridcolor": "white", "startlinecolor": "#2a3f5f" }, "baxis": { "endlinecolor": "#2a3f5f", "gridcolor": "white", "linecolor": "white", "minorgridcolor": "white", "startlinecolor": "#2a3f5f" }, "type": "carpet" } ], "choropleth": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "choropleth" } ], "contour": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "contour" } ], "contourcarpet": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "contourcarpet" } ], "heatmap": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "heatmap" } ], "heatmapgl": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "heatmapgl" } ], "histogram": [ { "marker": { "pattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 } }, "type": "histogram" } ], "histogram2d": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "histogram2d" } ], "histogram2dcontour": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "histogram2dcontour" } ], "mesh3d": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "mesh3d" } ], "parcoords": [ { "line": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "parcoords" } ], "pie": [ { "automargin": true, "type": "pie" } ], "scatter": [ { "fillpattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 }, "type": "scatter" } ], "scatter3d": [ { "line": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatter3d" } ], "scattercarpet": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattercarpet" } ], "scattergeo": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattergeo" } ], "scattergl": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattergl" } ], "scattermapbox": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattermapbox" } ], "scatterpolar": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterpolar" } ], "scatterpolargl": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterpolargl" } ], "scatterternary": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterternary" } ], "surface": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "surface" } ], "table": [ { "cells": { "fill": { "color": "#EBF0F8" }, "line": { "color": "white" } }, "header": { "fill": { "color": "#C8D4E3" }, "line": { "color": "white" } }, "type": "table" } ] }, "layout": { "annotationdefaults": { "arrowcolor": "#2a3f5f", "arrowhead": 0, "arrowwidth": 1 }, "autotypenumbers": "strict", "coloraxis": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "colorscale": { "diverging": [ [ 0, "#8e0152" ], [ 0.1, "#c51b7d" ], [ 0.2, "#de77ae" ], [ 0.3, "#f1b6da" ], [ 0.4, "#fde0ef" ], [ 0.5, "#f7f7f7" ], [ 0.6, "#e6f5d0" ], [ 0.7, "#b8e186" ], [ 0.8, "#7fbc41" ], [ 0.9, "#4d9221" ], [ 1, "#276419" ] ], "sequential": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "sequentialminus": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ] }, "colorway": [ "#636efa", "#EF553B", "#00cc96", "#ab63fa", "#FFA15A", "#19d3f3", "#FF6692", "#B6E880", "#FF97FF", "#FECB52" ], "font": { "color": "#2a3f5f" }, "geo": { "bgcolor": "white", "lakecolor": "white", "landcolor": "#E5ECF6", "showlakes": true, "showland": true, "subunitcolor": "white" }, "hoverlabel": { "align": "left" }, "hovermode": "closest", "mapbox": { "style": "light" }, "paper_bgcolor": "white", "plot_bgcolor": "#E5ECF6", "polar": { "angularaxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" }, "bgcolor": "#E5ECF6", "radialaxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" } }, "scene": { "xaxis": { "backgroundcolor": "#E5ECF6", "gridcolor": "white", "gridwidth": 2, "linecolor": "white", "showbackground": true, "ticks": "", "zerolinecolor": "white" }, "yaxis": { "backgroundcolor": "#E5ECF6", "gridcolor": "white", "gridwidth": 2, "linecolor": "white", "showbackground": true, "ticks": "", "zerolinecolor": "white" }, "zaxis": { "backgroundcolor": "#E5ECF6", "gridcolor": "white", "gridwidth": 2, "linecolor": "white", "showbackground": true, "ticks": "", "zerolinecolor": "white" } }, "shapedefaults": { "line": { "color": "#2a3f5f" } }, "ternary": { "aaxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" }, "baxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" }, "bgcolor": "#E5ECF6", "caxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" } }, "title": { "x": 0.05 }, "xaxis": { "automargin": true, "gridcolor": "white", "linecolor": "white", "ticks": "", "title": { "standoff": 15 }, "zerolinecolor": "white", "zerolinewidth": 2 }, "yaxis": { "automargin": true, "gridcolor": "white", "linecolor": "white", "ticks": "", "title": { "standoff": 15 }, "zerolinecolor": "white", "zerolinewidth": 2 } } }, "title": { "text": "cos_chirp" }, "xaxis": { "anchor": "y", "domain": [ 0, 1 ], "title": { "text": "SNRin (dB)" } }, "yaxis": { "anchor": "x", "domain": [ 0, 1 ], "title": { "text": "Mean Squared Error" } } } }, "text/html": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.plotly.v1+json": { "config": { "linkText": "Export to plot.ly", "plotlyServerURL": "https://plot.ly", "showLink": false }, "data": [ { "alignmentgroup": "True", "error_x": { "array": [ "0", "10", "20" ] }, "error_y": { "array": [ 0.0032504194505092454, 0.0017746848136847519, 0.0014214402859409475 ], "arrayminus": [ 0.003087938104026404, 0.001753328579571294, 0.001398848240084019 ] }, "hovertemplate": "Method + Param=method_1
SNRin=%{x}
QRF=%{y}", "legendgroup": "method_1", "marker": { "color": "#636efa", "pattern": { "shape": "" } }, "name": "method_1", "offsetgroup": "method_1", "orientation": "v", "showlegend": true, "textposition": "auto", "type": "bar", "x": [ "0", "10", "20" ], "xaxis": "x", "y": [ 0.031937759679931434, 0.010410095711403108, 0.0070786177551211225 ], "yaxis": "y" }, { "alignmentgroup": "True", "error_x": { "array": [ "0", "10", "20" ] }, "error_y": { "array": [ 0.0019913418127638317, 0.0001496163860337554, 0.00003038485350755375 ], "arrayminus": [ 0.0016676743342142332, 0.00011120947288679648, 0.000029758971082462552 ] }, "hovertemplate": "Method + Param=method_2
SNRin=%{x}
QRF=%{y}", "legendgroup": "method_2", "marker": { "color": "#EF553B", "pattern": { "shape": "" } }, "name": "method_2", "offsetgroup": "method_2", "orientation": "v", "showlegend": true, "textposition": "auto", "type": "bar", "x": [ "0", "10", "20" ], "xaxis": "x", "y": [ 0.004911710262642267, 0.00039224462076857764, 0.0002856423877707235 ], "yaxis": "y" } ], "layout": { "barmode": "group", "legend": { "title": { "text": "Method + Param" }, "tracegroupgap": 0 }, "template": { "data": { "bar": [ { "error_x": { "color": "#2a3f5f" }, "error_y": { "color": "#2a3f5f" }, "marker": { "line": { "color": "#E5ECF6", "width": 0.5 }, "pattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 } }, "type": "bar" } ], "barpolar": [ { "marker": { "line": { "color": "#E5ECF6", "width": 0.5 }, "pattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 } }, "type": "barpolar" } ], "carpet": [ { "aaxis": { "endlinecolor": "#2a3f5f", "gridcolor": "white", "linecolor": "white", "minorgridcolor": "white", "startlinecolor": "#2a3f5f" }, "baxis": { "endlinecolor": "#2a3f5f", "gridcolor": "white", "linecolor": "white", "minorgridcolor": "white", "startlinecolor": "#2a3f5f" }, "type": "carpet" } ], "choropleth": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "choropleth" } ], "contour": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "contour" } ], "contourcarpet": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "contourcarpet" } ], "heatmap": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "heatmap" } ], "heatmapgl": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "heatmapgl" } ], "histogram": [ { "marker": { "pattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 } }, "type": "histogram" } ], "histogram2d": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "histogram2d" } ], "histogram2dcontour": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "histogram2dcontour" } ], "mesh3d": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "mesh3d" } ], "parcoords": [ { "line": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "parcoords" } ], "pie": [ { "automargin": true, "type": "pie" } ], "scatter": [ { "fillpattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 }, "type": "scatter" } ], "scatter3d": [ { "line": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatter3d" } ], "scattercarpet": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattercarpet" } ], "scattergeo": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattergeo" } ], "scattergl": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattergl" } ], "scattermapbox": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattermapbox" } ], "scatterpolar": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterpolar" } ], "scatterpolargl": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterpolargl" } ], "scatterternary": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterternary" } ], "surface": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "surface" } ], "table": [ { "cells": { "fill": { "color": "#EBF0F8" }, "line": { "color": "white" } }, "header": { "fill": { "color": "#C8D4E3" }, "line": { "color": "white" } }, "type": "table" } ] }, "layout": { "annotationdefaults": { "arrowcolor": "#2a3f5f", "arrowhead": 0, "arrowwidth": 1 }, "autotypenumbers": "strict", "coloraxis": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "colorscale": { "diverging": [ [ 0, "#8e0152" ], [ 0.1, "#c51b7d" ], [ 0.2, "#de77ae" ], [ 0.3, "#f1b6da" ], [ 0.4, "#fde0ef" ], [ 0.5, "#f7f7f7" ], [ 0.6, "#e6f5d0" ], [ 0.7, "#b8e186" ], [ 0.8, "#7fbc41" ], [ 0.9, "#4d9221" ], [ 1, "#276419" ] ], "sequential": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "sequentialminus": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ] }, "colorway": [ "#636efa", "#EF553B", "#00cc96", "#ab63fa", "#FFA15A", "#19d3f3", "#FF6692", "#B6E880", "#FF97FF", "#FECB52" ], "font": { "color": "#2a3f5f" }, "geo": { "bgcolor": "white", "lakecolor": "white", "landcolor": "#E5ECF6", "showlakes": true, "showland": true, "subunitcolor": "white" }, "hoverlabel": { "align": "left" }, "hovermode": "closest", "mapbox": { "style": "light" }, "paper_bgcolor": "white", "plot_bgcolor": "#E5ECF6", "polar": { "angularaxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" }, "bgcolor": "#E5ECF6", "radialaxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" } }, "scene": { "xaxis": { "backgroundcolor": "#E5ECF6", "gridcolor": "white", "gridwidth": 2, "linecolor": "white", "showbackground": true, "ticks": "", "zerolinecolor": "white" }, "yaxis": { "backgroundcolor": "#E5ECF6", "gridcolor": "white", "gridwidth": 2, "linecolor": "white", "showbackground": true, "ticks": "", "zerolinecolor": "white" }, "zaxis": { "backgroundcolor": "#E5ECF6", "gridcolor": "white", "gridwidth": 2, "linecolor": "white", "showbackground": true, "ticks": "", "zerolinecolor": "white" } }, "shapedefaults": { "line": { "color": "#2a3f5f" } }, "ternary": { "aaxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" }, "baxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" }, "bgcolor": "#E5ECF6", "caxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" } }, "title": { "x": 0.05 }, "xaxis": { "automargin": true, "gridcolor": "white", "linecolor": "white", "ticks": "", "title": { "standoff": 15 }, "zerolinecolor": "white", "zerolinewidth": 2 }, "yaxis": { "automargin": true, "gridcolor": "white", "linecolor": "white", "ticks": "", "title": { "standoff": 15 }, "zerolinecolor": "white", "zerolinewidth": 2 } } }, "title": { "text": "exp_chirp" }, "xaxis": { "anchor": "y", "domain": [ 0, 1 ], "title": { "text": "SNRin (dB)" } }, "yaxis": { "anchor": "x", "domain": [ 0, 1 ], "title": { "text": "Mean Squared Error" } } } }, "text/html": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Summary interactive plots with Plotly and a report.\n", "from plotly.offline import iplot\n", "import plotly.io as pio\n", "pio.renderers.default = \"plotly_mimetype+notebook\"\n", "interpreter = ResultsInterpreter(benchmark)\n", "\n", "figs = interpreter.get_summary_plotlys(df, bars=True, ylabel='Mean Squared Error')\n", "for fig in figs:\n", " iplot(fig)\n" ] } ], "metadata": { "kernelspec": { "display_name": ".venv", "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.12.2" } }, "nbformat": 4, "nbformat_minor": 5 }