Created
June 18, 2019 09:48
-
-
Save p-avital/d7b4652d4fa508394b841f72aa77e8a9 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| { | |
| "cells": [ | |
| { | |
| "cell_type": "code", | |
| "execution_count": 4, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "ULA shape:\n[[-0.14 -0.1 -0.06 -0.02 0.02 0.06 0.1 0.14]\n [ 0. 0. 0. 0. 0. 0. 0. 0. ]]\n\nSample Rate: 8.0MHz\nPhysical Frequency: 2.40GHz\nBaseband Frequency: 250kHz\n" | |
| ] | |
| } | |
| ], | |
| "source": [ | |
| "# import matplotlib\n", | |
| "# \n", | |
| "# matplotlib.use('TkAgg')\n", | |
| "\n", | |
| "from cramer_rao.sampling_optimisation import *\n", | |
| "\n", | |
| "# Config Cell\n", | |
| "\n", | |
| "# aoa shape\n", | |
| "number_of_antennas: int = 8\n", | |
| "ULA = AntennaNetworkCrbComputer.define_ULA(number_of_antennas, 0.04, 0)\n", | |
| "\n", | |
| "# frequencies\n", | |
| "sample_rate: float = 8e6\n", | |
| "physical_frequency: float = 2.4e9\n", | |
| "offset_frequency: float = 250e3\n", | |
| "\n", | |
| "# sampling constraints\n", | |
| "number_of_blocks = 8\n", | |
| "number_of_samples = 1024\n", | |
| "antenna_switch_time = 1.25e-6\n", | |
| "\n", | |
| "# noise constraints\n", | |
| "snr = 40\n", | |
| "\n", | |
| "print(\"ULA shape:\")\n", | |
| "print(ULA.transpose())\n", | |
| "print()\n", | |
| "print(\"Sample Rate: {:}MHz\".format(sample_rate / 1e6))\n", | |
| "print(\"Physical Frequency: {:.2f}GHz\".format(physical_frequency / 1e9))\n", | |
| "print(\"Baseband Frequency: {:.0f}kHz\".format(offset_frequency / 1e3))\n" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 5, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "SINE: A: 1, freq: 2400000000.0, t0: 0, snr: 40.0\n8 blocks equi-sampling: [119, 119, 119, 119, 119, 119, 119, 119] samples per antenna\nCut into [60, 5, 5, 5, 5, 5, 5, 5] by current sampling technique\n857 samples discarded (90%)\n" | |
| ] | |
| } | |
| ], | |
| "source": [ | |
| "# defining sine\n", | |
| "sine = Sine(1, physical_frequency, 0, snr)\n", | |
| "print(sine)\n", | |
| "\n", | |
| "# building time axes\n", | |
| "time_blocks: List[TimeAxis] = generate_sampling_axes(number_of_blocks, number_of_samples, sample_rate,\n", | |
| " sample_rate * antenna_switch_time)\n", | |
| "time_axes: List[TimeAxis] = [np.concatenate([time_blocks[i]\n", | |
| " for i in range(k, len(time_blocks), number_of_antennas)])\n", | |
| " for k in range(number_of_antennas)]\n", | |
| "print(\"{} blocks equi-sampling: {} samples per antenna\".format(number_of_blocks, [len(axis) for axis in time_axes]))\n", | |
| "\n", | |
| "\n", | |
| "def abbreviate_sampling(samples: List[np.ndarray]) -> List[np.ndarray]:\n", | |
| " result = [samples[0][0:60]]\n", | |
| " result.extend([samples[i][0:5] for i in range(1, len(samples))])\n", | |
| " return result\n", | |
| "\n", | |
| "\n", | |
| "# deriving cut time axes (simulating current valeo behaviour)\n", | |
| "cut_time_axes: List[TimeAxis] = abbreviate_sampling(time_axes)\n", | |
| "print(\"Cut into {} by current sampling technique\".format([len(axis) for axis in cut_time_axes]))\n", | |
| "_number_of_discarded_samples = np.sum([len(axis) for axis in time_axes]) - np.sum([len(axis) for axis in cut_time_axes])\n", | |
| "print(\"{} samples discarded ({:.0f}%)\".format(_number_of_discarded_samples,\n", | |
| " 100 * _number_of_discarded_samples / np.sum(\n", | |
| " [len(axis) for axis in time_axes])))\n", | |
| "#\n", | |
| "#\n", | |
| "#\n" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": null, | |
| "metadata": { | |
| "collapsed": false | |
| }, | |
| "outputs": [ | |
| { | |
| "name": "stderr", | |
| "output_type": "stream", | |
| "text": [ | |
| "C:\\Users\\pavital\\git\\phd\\sources\\python\\cramer_rao\\sampling_optimisation.py:265: RuntimeWarning: divide by zero encountered in double_scalars\n return 1 / np.sum(self._cdij_squared * self._tij_crb * (np.sin(phi - self._angleij)) ** 2)\n" | |
| ] | |
| }, | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "\nFull Sampling should be 86% more precise\n" | |
| ] | |
| }, | |
| { | |
| "data": { | |
| "image/png": "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U4dX2UrJX1uYzTpChIfTgfyV9BQGEXF57n1whZaPi33lBK01F154IVdccUVkpeb69es5cOAA06dPT3jdrbfeymWXXUZZWVnM6z6fjxUrVrB69WomTpyI1+tNWR8+m9x4441xr0hYJi1i6jk4w51PlJWQAYEeQPXZQ7V3ZBhy+n5v3ps2FFi1ahVut5svfvGLkdfmzp3LBz/4QZ5//nnOP//8yOvXXHMN99xzD7/4xS/Yu3cvp59+OqeffnrM/dra2vD7/dTU1ACmtstxxx0HwKOPPsrixYuZN28eZ511FgcOHACM8r7iiis455xzqK+v569//Svf/va3aWhoYNmyZfh8xrfU19fzne98h0WLFrFo0SK2bdvW5/f57Gc/GylrUF9fzw9u/P+Y/6FP0TB/Ee+++y4Ah5ubOfvss5k/fz5XX301kydPjmw+kk2KUrmDVVhGOp+QAYEe48Aj26DFBUUjI8MhIB6e/C7sfzu79xzbAOfelPDtDRs2sGDBgrRu+dWvfpWf//znrFq1itra2pj3Ro4cyfLly5k8eTJnnnkm559/PpdeeikOh4NTTjmF1157DaUUd911FzfffDM/+9nPAHjvvfdYtWoV77zzDieddBIPPfQQN998MxdeeCGPP/44H/3oRwGoqqpi9erV/P73v+frX/86jz32WNK21taO5I2n/8SvHnqBW265he/fdBu//NlPOOOMM/je977HU089xcqVK9P6/e1SlModojqhDJuF/hDwxYRk+i5iCjt3EQ/Fwl133cWzzz7LokWLuOWWW7jyyisBaGxs5EMf+hANDQ389Kc/jSn3e+655+J2u2loaCAQCLBs2TLAlP+NDutceumlkWO4gFgyPrb8PAAWzJ8fuc+61a9xySWXALBs2TJGjBjR79/ZiqJU7io66B4ZNotzFzIg0NM7+iN6QjX0YCgp9yQKO1fMmjUrYXXG/pT9bWhooKGhgcsvv5wpU6Zwzz338JWvfIVvfOMbLF++nOeff54bbrghcn50uV+32x0J/UaX+4XYkHCqcr8AJR4P4MPpdEXuIyV/kxBTOEwmVIX+EA7LxNFrXy5QDom554gzzjgDr9fLnXfeGXltzZo1vPDCC0yePJl33nkHr9fL0aNHefbZZyPnVFZW0tbW1ud+7e3tMUW8wuV+AY4ePcqECRMAuPfeezNq75///OfI8aST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\n", | |
| "text/plain": [ | |
| "<Figure size 432x288 with 1 Axes>" | |
| ] | |
| }, | |
| "metadata": {}, | |
| "output_type": "display_data" | |
| } | |
| ], | |
| "source": [ | |
| "# crb estimation\n", | |
| "full_sampling_crb = multi_antenna_analytical_crb(sine, time_axes)\n", | |
| "cut_sampling_crb = multi_antenna_analytical_crb(sine, cut_time_axes)\n", | |
| "\n", | |
| "full_sampling_aoa = AntennaNetworkCrbComputer(ULA, full_sampling_crb[1:len(time_axes) + 1, 1:len(time_axes) + 1])\n", | |
| "cut_sampling_aoa = AntennaNetworkCrbComputer(ULA, cut_sampling_crb[1:len(time_axes) + 1, 1:len(time_axes) + 1])\n", | |
| "fig = plt.figure()\n", | |
| "# plt.ion()\n", | |
| "ax = fig.add_subplot(111) #, projection='polar')\n", | |
| "_full_circle = np.linspace(0, 2 * np.pi, int(1e4))\n", | |
| "full_crb = [np.sqrt(full_sampling_aoa.get_crb(phi)) * 180 / np.pi for phi in _full_circle]\n", | |
| "cut_crb = [np.sqrt(cut_sampling_aoa.get_crb(phi)) * 180 / np.pi for phi in _full_circle]\n", | |
| "ax.plot(_full_circle, full_crb, label='Full Sampling')\n", | |
| "ax.plot(_full_circle, cut_crb, label='Cut Sampling')\n", | |
| "ax.set_ylim(0, .5)\n", | |
| "ax.legend()\n", | |
| "# fig.show()\n", | |
| "print()\n", | |
| "print('Full Sampling should be {:.0f}% more precise'.format(100 * (min(cut_crb) - min(full_crb)) / min(cut_crb)))\n", | |
| "# plt.ioff()\n" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 7, | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "music_angle_estimator = MusicAngleEstimator(ULA, 2 * np.pi * physical_frequency)\n", | |
| "test_phis = np.linspace(0, 2 * np.pi, 128)\n", | |
| "number_of_observations = 1\n", | |
| "\n" | |
| ] | |
| } | |
| ], | |
| "metadata": { | |
| "kernelspec": { | |
| "display_name": "Python 2", | |
| "language": "python", | |
| "name": "python2" | |
| }, | |
| "language_info": { | |
| "codemirror_mode": { | |
| "name": "ipython", | |
| "version": 2 | |
| }, | |
| "file_extension": ".py", | |
| "mimetype": "text/x-python", | |
| "name": "python", | |
| "nbconvert_exporter": "python", | |
| "pygments_lexer": "ipython2", | |
| "version": "2.7.6" | |
| } | |
| }, | |
| "nbformat": 4, | |
| "nbformat_minor": 0 | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment