{ "cells": [ { "cell_type": "code", "execution_count": 105, "metadata": {}, "outputs": [], "source": [ "import math\n", "import statistics\n", "import json\n", "\n", "import numpy as np\n", "from matplotlib import pyplot as plt\n", "import matplotlib as mpl\n", "import tqdm" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "%matplotlib notebook" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "#from math import nan, inf\n", "#data = {'dec_proto_am_ber_top.py': ([1.0, 1.2, 1.5, 1.8, 2.2, 2.7, 3.3, 3.9, 4.7, 5.6, 6.8, 8.2, 10.0, 12.0, 15.0, 18.0, 22.0, 27.0, 33.0, 39.0, 47.0, 56.0, 68.0, 82.0, 100.0, 120.0, 150.0, 180.0, 220.00000000000003, 270.0, 330.0, 390.0, 470.0, 560.0, 680.0, 819.9999999999999], [-1.1706362050026655, -1.193387892562896, -1.2494141100905836, -1.273546683602035, -1.3226867043413222, -1.3284842972643673, -1.4249085476621985, -2.4881654670462012, -2.9280282892286777, -1.8337596086785197, -3.4516299068927765, -3.6739503433927894, -3.85142894461751, -4.2109690103679895, -4.841764334589243, -5.121118910610676, -inf, -inf, -inf, -inf, -inf, -inf, -inf, -inf, -inf, -inf, -inf, -inf, -inf, -inf, -inf, -inf, -inf, -inf, -inf, -inf], [0.000562024584446438, 0.002583366143280799, 0.003536123538459578, 0.0060136203314800725, 0.0017120634851061035, 0.01202664019209608, 0.009352711681458127, 0.010626429313400118, 0.0031605552412962345, 0.07580074150906693, 0.008303067934118849, 0.010968003992851543, 0.010921403354231309, 0.014436211616218221, 0.045257276108434545, 0.05063300417965297, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan]), 'dec_proto_am_dc_ber_top.py': ([1.0, 1.2, 1.5, 1.8, 2.2, 2.7, 3.3, 3.9, 4.7, 5.6, 6.8, 8.2, 10.0, 12.0, 15.0, 18.0, 22.0, 27.0, 33.0, 39.0, 47.0, 56.0, 68.0, 82.0, 100.0, 120.0, 150.0, 180.0, 220.00000000000003, 270.0, 330.0, 390.0, 470.0, 560.0, 680.0, 819.9999999999999], [-1.208226392045617, -1.2001309534534812, -1.2082590111531317, -1.2057580375112593, -1.214704089694553, -1.231758143831406, -1.2328452042170934, -1.2342556988606688, -1.2555496906861663, -1.2633800823241472, -1.2801077286712825, -1.292429564986378, -1.2502315024699062, -1.2731027859982436, -1.3264964096914462, -1.350060076963517, -1.402916835230801, -1.6361557068303227, -1.3996004345826805, -2.025891115888953, -2.2259163050377957, -2.403329889470167, -2.5532801901852644, -2.6723825335502625, -2.7451475376985512, -2.7838943274880226, -2.7973828878928355, -2.8114503007382154, -2.7500487601808214, -2.7576294792325875, -2.7531131004032336, -2.771351588479543, -2.763352069271704, -2.7856492625232554, -2.8089246354122395, -2.805404500961304], [0.0006223969511333752, 0.001109700896962153, 0.00210398864758181, 0.0009171589283670842, 0.01005799259051457, 0.01198940071540007, 0.013730311872618627, 0.020358273695306007, 0.019376830251761356, 0.02698367824924875, 0.03015560422449139, 0.04189253434399468, 0.04626542022859063, 0.07217384274518368, 0.08584595043975161, 0.12539079396237413, 0.09791907379447246, 0.10581626829587948, 0.18250650933422224, 0.07591527055792387, 0.20120497031325296, 0.2529568393261202, 0.3140587593946733, 0.3626712973758648, 0.39454531783086805, 0.40694947364033235, 0.4101018950589088, 0.38136874448954844, 0.4108311426740005, 0.40839715897167816, 0.4083367927775933, 0.40823628264400785, 0.4080951641200549, 0.40959607776701595, 0.40969886669408834, 0.4099477409126599]), 'dec_proto_fm_ber_top.py': ([1.0, 1.2, 1.5, 1.8, 2.2, 2.7, 3.3, 3.9, 4.7, 5.6, 6.8, 8.2, 10.0, 12.0, 15.0, 18.0, 22.0, 27.0, 33.0, 39.0, 47.0, 56.0, 68.0, 82.0, 100.0, 120.0, 150.0, 180.0, 220.00000000000003, 270.0, 330.0, 390.0, 470.0, 560.0, 680.0, 819.9999999999999], [-1.3057961403392255, -1.3484294968657196, -1.4667961434461176, -2.8690875116735697, -1.6547222812660038, -1.3891625558026135, -3.5982019547373056, -3.771391890011728, -4.029223203659058, -4.187133187428117, -4.5257152915000916, -4.8291374538093805, -4.9882102105766535, -4.988903861492872, -4.977243402972817, -4.991583617404103, -4.978662932291627, -4.995597720146179, -4.980234434828162, -4.898328188806772, -4.886065758764744, -4.892892232164741, -4.887955756857991, -4.894121825695038, -4.874834077432752, -4.881909834221005, -4.885749246925116, -4.879474958404899, -4.893610496073961, -4.893589161336422, -4.900892127305269, -4.89244575984776, -4.886744260787964, -4.895636919885874, -4.909515650942922, -4.8994301706552505], [0.014213245118859085, 0.001330722343276248, 0.013951488821076687, 0.0041134580502828425, 0.038365233682153145, 0.030733212747131068, 0.0091992661239188, 0.010529797577944408, 0.014647350039240111, 0.014036738695564741, 0.0201667482688038, 0.03195929762792339, 0.050554225347760565, 0.05155121488079693, 0.05696637316379902, 0.05194819962648275, 0.04815391425232906, 0.04198674248536032, 0.0531488148233794, 0.043095657257340825, 0.05140641385191975, 0.047935496094956176, 0.05329373773860191, 0.05040869503181174, 0.05644083328947176, 0.053389328604204575, 0.05074839526504205, 0.053625197798602975, 0.047252304573416753, 0.051310379811370974, 0.046438087027853785, 0.05365724267638675, 0.0534321058650641, 0.04956836848859283, 0.04218369035098332, 0.05032427561533336])}" ] }, { "cell_type": "code", "execution_count": 54, "metadata": { "scrolled": true }, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "75ad09f7b6df4c1aa68ef78b1e4ceb0a", "version_major": 2, "version_minor": 0 }, "text/plain": [ "HBox(children=(IntProgress(value=0, max=380), HTML(value='')))" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Will launch 450 simulation jobs in 38 batches of 12\n", "Starting batch 1/38...\n", "done.\n", "Waiting for simulation:\n", "Terminating processes...\n", "done.\n", "Processing simulation results\n", "Starting batch 2/38...\n", "done.\n", "Waiting for simulation:\n", "Terminating processes...\n", "done.\n", "Processing simulation results\n", "Starting batch 3/38...\n", "done.\n", "Waiting for simulation:\n", "Terminating processes...\n", "done.\n", "Processing simulation results\n", "Starting batch 4/38...\n", "done.\n", "Waiting for simulation:\n", "Terminating processes...\n", "done.\n", "Processing simulation results\n", "Starting batch 5/38...\n", "done.\n", "Waiting for simulation:\n", "Terminating processes...\n", "done.\n", "Processing simulation results\n", "Starting batch 6/38...\n", "done.\n", "Waiting for simulation:\n", "Terminating processes...\n", "done.\n", "Processing simulation results\n", "Starting batch 7/38...\n", "done.\n", "Waiting for simulation:\n", "Terminating processes...\n", "done.\n", "Processing simulation results\n", "Starting batch 8/38...\n", "done.\n", "Waiting for simulation:\n", "Terminating processes...\n", "done.\n", "Processing simulation results\n", "Starting batch 9/38...\n", "done.\n", "Waiting for simulation:\n", "Terminating processes...\n", "done.\n", "Processing simulation results\n", "Starting batch 10/38...\n", "done.\n", "Waiting for simulation:\n", "Terminating processes...\n", "done.\n", "Processing simulation results\n", "Starting batch 11/38...\n", "done.\n", "Waiting for simulation:\n", "Terminating processes...\n", "done.\n", "Processing simulation results\n", "Starting batch 12/38...\n", "done.\n", "Waiting for simulation:\n", "Terminating processes...\n", "done.\n", "Processing simulation results\n", "Starting batch 13/38...\n", "done.\n", "Waiting for simulation:\n", "Terminating processes...\n", "done.\n", "Processing simulation results\n", "Starting batch 14/38...\n", "done.\n", "Waiting for simulation:\n", "Terminating processes...\n", "done.\n", "Processing simulation results\n", "Starting batch 15/38...\n", "done.\n", "Waiting for simulation:\n", "Terminating processes...\n", "done.\n", "Processing simulation results\n", "Starting batch 16/38...\n", "done.\n", "Waiting for simulation:\n", "Terminating processes...\n", "done.\n", "Processing simulation results\n", "Starting batch 17/38...\n", "done.\n", "Waiting for simulation:\n", "Terminating processes...\n", "done.\n", "Processing simulation results\n", "Starting batch 18/38...\n", "done.\n", "Waiting for simulation:\n", "Terminating processes...\n", "done.\n", "Processing simulation results\n", "Starting batch 19/38...\n", "done.\n", "Waiting for simulation:\n", "Terminating processes...\n", "done.\n", "Processing simulation results\n", "Starting batch 20/38...\n", "done.\n", "Waiting for simulation:\n", "Terminating processes...\n", "done.\n", "Processing simulation results\n", "Starting batch 21/38...\n", "done.\n", "Waiting for simulation:\n", "Terminating processes...\n", "done.\n", "Processing simulation results\n", "Starting batch 22/38...\n", "done.\n", "Waiting for simulation:\n", "Terminating processes...\n", "done.\n", "Processing simulation results\n", "Starting batch 23/38...\n", "done.\n", "Waiting for simulation:\n", "Terminating processes...\n", "done.\n", "Processing simulation results\n", "Starting batch 24/38...\n", "done.\n", "Waiting for simulation:\n", "Terminating processes...\n", "done.\n", "Processing simulation results\n", "Starting batch 25/38...\n", "done.\n", "Waiting for simulation:\n", "Terminating processes...\n", "done.\n", "Processing simulation results\n", "Starting batch 26/38...\n", "done.\n", "Waiting for simulation:\n", "Terminating processes...\n", "done.\n", "Processing simulation results\n", "Starting batch 27/38...\n", "done.\n", "Waiting for simulation:\n", "Terminating processes...\n", "done.\n", "Processing simulation results\n", "Starting batch 28/38...\n", "done.\n", "Waiting for simulation:\n", "Terminating processes...\n", "done.\n", "Processing simulation results\n", "Starting batch 29/38...\n", "done.\n", "Waiting for simulation:\n", "Terminating processes...\n", "done.\n", "Processing simulation results\n", "Starting batch 30/38...\n", "done.\n", "Waiting for simulation:\n", "Terminating processes...\n", "done.\n", "Processing simulation results\n", "Starting batch 31/38...\n", "done.\n", "Waiting for simulation:\n", "Terminating processes...\n", "done.\n", "Processing simulation results\n", "Starting batch 32/38...\n", "done.\n", "Waiting for simulation:\n", "Terminating processes...\n", "done.\n", "Processing simulation results\n", "Starting batch 33/38...\n", "done.\n", "Waiting for simulation:\n", "Terminating processes...\n", "done.\n", "Processing simulation results\n", "Starting batch 34/38...\n", "done.\n", "Waiting for simulation:\n", "Terminating processes...\n", "done.\n", "Processing simulation results\n", "Starting batch 35/38...\n", "done.\n", "Waiting for simulation:\n", "Terminating processes...\n", "done.\n", "Processing simulation results\n", "Starting batch 36/38...\n", "done.\n", "Waiting for simulation:\n", "Terminating processes...\n", "done.\n", "Processing simulation results\n", "Starting batch 37/38...\n", "done.\n", "Waiting for simulation:\n", "Terminating processes...\n", "done.\n", "Processing simulation results\n", "Starting batch 38/38...\n", "done.\n", "Waiting for simulation:\n", "Terminating processes...\n", "done.\n", "Processing simulation results\n", "\n" ] } ], "source": [ "import sweep_gr_sims\n", "data = sweep_gr_sims.run_simulation(\n", " amplitudes = [10**x for x in np.linspace(0, 2.5, 30)],\n", " #simulations=['dec_proto_am_ber_top.py'],\n", " duration=10.0,\n", " forklimit=12,\n", " repeat_runs=5,\n", " tqdm=tqdm.tqdm_notebook)" ] }, { "cell_type": "code", "execution_count": 91, "metadata": {}, "outputs": [], "source": [ "with open('results_digitalocean2.json') as f:\n", " data = json.loads(f.read())\n", " for sim in list(data):\n", " data[sim] = {\n", " float(a): entry for a, entry in data[sim].items()\n", " }" ] }, { "cell_type": "code", "execution_count": 76, "metadata": {}, "outputs": [], "source": [ "#with open('gr_sweep_results2.json', 'w') as f:\n", "# f.write(json.dumps(data))" ] }, { "cell_type": "code", "execution_count": 73, "metadata": {}, "outputs": [], "source": [ "labels = {\n", " 'dec_proto_am_dc_ber_top.py': '\"DC\"',\n", " 'dec_proto_am_ber_top.py': 'ASK',\n", " 'dec_proto_fm_ber_top.py': 'FSK'\n", "}" ] }, { "cell_type": "code", "execution_count": 111, "metadata": { "scrolled": false }, "outputs": [ { "data": { "application/javascript": [ "/* Put everything inside the global mpl namespace */\n", "window.mpl = {};\n", "\n", "\n", "mpl.get_websocket_type = function() {\n", " if (typeof(WebSocket) !== 'undefined') {\n", " return WebSocket;\n", " } else if (typeof(MozWebSocket) !== 'undefined') {\n", " return MozWebSocket;\n", " } else {\n", " alert('Your browser does not have WebSocket support.' +\n", " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n", " 'Firefox 4 and 5 are also supported but you ' +\n", " 'have to enable WebSockets in about:config.');\n", " };\n", "}\n", "\n", "mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n", " this.id = figure_id;\n", "\n", " this.ws = websocket;\n", "\n", " this.supports_binary = (this.ws.binaryType != undefined);\n", "\n", " if (!this.supports_binary) {\n", " var warnings = document.getElementById(\"mpl-warnings\");\n", " if (warnings) {\n", " warnings.style.display = 'block';\n", " warnings.textContent = (\n", " \"This browser does not support binary websocket messages. \" +\n", " \"Performance may be slow.\");\n", " }\n", " }\n", "\n", " this.imageObj = new Image();\n", "\n", " this.context = undefined;\n", " this.message = undefined;\n", " this.canvas = undefined;\n", " this.rubberband_canvas = undefined;\n", " this.rubberband_context = undefined;\n", " this.format_dropdown = undefined;\n", "\n", " this.image_mode = 'full';\n", "\n", " this.root = $('<div/>');\n", " this._root_extra_style(this.root)\n", " this.root.attr('style', 'display: inline-block');\n", "\n", " $(parent_element).append(this.root);\n", "\n", " this._init_header(this);\n", " this._init_canvas(this);\n", " this._init_toolbar(this);\n", "\n", " var fig = this;\n", "\n", " this.waiting = false;\n", "\n", " this.ws.onopen = function () {\n", " fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n", " fig.send_message(\"send_image_mode\", {});\n", " if (mpl.ratio != 1) {\n", " fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n", " }\n", " fig.send_message(\"refresh\", {});\n", " }\n", "\n", " this.imageObj.onload = function() {\n", " if (fig.image_mode == 'full') {\n", " // Full images could contain transparency (where diff images\n", " // almost always do), so we need to clear the canvas so that\n", " // there is no ghosting.\n", " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n", " }\n", " fig.context.drawImage(fig.imageObj, 0, 0);\n", " };\n", "\n", " this.imageObj.onunload = function() {\n", " fig.ws.close();\n", " }\n", "\n", " this.ws.onmessage = this._make_on_message_function(this);\n", "\n", " this.ondownload = ondownload;\n", "}\n", "\n", "mpl.figure.prototype._init_header = function() {\n", " var titlebar = $(\n", " '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n", " 'ui-helper-clearfix\"/>');\n", " var titletext = $(\n", " '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n", " 'text-align: center; padding: 3px;\"/>');\n", " titlebar.append(titletext)\n", " this.root.append(titlebar);\n", " this.header = titletext[0];\n", "}\n", "\n", "\n", "\n", "mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n", "\n", "}\n", "\n", "\n", "mpl.figure.prototype._root_extra_style = function(canvas_div) {\n", "\n", "}\n", "\n", "mpl.figure.prototype._init_canvas = function() {\n", " var fig = this;\n", "\n", " var canvas_div = $('<div/>');\n", "\n", " canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n", "\n", " function canvas_keyboard_event(event) {\n", " return fig.key_event(event, event['data']);\n", " }\n", "\n", " canvas_div.keydown('key_press', canvas_keyboard_event);\n", " canvas_div.keyup('key_release', canvas_keyboard_event);\n", " this.canvas_div = canvas_div\n", " this._canvas_extra_style(canvas_div)\n", " this.root.append(canvas_div);\n", "\n", " var canvas = $('<canvas/>');\n", " canvas.addClass('mpl-canvas');\n", " canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n", "\n", " this.canvas = canvas[0];\n", " this.context = canvas[0].getContext(\"2d\");\n", "\n", " var backingStore = this.context.backingStorePixelRatio ||\n", "\tthis.context.webkitBackingStorePixelRatio ||\n", "\tthis.context.mozBackingStorePixelRatio ||\n", "\tthis.context.msBackingStorePixelRatio ||\n", "\tthis.context.oBackingStorePixelRatio ||\n", "\tthis.context.backingStorePixelRatio || 1;\n", "\n", " mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n", "\n", " var rubberband = $('<canvas/>');\n", " rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n", "\n", " var pass_mouse_events = true;\n", "\n", " canvas_div.resizable({\n", " start: function(event, ui) {\n", " pass_mouse_events = false;\n", " },\n", " resize: function(event, ui) {\n", " fig.request_resize(ui.size.width, ui.size.height);\n", " },\n", " stop: function(event, ui) {\n", " pass_mouse_events = true;\n", " fig.request_resize(ui.size.width, ui.size.height);\n", " },\n", " });\n", "\n", " function mouse_event_fn(event) {\n", " if (pass_mouse_events)\n", " return fig.mouse_event(event, event['data']);\n", " }\n", "\n", " rubberband.mousedown('button_press', mouse_event_fn);\n", " rubberband.mouseup('button_release', mouse_event_fn);\n", " // Throttle sequential mouse events to 1 every 20ms.\n", " rubberband.mousemove('motion_notify', mouse_event_fn);\n", "\n", " rubberband.mouseenter('figure_enter', mouse_event_fn);\n", " rubberband.mouseleave('figure_leave', mouse_event_fn);\n", "\n", " canvas_div.on(\"wheel\", function (event) {\n", " event = event.originalEvent;\n", " event['data'] = 'scroll'\n", " if (event.deltaY < 0) {\n", " event.step = 1;\n", " } else {\n", " event.step = -1;\n", " }\n", " mouse_event_fn(event);\n", " });\n", "\n", " canvas_div.append(canvas);\n", " canvas_div.append(rubberband);\n", "\n", " this.rubberband = rubberband;\n", " this.rubberband_canvas = rubberband[0];\n", " this.rubberband_context = rubberband[0].getContext(\"2d\");\n", " this.rubberband_context.strokeStyle = \"#000000\";\n", "\n", " this._resize_canvas = function(width, height) {\n", " // Keep the size of the canvas, canvas container, and rubber band\n", " // canvas in synch.\n", " canvas_div.css('width', width)\n", " canvas_div.css('height', height)\n", "\n", " canvas.attr('width', width * mpl.ratio);\n", " canvas.attr('height', height * mpl.ratio);\n", " canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n", "\n", " rubberband.attr('width', width);\n", " rubberband.attr('height', height);\n", " }\n", "\n", " // Set the figure to an initial 600x600px, this will subsequently be updated\n", " // upon first draw.\n", " this._resize_canvas(600, 600);\n", "\n", " // Disable right mouse context menu.\n", " $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n", " return false;\n", " });\n", "\n", " function set_focus () {\n", " canvas.focus();\n", " canvas_div.focus();\n", " }\n", "\n", " window.setTimeout(set_focus, 100);\n", "}\n", "\n", "mpl.figure.prototype._init_toolbar = function() {\n", " var fig = this;\n", "\n", " var nav_element = $('<div/>')\n", " nav_element.attr('style', 'width: 100%');\n", " this.root.append(nav_element);\n", "\n", " // Define a callback function for later on.\n", " function toolbar_event(event) {\n", " return fig.toolbar_button_onclick(event['data']);\n", " }\n", " function toolbar_mouse_event(event) {\n", " return fig.toolbar_button_onmouseover(event['data']);\n", " }\n", "\n", " for(var toolbar_ind in mpl.toolbar_items) {\n", " var name = mpl.toolbar_items[toolbar_ind][0];\n", " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", " var image = mpl.toolbar_items[toolbar_ind][2];\n", " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", "\n", " if (!name) {\n", " // put a spacer in here.\n", " continue;\n", " }\n", " var button = $('<button/>');\n", " button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n", " 'ui-button-icon-only');\n", " button.attr('role', 'button');\n", " button.attr('aria-disabled', 'false');\n", " button.click(method_name, toolbar_event);\n", " button.mouseover(tooltip, toolbar_mouse_event);\n", "\n", " var icon_img = $('<span/>');\n", " icon_img.addClass('ui-button-icon-primary ui-icon');\n", " icon_img.addClass(image);\n", " icon_img.addClass('ui-corner-all');\n", "\n", " var tooltip_span = $('<span/>');\n", " tooltip_span.addClass('ui-button-text');\n", " tooltip_span.html(tooltip);\n", "\n", " button.append(icon_img);\n", " button.append(tooltip_span);\n", "\n", " nav_element.append(button);\n", " }\n", "\n", " var fmt_picker_span = $('<span/>');\n", "\n", " var fmt_picker = $('<select/>');\n", " fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n", " fmt_picker_span.append(fmt_picker);\n", " nav_element.append(fmt_picker_span);\n", " this.format_dropdown = fmt_picker[0];\n", "\n", " for (var ind in mpl.extensions) {\n", " var fmt = mpl.extensions[ind];\n", " var option = $(\n", " '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n", " fmt_picker.append(option)\n", " }\n", "\n", " // Add hover states to the ui-buttons\n", " $( \".ui-button\" ).hover(\n", " function() { $(this).addClass(\"ui-state-hover\");},\n", " function() { $(this).removeClass(\"ui-state-hover\");}\n", " );\n", "\n", " var status_bar = $('<span class=\"mpl-message\"/>');\n", " nav_element.append(status_bar);\n", " this.message = status_bar[0];\n", "}\n", "\n", "mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n", " // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n", " // which will in turn request a refresh of the image.\n", " this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n", "}\n", "\n", "mpl.figure.prototype.send_message = function(type, properties) {\n", " properties['type'] = type;\n", " properties['figure_id'] = this.id;\n", " this.ws.send(JSON.stringify(properties));\n", "}\n", "\n", "mpl.figure.prototype.send_draw_message = function() {\n", " if (!this.waiting) {\n", " this.waiting = true;\n", " this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n", " }\n", "}\n", "\n", "\n", "mpl.figure.prototype.handle_save = function(fig, msg) {\n", " var format_dropdown = fig.format_dropdown;\n", " var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n", " fig.ondownload(fig, format);\n", "}\n", "\n", "\n", "mpl.figure.prototype.handle_resize = function(fig, msg) {\n", " var size = msg['size'];\n", " if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n", " fig._resize_canvas(size[0], size[1]);\n", " fig.send_message(\"refresh\", {});\n", " };\n", "}\n", "\n", "mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n", " var x0 = msg['x0'] / mpl.ratio;\n", " var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n", " var x1 = msg['x1'] / mpl.ratio;\n", " var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n", " x0 = Math.floor(x0) + 0.5;\n", " y0 = Math.floor(y0) + 0.5;\n", " x1 = Math.floor(x1) + 0.5;\n", " y1 = Math.floor(y1) + 0.5;\n", " var min_x = Math.min(x0, x1);\n", " var min_y = Math.min(y0, y1);\n", " var width = Math.abs(x1 - x0);\n", " var height = Math.abs(y1 - y0);\n", "\n", " fig.rubberband_context.clearRect(\n", " 0, 0, fig.canvas.width, fig.canvas.height);\n", "\n", " fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n", "}\n", "\n", "mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n", " // Updates the figure title.\n", " fig.header.textContent = msg['label'];\n", "}\n", "\n", "mpl.figure.prototype.handle_cursor = function(fig, msg) {\n", " var cursor = msg['cursor'];\n", " switch(cursor)\n", " {\n", " case 0:\n", " cursor = 'pointer';\n", " break;\n", " case 1:\n", " cursor = 'default';\n", " break;\n", " case 2:\n", " cursor = 'crosshair';\n", " break;\n", " case 3:\n", " cursor = 'move';\n", " break;\n", " }\n", " fig.rubberband_canvas.style.cursor = cursor;\n", "}\n", "\n", "mpl.figure.prototype.handle_message = function(fig, msg) {\n", " fig.message.textContent = msg['message'];\n", "}\n", "\n", "mpl.figure.prototype.handle_draw = function(fig, msg) {\n", " // Request the server to send over a new figure.\n", " fig.send_draw_message();\n", "}\n", "\n", "mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n", " fig.image_mode = msg['mode'];\n", "}\n", "\n", "mpl.figure.prototype.updated_canvas_event = function() {\n", " // Called whenever the canvas gets updated.\n", " this.send_message(\"ack\", {});\n", "}\n", "\n", "// A function to construct a web socket function for onmessage handling.\n", "// Called in the figure constructor.\n", "mpl.figure.prototype._make_on_message_function = function(fig) {\n", " return function socket_on_message(evt) {\n", " if (evt.data instanceof Blob) {\n", " /* FIXME: We get \"Resource interpreted as Image but\n", " * transferred with MIME type text/plain:\" errors on\n", " * Chrome. But how to set the MIME type? It doesn't seem\n", " * to be part of the websocket stream */\n", " evt.data.type = \"image/png\";\n", "\n", " /* Free the memory for the previous frames */\n", " if (fig.imageObj.src) {\n", " (window.URL || window.webkitURL).revokeObjectURL(\n", " fig.imageObj.src);\n", " }\n", "\n", " fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n", " evt.data);\n", " fig.updated_canvas_event();\n", " fig.waiting = false;\n", " return;\n", " }\n", " else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n", " fig.imageObj.src = evt.data;\n", " fig.updated_canvas_event();\n", " fig.waiting = false;\n", " return;\n", " }\n", "\n", " var msg = JSON.parse(evt.data);\n", " var msg_type = msg['type'];\n", "\n", " // Call the \"handle_{type}\" callback, which takes\n", " // the figure and JSON message as its only arguments.\n", " try {\n", " var callback = fig[\"handle_\" + msg_type];\n", " } catch (e) {\n", " console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n", " return;\n", " }\n", "\n", " if (callback) {\n", " try {\n", " // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n", " callback(fig, msg);\n", " } catch (e) {\n", " console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n", " }\n", " }\n", " };\n", "}\n", "\n", "// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n", "mpl.findpos = function(e) {\n", " //this section is from http://www.quirksmode.org/js/events_properties.html\n", " var targ;\n", " if (!e)\n", " e = window.event;\n", " if (e.target)\n", " targ = e.target;\n", " else if (e.srcElement)\n", " targ = e.srcElement;\n", " if (targ.nodeType == 3) // defeat Safari bug\n", " targ = targ.parentNode;\n", "\n", " // jQuery normalizes the pageX and pageY\n", " // pageX,Y are the mouse positions relative to the document\n", " // offset() returns the position of the element relative to the document\n", " var x = e.pageX - $(targ).offset().left;\n", " var y = e.pageY - $(targ).offset().top;\n", "\n", " return {\"x\": x, \"y\": y};\n", "};\n", "\n", "/*\n", " * return a copy of an object with only non-object keys\n", " * we need this to avoid circular references\n", " * http://stackoverflow.com/a/24161582/3208463\n", " */\n", "function simpleKeys (original) {\n", " return Object.keys(original).reduce(function (obj, key) {\n", " if (typeof original[key] !== 'object')\n", " obj[key] = original[key]\n", " return obj;\n", " }, {});\n", "}\n", "\n", "mpl.figure.prototype.mouse_event = function(event, name) {\n", " var canvas_pos = mpl.findpos(event)\n", "\n", " if (name === 'button_press')\n", " {\n", " this.canvas.focus();\n", " this.canvas_div.focus();\n", " }\n", "\n", " var x = canvas_pos.x * mpl.ratio;\n", " var y = canvas_pos.y * mpl.ratio;\n", "\n", " this.send_message(name, {x: x, y: y, button: event.button,\n", " step: event.step,\n", " guiEvent: simpleKeys(event)});\n", "\n", " /* This prevents the web browser from automatically changing to\n", " * the text insertion cursor when the button is pressed. We want\n", " * to control all of the cursor setting manually through the\n", " * 'cursor' event from matplotlib */\n", " event.preventDefault();\n", " return false;\n", "}\n", "\n", "mpl.figure.prototype._key_event_extra = function(event, name) {\n", " // Handle any extra behaviour associated with a key event\n", "}\n", "\n", "mpl.figure.prototype.key_event = function(event, name) {\n", "\n", " // Prevent repeat events\n", " if (name == 'key_press')\n", " {\n", " if (event.which === this._key)\n", " return;\n", " else\n", " this._key = event.which;\n", " }\n", " if (name == 'key_release')\n", " this._key = null;\n", "\n", " var value = '';\n", " if (event.ctrlKey && event.which != 17)\n", " value += \"ctrl+\";\n", " if (event.altKey && event.which != 18)\n", " value += \"alt+\";\n", " if (event.shiftKey && event.which != 16)\n", " value += \"shift+\";\n", "\n", " value += 'k';\n", " value += event.which.toString();\n", "\n", " this._key_event_extra(event, name);\n", "\n", " this.send_message(name, {key: value,\n", " guiEvent: simpleKeys(event)});\n", " return false;\n", "}\n", "\n", "mpl.figure.prototype.toolbar_button_onclick = function(name) {\n", " if (name == 'download') {\n", " this.handle_save(this, null);\n", " } else {\n", " this.send_message(\"toolbar_button\", {name: name});\n", " }\n", "};\n", "\n", "mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n", " this.message.textContent = tooltip;\n", "};\n", "mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n", "\n", "mpl.extensions = [\"eps\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n", "\n", "mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n", " // Create a \"websocket\"-like object which calls the given IPython comm\n", " // object with the appropriate methods. Currently this is a non binary\n", " // socket, so there is still some room for performance tuning.\n", " var ws = {};\n", "\n", " ws.close = function() {\n", " comm.close()\n", " };\n", " ws.send = function(m) {\n", " //console.log('sending', m);\n", " comm.send(m);\n", " };\n", " // Register the callback with on_msg.\n", " comm.on_msg(function(msg) {\n", " //console.log('receiving', msg['content']['data'], msg);\n", " // Pass the mpl event to the overridden (by mpl) onmessage function.\n", " ws.onmessage(msg['content']['data'])\n", " });\n", " return ws;\n", "}\n", "\n", "mpl.mpl_figure_comm = function(comm, msg) {\n", " // This is the function which gets called when the mpl process\n", " // starts-up an IPython Comm through the \"matplotlib\" channel.\n", "\n", " var id = msg.content.data.id;\n", " // Get hold of the div created by the display call when the Comm\n", " // socket was opened in Python.\n", " var element = $(\"#\" + id);\n", " var ws_proxy = comm_websocket_adapter(comm)\n", "\n", " function ondownload(figure, format) {\n", " window.open(figure.imageObj.src);\n", " }\n", "\n", " var fig = new mpl.figure(id, ws_proxy,\n", " ondownload,\n", " element.get(0));\n", "\n", " // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n", " // web socket which is closed, not our websocket->open comm proxy.\n", " ws_proxy.onopen();\n", "\n", " fig.parent_element = element.get(0);\n", " fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n", " if (!fig.cell_info) {\n", " console.error(\"Failed to find cell for figure\", id, fig);\n", " return;\n", " }\n", "\n", " var output_index = fig.cell_info[2]\n", " var cell = fig.cell_info[0];\n", "\n", "};\n", "\n", "mpl.figure.prototype.handle_close = function(fig, msg) {\n", " var width = fig.canvas.width/mpl.ratio\n", " fig.root.unbind('remove')\n", "\n", " // Update the output cell to use the data from the current canvas.\n", " fig.push_to_output();\n", " var dataURL = fig.canvas.toDataURL();\n", " // Re-enable the keyboard manager in IPython - without this line, in FF,\n", " // the notebook keyboard shortcuts fail.\n", " IPython.keyboard_manager.enable()\n", " $(fig.parent_element).html('<img src=\"' + dataURL + '\" width=\"' + width + '\">');\n", " fig.close_ws(fig, msg);\n", "}\n", "\n", "mpl.figure.prototype.close_ws = function(fig, msg){\n", " fig.send_message('closing', msg);\n", " // fig.ws.close()\n", "}\n", "\n", "mpl.figure.prototype.push_to_output = function(remove_interactive) {\n", " // Turn the data on the canvas into data in the output cell.\n", " var width = this.canvas.width/mpl.ratio\n", " var dataURL = this.canvas.toDataURL();\n", " this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n", "}\n", "\n", "mpl.figure.prototype.updated_canvas_event = function() {\n", " // Tell IPython that the notebook contents must change.\n", " IPython.notebook.set_dirty(true);\n", " this.send_message(\"ack\", {});\n", " var fig = this;\n", " // Wait a second, then push the new image to the DOM so\n", " // that it is saved nicely (might be nice to debounce this).\n", " setTimeout(function () { fig.push_to_output() }, 1000);\n", "}\n", "\n", "mpl.figure.prototype._init_toolbar = function() {\n", " var fig = this;\n", "\n", " var nav_element = $('<div/>')\n", " nav_element.attr('style', 'width: 100%');\n", " this.root.append(nav_element);\n", "\n", " // Define a callback function for later on.\n", " function toolbar_event(event) {\n", " return fig.toolbar_button_onclick(event['data']);\n", " }\n", " function toolbar_mouse_event(event) {\n", " return fig.toolbar_button_onmouseover(event['data']);\n", " }\n", "\n", " for(var toolbar_ind in mpl.toolbar_items){\n", " var name = mpl.toolbar_items[toolbar_ind][0];\n", " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", " var image = mpl.toolbar_items[toolbar_ind][2];\n", " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", "\n", " if (!name) { continue; };\n", "\n", " var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n", " button.click(method_name, toolbar_event);\n", " button.mouseover(tooltip, toolbar_mouse_event);\n", " nav_element.append(button);\n", " }\n", "\n", " // Add the status bar.\n", " var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n", " nav_element.append(status_bar);\n", " this.message = status_bar[0];\n", "\n", " // Add the close button to the window.\n", " var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n", " var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n", " button.click(function (evt) { fig.handle_close(fig, {}); } );\n", " button.mouseover('Stop Interaction', toolbar_mouse_event);\n", " buttongrp.append(button);\n", " var titlebar = this.root.find($('.ui-dialog-titlebar'));\n", " titlebar.prepend(buttongrp);\n", "}\n", "\n", "mpl.figure.prototype._root_extra_style = function(el){\n", " var fig = this\n", " el.on(\"remove\", function(){\n", "\tfig.close_ws(fig, {});\n", " });\n", "}\n", "\n", "mpl.figure.prototype._canvas_extra_style = function(el){\n", " // this is important to make the div 'focusable\n", " el.attr('tabindex', 0)\n", " // reach out to IPython and tell the keyboard manager to turn it's self\n", " // off when our div gets focus\n", "\n", " // location in version 3\n", " if (IPython.notebook.keyboard_manager) {\n", " IPython.notebook.keyboard_manager.register_events(el);\n", " }\n", " else {\n", " // location in version 2\n", " IPython.keyboard_manager.register_events(el);\n", " }\n", "\n", "}\n", "\n", "mpl.figure.prototype._key_event_extra = function(event, name) {\n", " var manager = IPython.notebook.keyboard_manager;\n", " if (!manager)\n", " manager = IPython.keyboard_manager;\n", "\n", " // Check for shift+enter\n", " if (event.shiftKey && event.which == 13) {\n", " this.canvas_div.blur();\n", " event.shiftKey = false;\n", " // Send a \"J\" for go to next cell\n", " event.which = 74;\n", " event.keyCode = 74;\n", " manager.command_mode();\n", " manager.handle_keydown(event);\n", " }\n", "}\n", "\n", "mpl.figure.prototype.handle_save = function(fig, msg) {\n", " fig.ondownload(fig, null);\n", "}\n", "\n", "\n", "mpl.find_output_cell = function(html_output) {\n", " // Return the cell and output element which can be found *uniquely* in the notebook.\n", " // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n", " // IPython event is triggered only after the cells have been serialised, which for\n", " // our purposes (turning an active figure into a static one), is too late.\n", " var cells = IPython.notebook.get_cells();\n", " var ncells = cells.length;\n", " for (var i=0; i<ncells; i++) {\n", " var cell = cells[i];\n", " if (cell.cell_type === 'code'){\n", " for (var j=0; j<cell.output_area.outputs.length; j++) {\n", " var data = cell.output_area.outputs[j];\n", " if (data.data) {\n", " // IPython >= 3 moved mimebundle to data attribute of output\n", " data = data.data;\n", " }\n", " if (data['text/html'] == html_output) {\n", " return [cell, data, j];\n", " }\n", " }\n", " }\n", " }\n", "}\n", "\n", "// Register the function which deals with the matplotlib target/channel.\n", "// The kernel may be null if the page has been refreshed.\n", "if (IPython.notebook.kernel != null) {\n", " IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n", "}\n" ], "text/plain": [ "<IPython.core.display.Javascript object>" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "<img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAA4QAAAH0CAYAAABl8+PTAAAgAElEQVR4nOzdeVhU9dsG8NMiZpq2b746Wpaap1wzzcrMpcW0MjWtn2VamqVli41LRuaSS2qaC64MuOAu6rAvAyKggKKCgAqyCwLKJjsz9/vHxOgIjKgwZ87M/bmu7x+Nz5x5Bnhobs4mgIiIiIiIiGySIHUDREREREREJA0GQiIiIiIiIhvFQEhERERERGSjGAiJiIiIiIhsFAMhERERERGRjWIgJCIiIiIislEMhERERERERDaKgZCIiIiIiMhGMRASERERERHZKAZCIiIiIiIiG8VASEREREREZKMYCImIiIiIiGwUAyEREREREZGNYiAkIiIiIiKyUQyERERERERENoqBkIiIiIiIyEYxEBIREREREdkoBkIiIiIiIiIbxUBIRERERERkoxgIiYiIiIiIbBQDIRERERERkY1iICQiIiIiIrJRDIREREREREQ2ioGQiIiIiIjIRjEQEhERERER2SgGQiIiIiIiIhvFQEhERERERGSjGAiJiIiIiIhsFAMhERERERGRjWIgJCIiIiIislEMhERERERERDaKgZCIiIiIiMhGMRASERERERHZKAZCIiIiIiIiG8VASEREREREZKMYCImIiIiIiGwUAyEREREREZGNYiAkIiIiIiKyUQyERERERERENoqBkIioBo6OjhAEwWg9+uij6Nu3Lw4dOlSt/sba69cXX3xhqLO3tzf6t3vvvRetWrXCV199hYyMjHrr//Lly/jkk0/w2GOPQRAEfPDBB/W27ZooFAoMHjy4QV/jRomJiRAEAY6OjmZ93YbSt29f9O3b97ae+8UXX0ChUNzWc7dt24bly5fX+G+CIMDe3v62tnsngoODYW9vj9zcXLO/NhGRrWEgJCKqQVUgdHR0RGhoKEJCQrBv3z689dZbEAQBBw8eNKoXBAHDhw9HaGhotRUfH2+oqwqEnp6eCA0NhY+PD6ZNm4a7774bL7zwAsrLy+ul/6lTp8LOzg5bt25FaGgozp49Wy/brY0UgbC0tBShoaHIysoy6+s2FKkC4eDBg2t9bmhoKFJTU29ru3diyZIlEAQBiYmJZn9tIiJbw0BIRFSDqkAYHh5u9HhxcTEaN26M0aNHGz0uCAK+++67m263KhBmZ2cbPf7ll19CEAT4+/vfefMA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\" width=\"900\">" ], "text/plain": [ "<IPython.core.display.HTML object>" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig, ax = plt.subplots(figsize=(9, 5))\n", "ax.set_title('BERs for basic modulation types')\n", "if data.keys() - labels.keys():\n", " raise ValueError(f'Unmatched simulation labels: {data.keys() - labels.keys()}')\n", "for sim, label in labels.items():\n", " d = data[sim]\n", " ampls = np.array(sorted(list(d.keys())))\n", " # We've left the gnuradio BER block at its default setting, a cutoff at -70dB BER,\n", " # so we replace -inf with -7 here.\n", " filter_inf = lambda l: [ x for x in l if math.isfinite(x) ] or [-7]\n", " filter_nan = lambda l: [ x for x in l if math.isfinite(x) ] or [math.nan]\n", " bers = np.array([ statistics.mean(filter_inf(d[a][0])) for a in ampls ])\n", " #stdevs = [ statistics.stdev(filter_inf(d[a][0])) if len(filter_inf(d[a][0]))>1 else 0 for a in ampls ]\n", " stdevs = np.array([ math.sqrt(statistics.mean([x**2 for x in filter_nan(d[a][1])] + [0])) for a in ampls ])\n", " \n", " # The Gnuradio BER block calculates bit error rate over whole bytes, but we only feed in bits casted\n", " # to bytes. We correct for this by adding log10(8).\n", " # Also convert log10 values to dB.\n", " bers = (bers + math.log10(8))*10\n", " stdevs *= 10\n", " #ax.errorbar(ampls, bers, yerr=stdevs, label=label)\n", " p, = ax.plot(ampls, bers, label=label)\n", " \n", " ax.fill_between(ampls, bers-stdevs, bers+stdevs,\n", " alpha=0.3, facecolor=p.get_color(), linewidth=0)\n", "ax.grid()\n", "ax.legend()\n", "ax.set_xscale('log')\n", "ax.set_xlabel('Amplitude Δf [mHz]')\n", "ax.set_ylabel('BER [dB]')\n", "ax.set_ylim([-50, 0])\n", "ber05 = 10*math.log10(0.5)\n", "ax.axhline(ber05, linestyle='--', color='red')\n", "bbox = {'facecolor': 'black', 'alpha': 0.8, 'pad': 2}\n", "xform = mpl.transforms.blended_transform_factory(ax.transAxes, ax.transData)\n", "ax.text(0.9, ber05, f'BER=0.5', transform=xform, color='white', bbox=bbox, ha='center', va='center')\n", "\n", "None" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "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.7.6" } }, "nbformat": 4, "nbformat_minor": 2 }