Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save shohei/e618a5befc55ba0c1ba875a284221baf to your computer and use it in GitHub Desktop.
Save shohei/e618a5befc55ba0c1ba875a284221baf to your computer and use it in GitHub Desktop.
How to accelerate a Python function with PYNQ
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Acceleration of a FIR filter on the PYNQ-Z1\n",
"This tutorial demonstrates how to accelerate a Python function on the Zynq-7000 using PYNQ. We begin by testing a software FIR implementation, the SciPy function `lfilter`, and measuring it's performance. Then we load a custom overlay with a hardware FIR, and compare it's performance to the software implementation.\n",
"\n",
"### Plot function for use in this notebook\n",
"The first code block below defines a function that we will use for plotting data throughout this notebook. Note that the function has a `n_samples` argument so that we can limit the number of samples to plot. Plotting more than a few thousand samples can be very slow and consume a lot of RAM."
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"%matplotlib notebook\n",
"import matplotlib.pyplot as plt\n",
"\n",
"def plot_to_notebook(time_sec,in_signal,n_samples,out_signal=None):\n",
" plt.figure()\n",
" plt.subplot(1, 1, 1)\n",
" plt.xlabel('Time (usec)')\n",
" plt.grid()\n",
" plt.plot(time_sec[:n_samples]*1e6,in_signal[:n_samples],'y-',label='Input signal')\n",
" if out_signal is not None:\n",
" plt.plot(time_sec[:n_samples]*1e6,out_signal[:n_samples],'g-',linewidth=2,label='FIR output')\n",
" plt.legend()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Generate the input signal\n",
"The next code block will generate a \"noisy\" signal that we will use as input to the FIR implementations. The main signal is a 200kHz sinusoid but we have added lower amplitude sinusoids at 46MHz and 12MHz to simulate noise."
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Number of samples: 200000\n"
]
},
{
"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 overriden (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,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\" width=\"640\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import numpy as np\n",
"\n",
"# Total time\n",
"T = 0.002\n",
"# Sampling frequency\n",
"fs = 100e6\n",
"# Number of samples\n",
"n = int(T * fs)\n",
"# Time vector in seconds\n",
"t = np.linspace(0, T, n, endpoint=False)\n",
"# Samples of the signal\n",
"samples = 10000*np.sin(0.2e6*2*np.pi*t) + 1500*np.cos(46e6*2*np.pi*t) + 2000*np.sin(12e6*2*np.pi*t)\n",
"# Convert samples to 32-bit integers\n",
"samples = samples.astype(np.int32)\n",
"print('Number of samples: ',len(samples))\n",
"\n",
"# Plot signal to the notebook\n",
"plot_to_notebook(t,samples,1000)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Software FIR filter using SciPy\n",
"Now we use the `lfilter` function from SciPy to filter the signal using our filter coefficients. The coefficients implement a low pass filter with passband 0-5MHz, and they were generated using this website: http://t-filter.engineerjs.com/"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Software FIR execution time: 0.10773277282714844\n"
]
},
{
"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 overriden (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,iVBORw0KGgoAAAANSUhEUgAAAoAAAAHgCAYAAAA10dzkAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAMWRSURBVHhe7J0FnBy39cefj8F3ZmZmiO3YMYTaMDZJAw1jk7Rp2jA0zEkbatJ/GmZqkobR4cRBOzEzM8OBj+/+ehqNR9LMwp137/Zuf19/nlea3Z3bnR1JPz1JTwQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoGnRTD2CusHXr7OwQpkDAAAAQGMhT9haYTUyl2RAAO4eXYStdpIAAAAAaGR0FbbGSSYXEIC7R76wHatWraL8fE7GjoqKCvrkk0/ooIMOovT0dHUUxBpc5/oB17l+wHWuP3Ct64d4XeeCggLq1q0bJ1twlhPJBgTg7iEFoCAuAvCDDz6gww47DJVLHMF1rh9wnesHXOf6A9e6fojXdWYB2KIFa7/kFYAp6hEAAAAAACQJEIAAAAAAAEkGBCAAAAAAQJKBOYC7B+YANnJwnesHXOf6AdfZo6qqSl6PeMHn/vrrr2mfffbBPR1H6nqdU1NTKS0tjZo1C5Y5mAMIAbi7QAA2cnCd6wdc5/oB19mhqKiIVq9eTTU18QvvxucuKSmh7OzskCID7D67c51zcnKoU6dOlJGRoY54QABCAO4uEICNHFzn+gHXuX7AdXY8f4sWLZKNf7t27eImzqqrq6XQbN68OaWkYDZVvKjLdWbRWF5eTps2bZL3Q79+/XzvhQCEANxdIAAbObjO9QOuc/2A60xUWlpKy5Yto549e0qvUbxgYcIigut+CMD4sTvXeefOnbRixQrq1asXZWVlqaMOEIBYBAIAAKAJgmFZAGEeHlwdAAAAAIAkAwIQAAAAAHXmmWeeoZYtW6pc/fHll19KT+/27dvVEVAbIAABAACABubMM8+k3/3udypXf8RCvJ144om0cOFClQONBQhAAAAAANQZXmzTvn17lQONBQhAEDcqK3fQkiVXU1HRDHUkNBUV22jdumfEe5JyMRYAcaOwcBotXXqNKFtF6khoiopm0qZNb6ocaEj2228/uvjii+nKK6+k1q1bU8eOHemmm25Szzrw8OcjjzxChx56qBRhvXv3ptdff109GzxEOn36dHls+fLl8vmzzjqLQ1nIY2z233CZMWMG7b///pSXlydX5I4ePZqmTp0qnwvyIt52221SFPLrzz33XLr66qtp5MiR6lnP4/nPf/5Txupr06YN/fnPf5Yr2V2ef/55Gjt2LHXr1o06d+5MJ598Mm3cuFE9C3YXCEAQN5YsuYJWrbpbVBJeoQ/FnDm/pwULzqL5889SRwAAsWDatDG0cuVdosG/UR0JzdSpI0RZPFYIgu/VkcYPx4SrqipuENvdQNTPPvss5ebm0o8//kj33HMP3XLLLTR58mT1rMP1119Pxx13nBRop5xyCp100kk0b9489Wx4JkyYQA888IAUdOvWrZN2+eWXq2dN+Nxdu3aln3/+WdxT06SgCxVq6MUXX6Tbb7+d7r77bvna7t27S6Fq88UXX4h2Yol85O/KQpLNhcXgzTffTN988w3973//k6KVhSOIDRCAIGaUla2nRYv+QkVFs2WePQ/Rsn375/Jx8+b/yUcAQN1ITZ1Fy5ZdIQRIqTriUFw8S6UiU1zslOGmQHX1TiEgmsfcpkzJp1mzusrHoOfZ+G/vDsOHD6cbb7xRBjI+/fTTacyYMfTZZ5+pZx2OP/546WHr378/3XrrrfI1Dz30kHo2PLxDBsfCY88fexjZOOByECtXrqQDDjiABg4cKD8P/90RI0aoZ034759zzjnSu8if64YbbqBhw4apZz1atWpFDz/8sDznEUccQYcffrjx/c4++2zp3eSYjnvttRf961//og8//FAGhga7DwQgiBnz559Ja9Y8TFOnDldHQvd+WRzOm3c6lZauVkcAALGgefPrae3aB2n1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\" width=\"640\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"from scipy.signal import lfilter\n",
"\n",
"coeffs = [-255,-260,-312,-288,-144,153,616,1233,1963,2739,3474,4081,4481,4620,4481,4081,3474,2739,1963,1233,616,153,-144,-288,-312,-260,-255]\n",
"\n",
"import time\n",
"start_time = time.time()\n",
"sw_fir_output = lfilter(coeffs,70e3,samples)\n",
"stop_time = time.time()\n",
"sw_exec_time = stop_time - start_time\n",
"print('Software FIR execution time: ',sw_exec_time)\n",
"\n",
"# Plot the result to notebook\n",
"plot_to_notebook(t,samples,1000,out_signal=sw_fir_output)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Hardware FIR implementation\n",
"In the following code blocks, we test out the hardware FIR implementation and measure it's performance."
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"data": {
"application/javascript": [
"\n",
"require(['notebook/js/codecell'], function(codecell) {\n",
" codecell.CodeCell.options_default.highlight_modes[\n",
" 'magic_text/x-csrc'] = {'reg':[/^%%microblaze/]};\n",
" Jupyter.notebook.events.one('kernel_ready.Kernel', function(){\n",
" Jupyter.notebook.get_cells().map(function(cell){\n",
" if (cell.cell_type == 'code'){ cell.auto_highlight(); } }) ;\n",
" });\n",
"});\n"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"from pynq import Overlay\n",
"import pynq.lib.dma\n",
"\n",
"# Load the overlay\n",
"overlay = Overlay('/home/xilinx/pynq/overlays/fir_accel/fir_accel.bit')\n",
"\n",
"# Load the FIR DMA\n",
"dma = overlay.filter.fir_dma"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Hardware FIR execution time: 0.0040171146392822266\n",
"Hardware acceleration factor: 26.818446198587452\n"
]
},
{
"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 overriden (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,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\" width=\"640\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"from pynq import Xlnk\n",
"import numpy as np\n",
"\n",
"# Allocate buffers for the input and output signals\n",
"xlnk = Xlnk()\n",
"in_buffer = xlnk.cma_array(shape=(n,), dtype=np.int32)\n",
"out_buffer = xlnk.cma_array(shape=(n,), dtype=np.int32)\n",
"\n",
"# Copy the samples to the in_buffer\n",
"np.copyto(in_buffer,samples)\n",
"\n",
"# Trigger the DMA transfer and wait for the result\n",
"import time\n",
"start_time = time.time()\n",
"dma.sendchannel.transfer(in_buffer)\n",
"dma.recvchannel.transfer(out_buffer)\n",
"dma.sendchannel.wait()\n",
"dma.recvchannel.wait()\n",
"stop_time = time.time()\n",
"hw_exec_time = stop_time-start_time\n",
"print('Hardware FIR execution time: ',hw_exec_time)\n",
"print('Hardware acceleration factor: ',sw_exec_time / hw_exec_time)\n",
"\n",
"# Plot to the notebook\n",
"plot_to_notebook(t,samples,1000,out_signal=out_buffer)\n",
"\n",
"# Free the buffers\n",
"in_buffer.close()\n",
"out_buffer.close()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Driver for FIR accelerator\n",
"To hide the details of the DMA from the programmer, and make the accelerator easier to use, we create a driver for it. Below is the driver that will be associated with the `filter` hierarchy that we created in Vivado, consisting of the FIR IP and the DMA."
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [],
"source": [
"from pynq import DefaultHierarchy\n",
"\n",
"class FirDriver(DefaultHierarchy):\n",
" def __init__(self, description):\n",
" super().__init__(description)\n",
"\n",
" def fir_filter(self, data):\n",
" with xlnk.cma_array(shape=(len(data),), dtype=np.int32) as in_buffer,\\\n",
" xlnk.cma_array(shape=(len(data),), dtype=np.int32) as out_buffer:\n",
" np.copyto(in_buffer,data)\n",
" self.fir_dma.sendchannel.transfer(in_buffer)\n",
" self.fir_dma.recvchannel.transfer(out_buffer)\n",
" self.fir_dma.sendchannel.wait()\n",
" self.fir_dma.recvchannel.wait()\n",
" result = out_buffer.copy()\n",
" return result\n",
"\n",
" @staticmethod\n",
" def checkhierarchy(description):\n",
" if 'fir' in description['ip'] \\\n",
" and 'fir_dma' in description['ip']:\n",
" return True\n",
" return False"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We need to reload the overlay in order for the driver to be attached to the accelerator."
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Hardware FIR execution time (with driver): 0.03971076011657715\n"
]
},
{
"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 overriden (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,iVBORw0KGgoAAAANSUhEUgAAAoAAAAHgCAYAAAA10dzkAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAMXmSURBVHhe7J0HnBy19cefrzefu33uvWHcjcEYCITeQ2+hQ0JNAiRACElo/9BCJ/QWQui9BkwHG1wx7r33fr3f/fVGGo+kmS13vr3bu/19/XleaXZ3dm92JP30JD0RAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICWRSv1COoHX79uwgqdHAAAAACaC62FbRBW6+QSDAjAPaO7sHUyCQAAAIBmRg9h62UysYAA3DNyheWvXbuWcnM52XBUVlbSZ599RkcccQSlpqaqo6ChwXVuHHCdGwdc58YD17pxiNV1LigooJ49e3KyDWc5kWhAAO4ZjgAUxEQAfvzxx3TMMcegcokhuM6NA65z44Dr3HjgWjcOsbrOLADbtGHtl7gCMEk9AgAAAACABAECEAAAAAAgwYAABAAAAABIMDAHcM/AHMBmDq5z44Dr3DjgOntUV1c71yNW8Lm//fZbOuigg3BPx5D6Xufk5GRKSUmhVq2CZQ7mAEIA7ikQgM0cXOfGAde5ccB1lhQVFdG6deuotjZ24d343KWlpZSZmRlSZIA9Z0+uc1ZWFnXt2pXS0tLUEQ8IQAjAPQUCsJmD69w44Do3DrjO0vO3dOlSp/Hv1KlTzMRZTU2NIzRzcnIoKQmzqWJFfa4zi8aKigraunWrcz8MHDjQ914IQAjAPQUCsJmD69w44Do3DrjORGVlZbRy5Urq06eP4zWKFSxMWERw3Q8BGDv25DqXlJTQ6tWrqW/fvpSRkaGOSiAAsQgEAABACwTDsgDCPDy4OgAAAAAACQYEIAAAAADqzQsvvEBt27ZVucbj66+/djy9u3btUkdAXYAABAAAAJqYCy64gH71q1+pXOPREOLtjDPOoCVLlqgcaC5AAAIAAACg3vBim86dO6scaC5AAIKYUVWVT8uX30hFRT+rI6GprNxJGze+IN6TkIuxAIgZhYUzacWKP4uyVaSOhKaoaA5t3fqOyoGm5OCDD6bf/e53dP3111P79u0pLy+PbrnlFvWshIc/H3/8cTr66KMdEdavXz9688031bPBQ6SzZ892jq1atcp5/sILL+RQFs4xNvszXH7++Wc65JBDqHXr1s6K3LFjx9KMGTOc54K8iHfccYcjCvn1l1xyCd144400atQo9azn8fznP//pxOrr0KEDXXnllc5Kdpf//Oc/NH78eOrZsyd169aNzj77bNqyZYt6FuwpEIAgZixf/idau/ZuUUl4hT4U8+efSosXX0iLFl2ojgAAGoKZM8fRmjV3iQb/7+pIaGbMGCnK4slCEPygjjR/OCZcdXVxk9ieBqL+97//TdnZ2TR16lS655576LbbbqNJkyapZyV//etf6ZRTTnEE2jnnnENnnnkmLVy4UD0bnv33358efPBBR9Bt3LjRsT/+8Y/qWRM+d48ePWj69OninprpCLpQoYb++9//0v/93//R3Xff7by2V69ejlC1+eqrr0Q7sdx55L+VhSSbC4vBW2+9lb777jt6++23HdHKwhE0DBCAoMEoL99ES5deTUVF85w8ex6iZdeuL53Hbdvedh4BAPUjOXkurVz5JyFAytQRSXHxXJWKTHGxLMMtgZqaEiEgchrcJk/OpblzeziPQc+z8WfvCSNGjKC///3vTiDj8847j8aNG0dffPGFelZy2mmnOR62QYMG0e233+685pFHHlHPhod3yOBYeOz5Yw8jGwdcDmLNmjV02GGH0ZAhQ5zvw587cuRI9awJf/7FF1/seBf5e/3tb3+j4cOHq2c92rVrR48++qhzzuOOO46OPfZY4++76KKLHO8mx3Tcb7/96OGHH6ZPPvnECQwN9hwIQNBgLFp0Aa1f/yjNmDFCHQnd+2VxuHDheVRWtk4dAQA0BDk5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\" width=\"640\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"from pynq import Overlay\n",
"import pynq.lib.dma\n",
"\n",
"overlay = Overlay('/home/xilinx/pynq/overlays/fir_accel/fir_accel.bit')\n",
"\n",
"# Run the hardware FIR and measure the runtime\n",
"start_time = time.time()\n",
"result = overlay.filter.fir_filter(samples)\n",
"stop_time = time.time()\n",
"print('Hardware FIR execution time (with driver): ',stop_time-start_time)\n",
"\n",
"# Plot to the notebook\n",
"plot_to_notebook(t,samples,1000,out_signal=out_buffer)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"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.6.0"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment