From 836fa2eb40e297de96691029848f01fa014cd994 Mon Sep 17 00:00:00 2001 From: Laurence Withers Date: Thu, 10 Jul 2014 16:46:22 +0000 Subject: [PATCH] Further WIP --- python/.gitignore | 5 + python/filter_analysis.ipynb | 299 ++++++++++++++++++++++++++++++ python/fir++.h | 1 + python/pyfir.i | 24 +++ python/setup.py | 16 ++ src/libfir++/000_TopHeader.h | 1 + src/libfir++/100_Filter.cc | 15 ++ src/libfir++/100_Filter.h | 31 +++- src/libfir++/200_CommonFilters.cc | 28 +++ src/libfir++/200_CommonFilters.h | 48 +++++ src/libfir/000_TopHeader.h | 5 +- src/libfir/200_common_filters.c | 42 ++++- src/libfir/200_common_filters.h | 4 + src/libfir/300_response.c | 28 +++ src/libfir/300_response.h | 39 ++++ 15 files changed, 581 insertions(+), 5 deletions(-) create mode 100644 python/.gitignore create mode 100644 python/filter_analysis.ipynb create mode 120000 python/fir++.h create mode 100644 python/pyfir.i create mode 100644 python/setup.py create mode 100644 src/libfir++/200_CommonFilters.cc create mode 100644 src/libfir++/200_CommonFilters.h create mode 100644 src/libfir/300_response.c create mode 100644 src/libfir/300_response.h diff --git a/python/.gitignore b/python/.gitignore new file mode 100644 index 0000000..7058149 --- /dev/null +++ b/python/.gitignore @@ -0,0 +1,5 @@ +.ipynb_checkpoints/ +__pycache__/ +build/ +fir.py +pyfir_wrap.cxx diff --git a/python/filter_analysis.ipynb b/python/filter_analysis.ipynb new file mode 100644 index 0000000..65cfa3c --- /dev/null +++ b/python/filter_analysis.ipynb @@ -0,0 +1,299 @@ +{ + "metadata": { + "name": "", + "signature": "sha256:059af54bd0e19f56f028eec31f2ad301153d3f7d6d47b7b235667783d0bcff25" + }, + "nbformat": 3, + "nbformat_minor": 0, + "worksheets": [ + { + "cells": [ + { + "cell_type": "code", + "collapsed": false, + "input": [ + "import fir\n", + "\n", + "sample_rate = 1000 # Hz\n", + "corner = 100 # Hz\n", + "gain = 1.0\n", + "npoints = 501\n", + "\n", + "nyquist_freq = sample_rate / 2\n", + "\n", + "fi = fir.LanczosLowpass(npoints, corner / sample_rate, gain, 3)" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 44 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "%matplotlib inline\n", + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "import pylab\n", + "\n", + "bode_points = 997 # non-multiple number avoids numeric effects/beating\n", + "respfunc = pylab.vectorize(lambda f: fi.response(f/sample_rate))" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 45 + }, + { + "cell_type": "heading", + "level": 3, + "metadata": {}, + "source": [ + "Linear Bode plot" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "freq = pylab.linspace(0, nyquist_freq, bode_points)\n", + "resp = respfunc(freq)\n", + "\n", + "fig, axes = plt.subplots(nrows=2, ncols=1, figsize=(10,10), dpi=100)\n", + "\n", + "axes[0].plot(freq, abs(resp), 'r')\n", + "axes[0].set_xlabel('Frequency (Hz)')\n", + "axes[0].set_ylabel('Magnitude')\n", + "\n", + "axes[1].plot(freq, pylab.angle(resp), 'r')\n", + "axes[1].set_xlabel('Frequency (Hz)')\n", + "axes[1].set_ylabel('Phase (radians)')\n", + "axes[1].set_ylim([-pylab.pi,pylab.pi])\n", + "axes[1].set_yticks(pylab.linspace(-pylab.pi, pylab.pi, 9))\n", + "axes[1].set_yticklabels(['-\u03c0', '-\u00be\u03c0', '-\u00bd\u03c0', '-\u00bc\u03c0', '0', '\u00bc\u03c0', '\u00bd\u03c0', '\u00be\u03c0', '\u03c0'])\n", + "\n", + "None" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "metadata": {}, + "output_type": "display_data", + "png": "iVBORw0KGgoAAAANSUhEUgAAAmoAAAJeCAYAAAAEOSnEAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3XmYJEWd//F3T88JAwOKBwzgKIiCIqCIoOvSCCrKCq7X\nKIOu16qLeOG6igeOP1dd75VFUfFicRzGRUCQS1AbFOUebgaY4ZqDG2ZgmHu6f39EpRUdHZEZeVRl\nHZ/X8/TTXVVRmVEZ1Znf/EZEJoiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiEiH+Bnw\nAHBj4PU5wPXADcBlwIvaVC8RERGRvvdKYB/CgdoBwIzG34cCl7ejUiIiIiJizCIcqNm2BZa1tioi\nIiIinWtC3RVI8T7gvLorISIiItJPZpGdUTsIuAWTVRMRERHpSxPrroDHi4CTMWPUHvMV2GWXXUaX\nLFnS1kqJiIiIFLQE2LXIGzstUNsZOAM4ClgcKrRkyRJGR0fbVimp1ty5c5k7d27d1ZAC1HbdTe3X\nvdR23W1gYGCXou9td6A2HzgQ2A5YCnwRmNR47UfA8ZjuzpMaz20E9mtzHUVEREQ6QrsDtXdkvP7+\nxo+IiIhI3+vkWZ/So4aGhuqughSktutuar/upbbrXwN1V6CgUY1RExERkW4wMDAABWMuZdRERERE\nOpQCNREREZEOpUBNREREpEMpUBMRERHpUArURERERDqUAjURERGRDqVATURERKRDKVATERER6VAK\n1EREREQ6lAI1ERERkQ6lQE1ERESkQylQExEREelQCtREREREOpQCNREREZEOpUBNREREpEMpUBMR\nERHpUArURERERDqUAjURERGRDqVATURERKRDKVATERER6VAK1EREREQ6lAI1ERERkQ6lQE1ERESk\nQylQExEREelQCtREREREOpQCNREREZEOpUBNREREpEMpUBMRERHpUArURERERDqUAjURERGRDqVA\nTURERKRDtTtQ+xnwAHBjSpkTgDuA64F92lEpERERkU7U7kDt58ChKa+/HtgVeC7wAeCkdlRKRERE\npBO1O1D7M/BYyuuHA6c0/r4C2AZ4RqsrJSIiItKJOm2M2kxgqfV4GbBjTXURERERqdXEuivgMeA8\nHvWWOuEEGG285P72PTfqLGZgwP8TWs64Wlrlk3LuT1o9QssdHIRJk8zfGzfC5s0webJ5bvNm89zG\n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\ndYomN8pFhaan+0edyqlvnVXT3vsMu7/1Ps/3nO+cs2rYtfapeuutVbW7VtRK77OSe0izqVXLtm8f\nhqzUkrA2T5rw9+vOnWVEvlRR8/dwTFGTr7Pkc+tbpqKoeewD7B2832vw2XSRCxoPyYlvJB8j4tPU\nLK/5fHMKVkr9CcsqDcQPkaqPTKctWcrrjpHCGJkrVSBrY/FiqptPFyOkGin0acKdqyVkGLpT1GLx\nZyEJ210UtfA7P8iFnVnom9RstYtZr/dvShUJ1ZWUWlbjc+/TlM04FLUS9WFa6kqpopYiWF0rpE0V\nNX9v7tw59GMY21pC5Nsqajt3Ln9ywkpQ1HanvmWMiprHtcDncI+Pun7w/wtbldo1tCWuJupPiYJV\nEiuVU8tyJKypoqalSylY2nWFdQltNCJZs3wbS6cRvhhxjOWTuu6SGLouFbWcEta1ohaebt7VrLfU\nRus8U51gLAi3q1lvakAOO85U/J82yOZ8XkKqu1TU/EBdQ4hmQVGTalkbn9fu0C2x8X4MiVkTn2v3\nWVNFzatIcll5Eoqa9S3d9S0TUNTeCJwF3AD83eD/N7UqtQtoippHk+XImDqVUmC0dCkCo8VG5UhE\nCSkMB20t/ixGWmPKl1TUNOJTQkhryKbMJ0YccwpkTEnU8hmHopYiWLWKmszHX2/4ne/4ulp6KJnR\n+s47NZP1HZtPn5vRdjHrDQdk33nu2pVWOkoG2TY+975uoqg1VR80n7dVV/znNYOtJ2bafVLi85Kl\nrdQAWmIj1bIufK5NqNoqatJ2Eoqa9S3d9S0TUNQA7gR+CPwUOB54QKtSu4A2+LdZjswpamG+Po3/\nrJTAhGWVkogQqWVMmUZbspTXJBW+HJkrbVNJNkvaS+aTWpbWSKBMU6qidq2opUhAraKWysd/V9tR\ndjGjLVkGCDu2XGdaMuv1g4pWH592167uSNgsKGrSn3IH5SQVtdx9FpKykoGv1OeeFLW9z7xNiVrm\n/2/qc+l76YcaRS3mq0koata3dNe3TEBRuwz4KHAT7ky19zNLZ6vt3On+wvPPYktnUEYYShQijxrC\nF1OwpE1umdWni6WB+LXHljVT6qKWrolipaXT2itHtMP4s1h7laqomqKmLYOVnn9Wq6jJskrJnP+u\ntqPMzWhLZ5f+WnJnV+WUjtWry2a9YQcedp7jImFhPiXxZ7OuqEF6YM+pK/I+005vDwfHEhWjzXJT\niU1IympUcb85oanPtd95SlHz8WezpqhZ36L7XvN5rm+ZgKL2LOBM4Fbc7s/TgNtalZrHQ4FbcMeB\nPFe1SCkycik0p6iFNiFqlyO1NNImR8JKl0c1AiNVuNySZUz5kopabgnVp2tDNv17ee3SV1rZWppS\nFTX0VUxR8zYLC/EOfJyKmiSHbRW11Iy2NF4jNaPN7YDSBu1YBy5ntF2TsFw+Jb7qUlHzg3ApCZOx\nTG2UjphtSMpKFIpSRa3tfSZtfH7aJpFaVbyNz31ZpYpauMQ4KUXNx59pNppya33LzCtqdwJ3DP5f\ngyNQJ7QqNY0F4BU4snYS8Fjg7qplSsHqUlHz6UqVsFQ8VY0yFxLJHTvcq99llksTI44x1a2EzMVs\nNF+EfihprxjRLiGb8tprfB4SUl+v1Cw6R8JqZ9o5MqftLqtR1HzHubBQNsjWxIg0VTqkja+r7DzH\nScKanH/WxOe1ippGwlKDY42iFrPx33vblFpWolCUDMi18WdSXQlJWe0y5Lh97suK+byEhMWWvbtS\n1HwdapbP5XfWt5TfZxNQ1L4H7Au8E/ggcCPwnValpnEm8M1BGduAvwEePmKVU7BiZCC2HJmz0RSY\nMB2UL7mVxm7VECONeGjEMaa6aW0R2qQUyBxxjKmLWhunrl2rX6y9Sn3u67v33u7/xz4WNm1yn41j\nph1T1PwSqCRzmm1OUdu6VT/2oHYZoCulI2YjfRZbYqztKEs63EmpK7WKWi0JazrI+teQlGn3hyRI\npbvoQhvtNPja+LOcWlYT2B8LX5iEopbz56QUtaZk3/qWfD6azQQUtUcAP8HFpV0FvG7w2bhwOPDd\n4P33Bp8tR0xJgVEyUhpPFRKR0KZ0OVJLI200UhHLJ6bUpQiMJHO5ODbZXinFqilx1K5TpvHv5c7V\nGl+Fn9XE0AF861vO/slPhiOOcJ/5/KapqGm2UlHz8ZnbtumDYs0g6zvBrma0oY02ow2vc5LLmjXx\nZ7uTohZTy/y9XhpblrrPSgbtkvusRi0rVdRK48+6UtS8Tc3yYdvYshJFrfQ+s76lm75lzIraIm6p\n02MLTlG7q1WpaZRfUYwMpEhOyRJcilSULqFqNjKfUhIh66IpS5qiJuvn89FUtxQpTLVXmE+KOJYs\nOcfqV7J8q8UBlvjc57PffsO2DjcOhLPncShqcnZfo6jVdpQ15wVps9Was6u8H+fnl3ee2uaJXNuO\na9Zb6s++Kmq+7f193nZwrLnPSgZteZ/VqmXhs29jCvU0fB6W5W26VtRyNrl8YveZppZZ37LcJDS6\naAAAIABJREFU97l8tDLf9S7aYDHz/Xbga8AG3GaCSeD7wJHB+yNxqtoyXP2lL8Gdd8JnPsPmHTvY\nHFteK12OzNnUxJbl1DKpYHlZNDxJP0WefLqcWqYRx5jqprVFaCPLryGOsfbyaVavTit+OUIaI3wl\nPl9UfgL+ezl77lpR0+LPahS1sPPKqRj+0EWvUtx1l3totH/wdPgA6iazXl+2nNGWKh2ptvX3Q9ez\n3lJ/dqWo1agrKRIm45X8d94fISnz35c8Yinlc/8Aan+frV/vHka9zz6jtiXkcMeOuiXoLmwm5fO2\nihqklzVr4s9SZfrYslIV1fqWqr5ly/e+xxaAj31s6JOGyBE1gP2ArwCfAn4++GwX8LBWJcfxGeA4\nYCPwA+AxuA0Fy3D1qafCQx8K970vvPOdg1opShiklyN9OklEQpvYcqSWd2rJLUXCYuREI1ySvHmi\nF4s/08imLCvWFjGymyOOWr6x+qxbt7zNawipbGPtuqU/QxuZD0xOUdPya6uorVund36+4wxnq77z\nlLZr16ZntGGsSdh5pjo2qRzWzHo1slMzaE9TXQl93URdidnMzdUF5OdifqTN1q3uPrjtNvd6++2O\nlPnfo7fR8tu+feivlFrWldJRatMXRS1nUxN/Ftq0Ucusb6nuWzZv2MBmgAsugI9+lGtojhKidpXy\nWbsF1zS2A0/Hnde2ALwe+KpqqZEeqFuOLFHdfDqphEGawMSWUDUFK0ZOPFLLkVu3puPPYuRJUwpT\nMWAp4phqL59m585hnEiMkOaWNWV7xfxX6vO2ipovo1ZRi+XXVFHbunX5rHf1avjFL5rNaNevr5vR\nys4qdr0xm5JZryQ7sTJDf8Y68D4oanKQ1dSyrmLBtm4d2njl7PbbYd99R219fWJlrV49JGUlCkWJ\nKuKRG0BT8Wc1Pi+ZbJXe0x5dbPzwNiXxZ6U7MUvuIetbhr73aNK3tECKqM3hCNmWApuu8b7BX6Jk\nMWhryok20MeWI3M2NbFlOdVt2zY3C/FpSmKuUsuRd92lEw+NOMZsUqQwRxy1a/cdk9bGsTQxxa9E\nCdPaOObPME1bRS1lI3/MciCozU8OcGEneMcdw0755z+HvfaCn/50tKPMqSu+TfxB0iUz2pxNCZFp\nO+sNd82GMSxNy2yqrvh7NzUQaANyeHZVqJaFqlRM6Vi7djiAxtSynTuXD7yejPnXvffOq26xgbip\nWlaqqPkVg3HfZ6WDf+jzkByGMXPexpMpLeawyXllsWM+YmpZjoSF/UbM1vqWoe/b9C0tMJ/4bgvw\nu7hHRkmcgDuI9iOta9AUmgKjKWGQXo706XIqks+nhvCBHn+mKVgxcqIpdSnypKllKUVNu66UWhaz\niSlfUkmMpdGuwafLLd+WxOLFrqGtohaz0Wb3NYpaTsXzippffipdBpODre+cw46zVOkosckpFE1n\nvZpN2H5ty2yirmgdeImi5v0RkjJ/D6d22vlzqVJkrkRRK1XdfFtoxCw2YLW1qVFXpuFzzTYsK/R5\nF4ratm3DPHMkrK2iZn3L0Cb0fdMyWyBF1C4A/i/wStxzPr+Oe1LAD3EH0v4IOL91DdpAIz1QtxxZ\norr5dDFSKBUhmSamYGnkKZaudDlSEr6SQPwa5UuWHZaV2liRS1NCwmJkM0XmcqR6XIpaTAkbl6K2\nbdvwyQkxdcVf7/x8ekZbqnSUxohMYtYb5tNFmbXqivR5OAsPfS7v1zaDbImK0dYmJGW+LXy7pO6P\nLhW1kvtsWopaipxLFbVGLZPLmN5H/jVHvGMkrMm5eNa3dNO3tIAiJ/wXtgJvGPwtAAcMPv8PYEfr\nkttCDraaWqYN9CWbAHIxTWFZMm6tJJZLpmmrqKUIX0kgvlafEiIU5rNjx1BJitUvtXwbvo+peVp7\nhdegtYV2X6TyCcttoqiFA5m39dczDkVtHDPamlmvtnNV1tO3ScqmdtYriYJUMbpSV1J1lz6K+TP0\nufeH90lukI0FcGs+98uYcifmHns4m9SzE30+nphpgdzh/VuiPnSlnGzdOmzn0vsjZuPJcsqf01bU\nJDHzPgofn7RtW56oaSTsF79wS5e33eburaZxjta31JfZAilFLcQOnIL2I2aBpIGuwKRikTSClVK+\nQhtt8NcUtVTZYZ3bKmqlapl27TlFTSOFsi00G/9jjtUv1haxpeOwLVJkU6tP7r5IkVYoU9Qk+Uqp\nK7EfeteKWlcz2ppZb5ez1dJ8SlSMcagrcnZfoqLKgcCToNKddrkBtI1a5vPftau5z+VyZOq+jeVX\nYpMj1ePw+fx8PHxBI2OxexHiilpIyrrcxRuS/bb3mfUtU1fUSonabEIjGZBWf3I2Ggnz6eTgv3On\ne/UOKVGewrK1fGP1aUpgcrFbmlKYU76kzdxcnGxK0hojmzEFMhb7VtJeJSpqjaLm8ws78JgCFpYj\nf7xdKmrjmNHWzHprZ6tdzHpThCindJSWKfOJdeBNFbXcAJqLPwvVlVDpiKkh8/PLidm4fF5CrGR+\nJTY5gtWlipryucynVlHzBEsjY/77tmfehUStyYRgnGrZSu5bWqC/RE0OtppaFiMDoY1HTFEL844p\nYXNzuvIk882RivC62hIYKAvED69DpsnVuUQtCz/Lxb7l1LzQJkZ+S+6LVD4QV9S0mV6topZTy2L5\nSXLo1RmZtosZbVfqyjhnvTFCVKJ0NFFXYp1zE0VtGmpZyeDo6+5/fyU+b0KsZH4lNtNQ1LR2q7nP\nwraYRswh5Mnc9u3D+LPUJhHrW9r3LS1QStQ2Mtw4sCewd+uS20IjOVI58Z+VBuLnFLXSwPxU2aUE\nq2nwviR8JYH4uV2fOwar3fPzcZsY2QyvIexAUmQz1V45BVJri1zMoUROUZNqWReKmq9rLL/Qh6Gi\nBqPHAkA3s95cjEiXs94am9ysN6d0TFpRC/3pyVOTuKCUTU4tKxkcZdv6e7LG500UNZ9nyqbPilrO\n5/LxSaU+L1FRNdVu1arRTSKxNrG+pbu+pQVKiNqTgLcBrxm8PwK4oXXJXSGnqGkDvbSBuE2MzPk0\nklTkYrnCsn2a0l2MTQhMavlWli/bwiOlYPmyYmpZzEYjkk02TaTaq8Tns6KoyUFC2oSDRqjOwPhm\nvbnZaqm6UjLr9Taxx2qNe9abIiVtFbXQn6tWtVdXamPLUgPVuHxeq2LkyuxaUdPIYYnPmyhqTX2e\nOhevRFELydysqGUruW9pgRKi9jTgfsD/G7z/OnBQ65LbIkZEIB5PFZK5EuVrx47h+WdhmhgxkjZh\n2bLOuXy63PUZlhVT3WJtoRGsmOKnXafMJ0Y2Y2XHfCWVsFh9cj6fFUUtNnhps7hwpg7NZrQlNrmZ\naKm6UjujTc1Wu1A6pG2s460tM9bJh/70J/fv3OnSd6GWlfizRlHL+arE5zk1RE5GSmy7VNRCW/lw\n967us/B32mX8Wc7GP0c15/Nx9RslNiuxb2mBkhy2Dv48FmGsj5AqR4lyopGBlI2myIRl5ZSw3G7S\nUoLV5a5PWZYkXbldn7ldlr7T0MhmeA2T2PUZ80PM59psZ9KKWvgXyy/8wYczddi9Zr252WoXSkfK\n1t8PTdQVrS00daVkaUqqZeG5bE38GZL88DvtvLdSVSpVVi4fORmZtKIWG5C7vM9Kfd42Ri32ZIi5\nuSE5jPkq9L1mY31Ld31LC5Tk8BHgebjYtAfjlkHf1brktogREf+ZNmiHZC6mfJWSAZ9GkorcJoCw\nbJ9m3Ls+ZVkhOdmxw33ulwPCtpDtGaJ216dG+FK+0to9LLuU8OV8Lq8rrJv8gWszvZgCJm20H2/4\nuS83lp8cbNsqaqkYka7Vlaaz3tihsV3PerW2baKuaG2hqSvh0lRIzMapYpSSsFR+NT73Nj5PmY+c\njKTKLCGHXagrTXyeus98er+E6W27UMtqfJ5r2y7vM+tb4rYtUELUfh/4d+BLwJOB9wLPb11yW2iD\neG5HZ9hgOeWrdDlSEo9Z3PUZI3whefJ5xNSyHHnK7fqUNr6sGlKotZeWTiNuYT6ybSTaKGoxm5Si\n5uudU9R824Yzdeh+Rls66y0ZQMM2KY0R6XrW631cMutN+TNXptYWmrqya1e6bcehYsQGodhAo9k0\n8XnMnzlFLfRZbtCWZWrkMHWf+bKa+Dx1v4Y+b6qotXmOaszn2lKvt0k9psv6lnZ9SwsocsIIdgB/\nMfjbDziSWVv6DAdxyC+DyfizHHny6bre9emfAzruXZ+SzIU2ufizGhuNPIU2kvDlfFVCSGU6f7ad\n9ENu52qIEnVF2mgzs9BG+/GGn/tyY2VqNm1mvamZ6LhmvbmZaKlNzaxXdqqTUtTCwV8qav7zLlWM\nnE1OfdCuYZw+l5MRbxMjETkC2cV91sTn3taTBWkTqqhr1w77wbZqmbzPxuVz61u661taoITqfQR3\nHMd+wGeB1wIvbV1yW2gDvUdN/FmKMMTIQJhGkrBZ3/VZu6OzxkZrr/Cz0uXbtu0VpokRQO0aPNqo\nZdIm/JM/3jCtLzdWpmYj1QdZL2g3680NjrWz3pIZbdez3jC/kllvic9j+Wj5SZ/LgSa8Bu2U/xpF\nzd8ju4uiFrZxjkB2cZ9pPm9zn4U+DxU1fxxHG7Us7FPG6XPrW7rrW1qgJIf1uB2fjwT+EjiTaT+M\nHfQBuHTXZ+kSXGxgjxERaROWHdZ5Urs+/TMFYyqSJE9tbbT2SrVpbtOE901q+VZLl1ua9TZdKWpy\nsJYDjM9T+6H7z71NrEzNRhv45Oy+zaw3vM4YiUjN7scx600NsjEyHNYv1rY1PteItuykY2WWKGpN\nzq5KDY6pQaitoiaJQqnPYz7S8okN7P5+6+o+k2V2dZ95UjYOn6f82YXPrW/prm9pgRKitgAcCjwa\neM/gs9lZ+tSCxnO7PmvJk5auD7s+c0dUpAiWJDkpgiXJXKo+KUKq1U8qoFpbpBTIGLHUrtOjRl3R\nBms5wPg8tR96raK2uOi+O+ccOPbY0XqWzJDHMevVOvBxzHpTg2yMDMeUDs2mxOca0e5CUWujruR8\nniNzTXweI08l/oz5KOZzjRz631ZX95kk5dr1NbnP+uxz61u661taoCSHPwTeD/wr8CngWOAbrUtu\ni9hAXxp/liIMk9j1GSNzJXX26XKEL6eESRuZr0+XU7Bk2bE2LCGkOWVOay8ffxY7867kOkOEA0JO\nXdEGLznA+Dy1H7r/3NuE3y0suO8OOwzuf39n87GPwZ57wjXXwKZNo/UsmSE3mfXm1JWcQjGOWW8Y\nQNzVrFfzuaYiSX/GOntZZomiJv1QYpPzubyGLpQOLb9Sn8d8FPO5NsCX+LOtojY3t/x33OQ+m6bP\nc7/zkvvC+pZu+pYWWMyb8LbBn8e/Ar/auuS20AiMpr5AejnSp+t616csO6yzPPtNIwxNj/nwnask\nRloazSa1MzRl0/YcNc0mvK5Ue+VIWE5FlShVV8I/OXsLOwCfZ/hD923qP4chMTvtNNi4ER7wALjz\nTjjiCHj5y53NPe85rGfYSfh8d+3SZ6u+HuOa9eYUipIZrfdzyaw3NaNtM+vVfB7m6ycD0p/+/gr9\nqZG3WnXFrxJ4/3WhinSVT+w+89cdO3g1RoZTPpe/r1J/NlXUpD/b3GdhHbw/c7srQ3I4TkWt5L6w\nvqWbvqUFSojaHsATgZMG/4Nb+vzN1qW3RYlalluOlDYaCdPSxZZHvc327elNACVkLkVGfPxZqBxq\nClaKwKQIVk39JJnTrtOX1ZQ4hjOTlFIn74PYfaFdp4f/PjaghD9ub6/NzGI2Yb4HHghnneVs3vMe\n2H9/p5aVIOwkfH5yUhKbGdfOeiVRGMesd+vW8llvakbbZtab83l4n2m+Ttk0UVe8P3ODmubzNsqJ\n/yxlk7rPlpaWnx0m/amR4ZTP/V+tP5uqK+GZZqn7LGcjfb59e97nud9nCQmTbVLi87m50SVG61u6\n61taoITqvRk4GHgosAX3rM+ftS65LeRArw2+sUE7pU6FNiky59PIsnIxV76OTeqjkTD/Awvz9SgJ\n3s8RUkmwwnQyH629JAnLEcdUe9WmCf1QoqJ6lKorPr9Yx63Z3P3usGEDXHwxPOc5cMghcP31zuas\ns+p+1GEnoZFFiM+ea2a9XkkKbcYx69XULWkTK7OrWW/O5/5+kR237Ow1m5DEhWXm1JUaX8VswnqW\n2KT8WXKf5XyukWH/nebzNv7M3Wdt1JWczdxcvYqa83kJCSshc036Detbmt+LLaCMUiO4G3Ax8HDg\neuAtwD+1LrktNAKT2xGokSefLhVzFX6WInMy79SSW2l9NILlyYlGPMKycmqZRnKmvetTpvFPTlhY\n0M9I09Jo6meJaunh6x8bUMIft7fXOu5994UzznA2b3kLHHkkvOAFw3IOavnI3LCTKFU6Sme9GhEJ\nbcYx6w1tFhZGz6WaxKy3ic+19orZpNqiibqS8nkbRU3zec19lvN5igxrPm/rz1Q+3qdN7rOczfx8\nvYqa83kJCSshcyV9gvUt3fUtLVBC1O4avN4GnAz8G3Bg65K7QIlaVrLrE+oUNQ+NIOQ2AUBeIYrF\nzO255/KytfrlyFzKJkYccyRMkrlUWbXEsS3ZjN0X2nV6zM8Pf9CpAcXn53+gxxzjyNgZZ7g4s/33\nhxtucDbnnjtaTluEnYRGFqFeMYnZpgbbLme9WpldzXo1ghDahPFnpT6XHbf/PGYjrzds91lT1HI+\nT91nOZ+nyLDmcy0/rW1jPo/lE15Dk/ssZzM3N3rdIeGfpKKmbQ4p/Q1b39K8b/EH27dACVF7Le6w\n2+cDNwLrgKtal9wW2qAN+UFb2kA+Rq2GzJUuxcbI3NxcPP5MEpgUecq1hWYj28Kny5EwWXasDUt2\nfd51F6xZU5cm5yutbXKKmhxs5Q993To4+WRnc9117qiMq4KfxcEHj+bbNcKOpItZr9bJxAb4mtl4\nzaxXK7OrWa82SMvOFUYHJjnQSxutLUKb1athjz3gvvd1m0P+7M+G+XbxXMSYz1OKmiSHTXyeus9y\nPtcG65TPtfxk+6d8Lom21m6191mpTa2vanxeSub8vZbzea7fsL6lvm/xpxK0QClRA/eEgqMblvMb\nwG/jlk9vHXy2B/AO4JeBZpQzp6h51CxHeqTOUUuRudKNCzEyF5btf2DSJkWeYsRII6maTc2uz/Cz\nLnZ9+rLWratPk2qLHKmWkMrJ0hIcfjgceig88IEuxmz9evjHf3Q2F1wwmsckEHYkklyUznq9kgR6\nJ9PVrHfXrtme9Uqfh2Xu3Dk60Mc67tWrhxONpz3NqeBveINbBg/vv9RAFZKJGnUlZqMNRrFzqUp9\nHuYb87nW/mGdNZ/FfK7lJ9s/5XPpT3mvN7nPSm2a+KqGhMXy0X5XKX+mfsPWtzTvWyZE1NbgjuPY\niDv8dg636/MPK8p5EyDXfn4HeBlNSZoctGNEpCTeC0YD/FMExm+xrj1HzSPMuyR4v0RFihGsFIGB\n+l2fHiXLrLndmeGTE2I2JWQz9dD4FKnW4hDBDbQnnuj+v/Za9394LEbb2LKu0IWiFhvUup71hipy\n2IGnZrRNZ705dSVmE95TYZnhvSRtVq1y98sZZ7hl71NOGS53v+Ql7vVAESni840921GSi9IBOWaj\nkZ6S+yPl81jdU22rDWrjVtQ8YQjzCXejen9Km9L7rMRmFhS1nM9jT06wvqV93zIhovb3wE9xz/m8\nkyFRawKf7lDgFOCPgu9+DfgTYF/gO7hNDLcCDwZ+OJKTNmjn4r1iRCQX4C/TbduWV9RyxFGSOR9/\nJgmWRvg0G+26atWysC1KiFCMzMnrDMvycRJh/Xz9ZT7a+5LlW80PMYVUpgO3TPXZz7r/f+mXRr+f\nFYQdSdNZb2g7zllveKaW7OBiM9qms145IPjOe24ubePvKTkw+XtpaWmoll16Keyzjzvfbt99l9/X\nhx+e95uf8MUGqlzbtlHUSu+PlM9TZ2rF2lYb1HI+j+VXYuM/lyQ1PCMt7Nea3Geazfz88LuDDoo/\naD7lqxoSFn7ny0r9zmP+TP2GrW9p3rdMiKgdDjykdUkOfkT+I+C/A/PAx4HrBnW5Grgn8Gzgy8AZ\nwNZobjXB+/4HmVuOlPmGZfl0nqjlltO0fHbuHJ2N5nYxSptSgtUkeL9m12eKzGnXcdddw2VNma92\nXdr7XFvE/JBbvu0jYp1g7axXEr7UrDfs2GpmvVLFKJnRxmxkpxjaxGa9/l7QBhJp49MtLbmB7253\ncwTt+OPh3e92Nn/+5+71kEOa+W1paTQEQhusY22bUmn8PT1ORU1OfmsVtZg/pU0svxKb0OdhmeEZ\naTGbUnUlrPviootVnZuDK690MaznnAM//zlccYV+DV0oauF1xPLJ+VxOmpsqc9a3jN5LEyJqH8Op\nXze3KOcSYH/g94AbgDuArwKX485l2wW8HngB8EVgT9ySaJykyUE7RkRqzlGLET6Z7s47l6fxKFlm\n3b59+aOOmhyHEV53zKaEzEH+EFrtOrXPand9anlo154j3jlCGiOW3kbm3SfEOkHfSfjZXmjjv/NB\n7LWzXtlJaTNQ75vYDLTtrFfmF9qkyvRtJgeSxUX359WIhz8cDjjALXvvu69Tu/0jvI4+ur3fckpH\nanYfU1e8PzVbORhpZaZ8rtn4A0RrfK4NyNrALNugC5/H7jNvE5Zfci8uLTlFdX7eLXtfcYX77pvf\ndHaPeMTQ32HanD/D326poqYRGY1cpHy+dWv83rG+pV3f4tuyBVKj1JcGrwvAE4BvMyROu3DkLYXL\ngcsGthfizl8Dt5T6ROAQ4N44ZW3QapyC21m6iQwxvPqTn4SvfQ1uvZXNJ53E5gc9qP05auFnTY7w\nkDZaPm2C90ObEoIl48+aBOKniKOs8x57DN+HO1c9NLVM+kojgLVEUlvuzsXQ9RE5RU12NtpgJDvK\nsAOKzXpjNnNzw8+0enU169Vm2rEOOzbr9R3o8cfD7bfDUUfBe9/rbK67zr2Gm1q6hNahQ52ipg0e\nsm3Hqajl7jOt/eV9VuLzFCmR5DTl81iZYR+Wqhe4Z+4uLcEzn+liVh/0oKFPL7oo7u/wmmL+jPlK\ns0mR16aKWuo+s76lUd+y5Wc/Y8tPfuL6lcsvH/YrDZAiahcxjCmbS9jFcN3gL8QjgX8G/gN4FHAv\n4LxBOW/BEbSvDOy+l8r86rPOcrvvPvxh96OJEZGSc9RyR2Zo6WLLaZqNJzDQLni/CcFKkZwSUujT\nxNorzGevvUavwZerEb4SRS1sr1h9cupi6lw8mXefIGeictYbdjZylipfYbSTajLr1crUOrqYuqLN\nolP1CtWH2Kx3YWE48Jx3nluuvOoqt3N3/Xq3PAXuqRGTQE7pSLVFTukI21/GK2k+b6qo5e6zpj4P\nB8eYP0PblE3YR8TK9DaSaOy1l1uy2rTJETOA737X2f1q5aOuY0QkbNs2MWoawdJ+lyU+b3KfWd/i\n8hJ9y+b169n89Kf/121wzZiI2o+Ap+CC+m/GLU1ub1wSrAKeCvjobP+w98fjiNpqYBvugN1bgBfh\n4tf+Xs1NkpwYEWm667N0U4JGllL5tAneLyFP0iZF5jSbsE3DOms2qfrESFiqbO3aS+L1UuqiRiy1\nOvcRMRUjN+vVZr/Qzaw39EtqBirLTM1oU/Xyr749fOe5tARHHw33upcL6L7pJmfzmte41/33H59f\ncpB1Tw2yMZsSn49LUSu5z5r6XCodsfykz3NKR6xMb7P//i4O8YlPhNNPd5uIdu1y99Illwzzaepv\nf00xf8aUsLCOfVDUrG8ZS9+SImrX40jTP+GWLk8CntWirLtwOzi1cjwGJ4jyBeCoZG4aOcmdoybJ\nnUc4kPvAv5K4J0lOwvizGHFsE7xfQp5CmzYPQZc24SG0MUUtdp3SD1r9QpsaMudtwqc2aPeBKWr6\nzLGLWa9PK1WMSc16fZn3uY876+7Zz4a1a92xGGee6b477bTx+aEWcmAoVdTCw3FLfe5faxS1sA6a\nTcl9ptm08bl2D8GoTbh7UQ6y3mbtWth7b7dJxCse3/iGUyAf9aj2/pVoo6ilCJb8PcTySdlo7R+S\nIutbnN2U+5bUKHV3hsTpdcCnx16bWpSoZbHlyNig7Z8nmdr1GZadIicxBStGJJvapAhWqj4awQK9\nzuFuzV27HKH18WeS8GnXoBHH2K7PGJEssYkR+NgysGznPmHSitrc3HApILQJz2AKVYxxznqPOMKF\nPKxfDx/4gLN77Wsn0+5tIQcGjRDFFIUan2vfyfZPnaklyWHNfSavodbn2gAs2wJGbcIQFm+z115u\nIvfYx7rA/w0bXD+/ahU86UnOJjxepWvEiEjY/hp5yhGsHJnz6XNn3rW9z6xvGTtSRG175P/ZQDjY\nhs5pu+tz27Y84QvTyPgzrewUMepCUUsRrBSBkTZQdgCvbPPwszBNioRpZWukq0mMWtgW27cP32uk\nVebdJ5SoGF3NemMz2qUlXcXIzXrDATk16/Ud+MknuxntU57iBpojjhjOZM8+ezLt3RWaKmpNlSv5\nXU5d8f7UBrXS+yxWdliv2HXWnHknbZaWnOJx1FEugBvg5psdWXv0o8fjzxxi5BPi8Wc5ElajqOXO\nvGt6n1nfMjGkRqlTgNuD93sE73cBe4+rUkXQCMw4d33G4s+ksqOVnVJ/tPrU7gzVrr2EzHkbP5ss\nJYVtYsti+YY2si3Wrl1eVg3Z3L595Z6jJtWVNrPeWhVDW46QNlqnPjfnAnJPOsl99qEPOdvXvW4y\nbToJyMFIDsQxBaBU6dD8GbNJnaklSUWNuhL6s1bp8L/Jkntxzz3d38Me5gL/TzgBLr7Y9RlXXOFs\nwk1O00CM0MDwOsapqMnxr2tFzfqWsSNF1BYS380GStSyrnZ9yvPPIL3cFyMDtcuRYfmxfFIEK0fm\n5CG0Wh1LNwrINClFLZVPqi1yNrIttm5deeeoxc4xKlU6ama9pUqHLBOG6Y47znWgj3uQj5IVAAAg\nAElEQVSc+/zYY+HVr3b/n3fe+Ntx0tAUNbnEGLaX/ytVOmoUNe+L0OfhmVpN1RU5oJfci2GbwOi9\nuGaNI2UHHwxPfrKz+cQnYL/94DGPGbbvLE6+wuvzf5qyNg5FTapIvn1Tv3PrW2YK/R2lpEKkkQw5\naMdImM8nRfhScW0xmzDf0KZGLYvZlB5UmyJzWhoff5YiVDElrITMpfLx15UqW7uu3K5PWT9/nStB\nUcupGP51bm70XKrSWW+JjX9/wAEuiBvgxhudmtuX2LKuIAesmEJRqlzlfB5T1MIlxq7UFc3nsl4x\nG6morV7tQkse/GA45hg49VR4yEMcWbvqKmez337j91cXSJELiCtqGpmLqVOhjdamMV819bn1LRND\nf4ka1O/69EgpamEa7bmUsTQaqdBsas9RKyGO2rX7ssJDaLW8tWsIlUONgJYG+GtkThKscFlTtrNM\nE6arUSlX8jlqpbPemIrRdtZ75JFOAbnHPdwTPU44Ad76Vmdz4YWTa6tZgqZ0hJNNSYBq1a1SRa3U\n5zVlppQOr8iE5NDbrFrlFLN99oHf+i2X1wc/6GKH/OALnZzyPhVoPk+pZVr7x2IYaxQ1zZ9tfW59\ny9jR31FKEpgYEQlt/I5OjXRpilrquZSgnyWWIwNNgvdl3jKfmOq2bdvy+IzS+DOt7BjZjKXTyFyT\nXZ+yLXJ1lvdBjFRrT07oG7qc9fq2aTPr3Xdf13kCXH+92zXlzxYyDFGqdJTaxJSrlK9rfD6O+8wT\ns/vdzy1NnX22O3h49Wp40YuczaGHjt8Xk4Lmc0lw/WuNoibbfxYVNetbWqPfRA3K488WF90rjJIn\nf9SEn+nVLEdKAqMRhhQxmrVdn7nlSC2NTJcic6l8tHYuXWbVSHRI4GOk2n/fR0xi1uvTajPagw5y\nyw33vrcbZI8+Gt73PmdTe3r7SkKp0lFqE1NXtO9kvtCtoqbdZ0tLw/iyJzzB2b397W5n5qmnDtvl\noIPG2+7TRBcqql/hyfkc+qGo+bTWt2TRX6IGdfFnS0vuu9xypEzjURujFtavVP0JyypRy/whtL6s\n1PKjz0eLPytRsHJKmKaWpZY1UySshMyl2kvmU7JM3UeUqitzc6NBwKWzXn+O0V57uWUGgJe9zHWk\nr3rVdK6775iEouYnnvK7nTvrFbWQTOTUlcVF9/3q1W6QXbsWzjvP7chcXBw+73DDhsm19ywg53NJ\npksVNXmUikbSx3mfWd8yEfSXqEkCo6lKmo0nT/6mT6llKQID6eU+TXXzNhqZK1WIwnzkIbS5XZ9y\n52qMYKXIU4rMaYpVzmZcipq3CdvGP70glqZvKFVXQt+Vznr32ccFap98sov9OPxw+PjHnc2v//rk\nr3V3wiQUNelP/52/77uKHVpcdKRsYQEuvdR9/8Y3OgUkDCvwy1YrFW0UNUnUQp/7Pj8kSFCnqHV1\nn1nfMjb0d6TSiFnNQbWh2tNmOTKlTvn6pRS1EtWtq12ftbFvWn20NDJdTLGahKLm4ePPwraJkeq+\nonTWG85opc3SkiOwBxzgbK6+2h34+IpXDMsJg7kN7TEJpSOmYoR9YamiFtosLjrCcPLJThE55xwX\nKzQ/D29+s7O1+2UUbRS1kDSFtl6VSilqmj/HdZ9Z3zI29JeoQf4cNRg+u9PfeBoxahO8nyInbXZ9\nymdrNtn1WbJkWWojiWTJIbQl+dQqahpJ3blz1CYkaTGiu1IVtb32crPas892DxA+8ED44hedjY8h\nMowPITHyf6VKRziw16gY/tXf9yWK2sLCUMX5lV9xytkrXgEbNy7fEX/ccRNptl6jC0Vtfn7U576/\njClqmkIau89y96L1LVNDf0eqlFpWok6VqGUly5EpBavNrk95mnYJcczFzOU2AaRs2ipqJcqcRmRj\napkku7KsEn/uLopa2MHKWe/q1a7DBPdA4WOOcbvqfJpjj3Xf9Xn3a9+gKSalSkc4CWmiqElSFtos\nLLjPTjjBDbCnnz48h+ptb3OvJ5ww2bbaXdBWUfPvcz6X91CNoqbdi9a3zAT6TdRgONjv2BGPP0st\nR/o8ckuNtYpaWL82pLCEaPj38skJJcdhjPNB6allzZSSGX6mqWUwmk6WVUJI+66ohZ2s7zzXrnUk\n/4wz3H2zfj38y784e/8AasN00SZ2qGlckFTLQpsHPcjFu157rQvy97GvAKecMrl22Z3RVlEr9bm8\nh2oUNVmm9S0zg36PVLEz0nzQOJQtR5YG72tLjSlyElPUwmVNLe9S5atmqVHLN0awwvaT6VJkTraX\nLKuEFJaoZTCcpa1kRW1pyZ0vBHDZZW4J6uqrh53u0Ue778LdwYbpoyYuKKauhPnUKGpHH+1+D5s2\nwetf72xuuMG9bto02XZYSehCUYO8z0PiV6uohTbWt8wU+kvU5uaWx5+FalmJOlWilsXUH00tg1Gb\nWIxaOGPtUlFLqVMplatmOVJLI9NpaplWvj8qILSB0XaWdQ5njppN2LGlyHDfFbU1a+Cb33T/X375\ndOtiKEdMxWirqEkFBdwRGevXw/Of73Ze+sEX4D73mex1r2TkFDW/GqKpWl2qqLH7bI89nGJ2j3vA\nJZdY3zJj6O9IpZGT3IGuMYKVU9SaLFmG+dSQQq3OuTPStGtoumTZ5Tlqsi1CYhYjYdpnMbUsZiPz\n2F0VNRiNZTTMPlKK2tzcaFB3qbpyyCFO+Tj2WHjd65zNu9/tXm0Jc7pI+dz7VfpTnpEW5lMSc5hS\n1Natc+Twkktc3OGZZ7rv16wZBv1b3zIz6C9Rg2bkKbfrs4Q8+Xw0G7lbU1PdakghOOXQd95afVIk\nTBLScFmzlGB1qZaVLGumyFzYIZXYlBJdg2FSSClq4X2bU9ROOskpZFdc4UjaIYcMn3H4wAdO59oM\nOlI+j6ll8ow0zUaLOZTkbc0a9//xx8OjH+1sv/Md99nTnz6V5jDUob8jlab0QH7Jsotdn6ll1vAQ\nWm9Tu8xaqmDliIfWFuvXx238+xLCV6uWacRMvi8hcyX5ys4P0o/XMhgmiZy6Etr414MPdoH+hx8+\nVMve+173euCB07kOQzlSPo+pZfKMNM1GU9T23NP9//CHw4knwgMe4MaZdevgmc90Nn63pqEX6D9R\nSy1xQX450tukYq6kTQnB8vXJkUJfn1idS5YjtWsoUctKSaGsTxO1zEPaSN/InavSRipqmo0se3c9\nR83QT5Qoahs2uNPbn/QkN6hu2ADnn+++86qZoT9ooqj5vjmlqPmH22/cCI98pLP56lfdZ894xlQu\n1dA9+j1S5ZYsUwpWE0VN7nApeQh603PUcmRTS1NyCG0uRk0jrf6ZbN4GytSylE1OCevKJuVPU9QM\n04AkZvvvD4cd5oiZV8tuusm9rvRHL+0uaKKoSVIGjpitXg0XXODUsgc/2PVt++4Lz3uesznssOlc\no2Fs6C9Riy33lS5ZNlHLfHBlzEZ76kCOFG7fvjz+rIQ8xZQwTRUsiT8L04UPbQ+vI6VYeZTEn8l8\nauPPSvKVsT6we+76NPQTBx3kSNmll7o+5YQT4Nxz3XcXXzzduhnGg5KYQ0nMfHzZ4YfDwx7mbD79\naXfyv6llKwr9Hqlqd1BCN+eolao0Jcd85MhTyXKkrJ9mEyN8ITFLEawaRS1GsMLPSlQ4j5SiptnI\nfExRM8wS3ve+adfAMGmU7OJdXHRq2f3u59Sy446DO+5wz8q89lpn488vM6wozOdNOsFTgC8DG4LP\n1gHNe6ySeK/UsmZtgH/p80BTZC6WJrUcqdnIz0pUN4irZanlSI8mapm0kcqhTDMuRc12fRoMhmlC\nKmqLi24Z88ADhzGH//APcOihLuD/jDNg773dJhLDisekRqpXA/J0xecCL26cY1MFC/RAfLms2cUh\ntE13dHa16zOnlnnkliO1dClVq4SEyTTeplZRy9VPI/BgiprBYJgc/APu73Uvp5adeiqcd55bxrzu\nOmdz4onTraNhZjEpRc1j1+D1SOB44B+D754D/B/gR8Dnga3Ap0iRyVIFS5K51DlqWt4yn1KVRp5/\nVhq832TXZxjw722g2ZJl7Y7OEptY2W3UslTetuvTYDDMCt7xDncQ8TOeAfe/v1PLjjpq2rUy9AST\nHqkGIy/XAH8M/B5wD+CFwA7gpYPXlwNfA86M55RQyyQRSh1CW6OWlcSx1Qbvb9uWPoRWXpOHppa1\nJUKp2LKa+DPtfRNFrYbw2a5Pg8Ewqzj11GnXwNBjTIqoXQLsjyNm7wRuH/z9NXAI8GTgt4E3Am8C\nTgC+nsrw6g9/GL79bdi2jc1btrDZ75rSBuRwWRPan5GWimMr2a0p04SH0Go2pWpZigiVkDDtfZv4\ns1pFrYlalqtfyuemqBkMBoNhDNiyZQtbtmzpJK9xjlSXA5fhljsvBN4y+PxG4DeA/xy8/yPgZYP/\nTwFuBs7HLX9GcfV558EHPuAI0+bNwy9yA3IbtaxWpYnFluXKLj23rCS2bBKKWhuC1UYt0+qn2Zii\nZjAYDIYJYvPmzWwOuMk111zTOK9xxqhdB5wGnA782+Czi4EtDEnatTiF7WYcaVwP/AQ4Bvh+MveS\npcWmAf4luz537HCv8vmbtbFvMbUsRbDkZ00VtVi6ruLPSgjWJHZ9gilqBoPBYOglJjlSrcIpbL80\neH8O7tiOhwBnA3+Fi0sDR9xeA3wOt6FgFHJZ06PkENqmalnJsmZut2ZOLfOoCfD3SClqJbs+26h3\nTQlWzW5Sn65k+dYUNYPBYDDsBpgkUbsLR8o8PgbsI2w8iXsfkN8Sk1ta9DY1R3jE8m5yCG0TtazN\ncmTbpcVYmlz8WZPlyJIl1C5sSlRUg8FgMBhmFJM+nqM7aAQrpnzVqmUlcWzaQC/TQLN4r9BGptHS\nlezELFHUtPcl8We5+qXymcSuT8gfPGwwGAwGwwyi30StSYyat0mpZTt2wM6do/FnoY18Xmgbtazp\ncmQJmeviHLXa+LMmZFOz8WhLHEtVVIPBYDAYZgz9JWpQ/vil2l2f/ntPJiQxaxq8L208akmOTFcT\nW9ZEmWuqlkmbLghfrU2pQmowGAwGwwyiv0Stq12fWpqYWlZzLljJJoAamyaxZZqNbK+5Ofd4Ey2N\n/74LsllK5ia569MUNYPBYDDMOPpL1KCZogaj6ookZlCmYHUVvD+tXZ+TDPCP1W+Suz5jsYsGg8Fg\nMMwo+jtSpXZe5hS1XbviuxhrYsK6Ct6vJTkyXRvi2JZs+s9KCFbXOzpLbDwR1565aoqawWAwGGYc\n/VXUYoNtbtcnLI8/8+hqybJJ8H6TAP9cfUquS5atfdYkeD92XU2P8GgS05c7isMUNYPBYDD0AP0l\napBX1DzaDPRaPl0H73e161PahPFnNepU33d9SpuS8/YMBoPBYJhB9JeoaaQsF4jfVYC/x6zt+myy\nHNmWbPrPand91tSnzcYFjZSlfGMwGAwGwwyh30QN9MFWqkhdqWU1ilpXpLBpfXL5ajaxdOMgm20I\nn8xnbm75mXdhmhrCbDAYDAbDjKG/RM1DIxWx+LNYmpyNzKdN8H5oU0Iimip8pUuWXR+HEaL2HDUt\njVZ+zldafUxRMxgMBkMP0V+iNq6Yq6YxYfKzkvgzjya7Pmvjz7R8prUcmUrXhDhqRM0UNYPBYDDs\nBug/Uet6ea3tkuWkdn3O+nKktCmpT1PiWNIWpqgZDAaDoYfoL1HzaDJo92HXZ9v4s2kvR2o2TdQy\nGX+WW9aU9alRSA0Gg8FgmDH0l6g1jbnK2TSNCZOf1Sy5NSF8s74cqeXTRC1rsnwbpqtZgjYYDAaD\nYcbQf6LW9fJa2yXLLhS1ruLPprkcKW20NLk6a/XVrquEhJmiZjAYDIYeor9EzaPJoD2OXZ8yXdNN\nCX1YjtTKH9cya2pZU0sj09UopAaDwWAwzBj6S9RKltfGpah5pBS1kiW3vi5HShstXy0fjXSl4s+a\nkE2ZrmYJ2mAwGAyGGUP/iVqT3X1NA/wndY7arC9H5mxKr6tELcvZlLSFfG+KmsFgMBh6gv4SNY9p\nKESpgb6EzPn4s1j9Zn05Uiu/yTJrra+0fLT65hQ1i1EzGAwGQ0/QX6I2LoWoJqYppailVCX/3Swu\nR2rpxrXMWqKW2a5Pg8FgMKxg9JeoeYxDIZI2Hl3s+pz15chcnWN1lPnMzeWVw9qjS3y6nKKmpTNF\nzWAwGAw9xKSI2iuBLwNvCj5bC9wEzDXKcRoKUYlKkyNzs74cKfPW0mjllxCs2hi1cSlqFqNmMBgM\nhp5gUkTtacBZwMbgs+cCLwZ2NcpxGoH4JWXJ889meTlSe6+lq1W+YiSsiVqWsyldyrZdnwaDwWDo\nISZF1A4CPgV8dfD+SOAE4B8Cm18DvgX8BPg8cDtOhTs0mfM4FCJpIz9LEUD/nccsLUdqNrVqWVNF\nrSRNiY127bXLo6aoGQwGg6EnmBRRuxtwEnAcsD/wh8DzccueHwcej1sKvRp4I3AacCtwBvBDNcdx\nBuI3UdS0ush8tTRa2SUxV9Pe9Snjz8ahqDVZvpXpbNenwWAwGHqMSRG1ZwNfBL6CI2v/CXwD+E3g\nYNzy5+uBowd2ewI7ga3RHKcRiJ9T1LpSp5oSySabJpqoWlI5LCVYTdSykji2ko0ftuvTYDAYDD3E\nOEeqy4HLcCTsQuDfBp+/G7gU2Bc4F/hjhhsKTgFuBDYBN6cyv/rd73b/vOlNbN6+nc2bNzePp8rZ\neOSev9nVsRrjUMva1KcrgtV2+TZWvny/ahWsWZO+Bi2dwWAwGAwdYMuWLWzZsqWTvMZJ1K4b/IW4\nBLfT86c48rYVeAyOzP0VjqB9BXgk8L1U5ldfdBG85z3w1KfCGWe4D8cVcxWLP2sSB9UFwdLSlNp0\noS62XY7U0mg2JfXTSNmWLXDYYcM8tLJkPgaDwWAwdITNmzc7AWmAa665pnFekxyp9gAehyNoAO8d\n/D0eR9T2ALYBdwG3AC/Cxa/9vZrbpAPxu1iOnLSillq+jaWB5fFn41iOjNmUxLEtLS0nZhddBOee\nu9zGk7RYPqaoGQwGg6EnmCRRuwN4qPL59cH/Jw9evwAcVZTrOALxpU1Jmqa7GDWbLuLPmsSJlSiH\nTZcjm6hli4ujatmNN8KGDcP3a9aM2shytWuQZRkMBoPBMIPo70jVtaqVI0vjXI6c5DlqOdLVBcFq\nqpYtLsLq1cP3F1wAp5223GbjxtGyU4i1zdzc6M5Vg8FgMBhmDP0nal0cW7GwkN7F2DTfnE3XalmT\nI0a6WI7UrivXFgsLLr4sxJvfDHe72/D9mjVw5JGj+TRBSfsZDAaDwTBj6P9oVUtgYDw7KLU0pfXr\nSi0rua5U/FnT5VvtuuR7SczOPReOPnq5zfHHj5bdFjVtYzAYDAbDjKG/RK1LAtOFQjTO5cicTaky\nlzv/TKtvk12f8/Oj+V53HRx33PD96tXL348LJW1jMBgMBsOMov+jVZPlvi4UoqbHVjRZjiypc86m\nS7VM2khidtZZjpiF2LRptOxJwhQ1g8FgMPQQ/SVqpQRmft79xWxKCVYtgakhWF2oZbl8ZBqtPqVq\nmbR58YuXx5atWgUnn8xMoEa1NBgMBoNhxtDf0aqUwHR18Oq4liNL6pyz8fnIXYxdHEIridmpp8Kr\nXrXc5pRTRus7KyhRLQ0Gg8FgmFH0l6h5dHGK/qTOBRvnrk8t/qyLQ2hf8AI45pjl9ve5z2g+sw5T\n1AwGg8HQQ/R3tCo5/wymdy7YpHd9dkE2TzxxVC2T55j1FRajZjAYDIYeot9ETcafwfTOBZv2rs8m\nZPN3fmf5OWWLixA8m2y3QYnPDQaDwWCYQfR7tBrHcmTss1nf9Zmr34YNozsx/cPsVwJMUTMYDAZD\nD9FfotalWla7HBlLN65dn/LJCSX5PuUpcOihy+0vvHC07JUAU9QMBoPB0FP0d7Qa57lgXaplXez6\nzJHNgw+GV75yuc2ZZ47WdyXDFDWDwWAw9BD9JWownuXI2GfT3PUpv3/c42C//YbvFxbg4otHyzY4\nlN4XBoPBYDDMGPo7WnV5RlrtcmQs71pFLZYuTLP33vCKVyy37+PxGNNEyX1hMBgMBsMMot9Erasz\n0nKKWgkpbKqoyfiziy+GtWuH7+fn4fGPH83XUAdT1AwGg8HQQ/R7tGqiqEG9oibTxNLVEsdVq+Dl\nL19uf9ZZo3kY2qGUVBsMBoPBMGPoL1ErUcvGqajJdCWq24UXjj494KlPHc3X0C1s16fBYDAYeor+\njlZNyVOJTVfHfLz4xcttTC2bHkxRMxgMBkMP0V+iBrN1jtoDHwh33LHc5jnPSdffMBmUPmnCYDAY\nDIYZQ3+J2rTPUbvySli3bvje1LLZheY/W/o0GAwGQw/Q79FqUueonXMOHHfccpsrr2xWZ8N0YIqa\nwWAwGHqI/hK1cZ6jdvnlyw+UtVP++w3N56aoGQwGg6EH6O9o1dU5aqefDvvss9zmmmu6q6dh+tDI\nuClqBoPBYOgB5qddgVZoopZdeql7NqbHve8Nj3nM+OpoGMGWLVsmX6gpap1gKr4zdAbzX39hvlu5\nmCWidiLwReBO4PPAD4BbgYtU6xK1bNMmOP/85TZ/8ifLT/43TBwT73Bs12dnsMGi3zD/9Rfmu5WL\nWZIVDgaeDbwIOAN4NfB24EOqtTbYPuIRcNhhw/enn+7+DCsbktTvv//yg4cNBoPBYJhRzBJR+whw\nLnDz4P2pwPOi1scdB5s3L//sT/90PDUz9BtHHAF77jl8f9ll06uLwWAwGAwVmAVZ4XLAj5x/B/wM\neCnwNeCESJpvAseOv2oGg8FgMBgMrfGvwN2mXYku8HrgQcAhwCemXBeDwWAwGAyGqWKWNhMAnIJb\n+vwpsA74H9OtjsFgMBgMBoPBYDAYDAaDwdBzPBS4BfgG8Nwp18Wg4w3Aj4AvBZ/tB3wQ+DrwASA8\nYfgPcP68BbhgQnU06DgS+DDwFeDLwDMHn5v/+oE1wCeBLwD/Arxw8Ln5rz9YwB1P9a7Be/Ndf/Ad\n3Irg54FPDT5bcf5bwG0i2Ags4Tqju0+zQgYV9wdOYzlRexHwe4P/nwtcO/j/JJwfl3B+/Saztxy/\nknAIcM/B/+twG3rujvmvT/Dbmxdxcb73w/zXJzwb+GvgxsF7811/8G0cMQux4vx3NnBT8P73B3+G\n2cNGlhO1W3Dn5IEjA7cM/v8DliujNwFnjbtyhmK8Ezgf818fsSfwaWAT5r++4AjcuaEPZKiome/6\ng28D+4vPOvFfnxjc4cB3g/ffG3xmmH0cjFsOZfDqb9zDcH70MJ/ODjbilNFPYv7rE+ZxM/UfMVzG\nNv/1Ay8FfhfYGXxmvusPduGI9mcYHjnWif9m6cDbHHZNuwKGTrCLtC/Nz9PHOuAdwLOA28V35r/Z\nxk7c8vV64P04dSaE+W828cvAj3HxTZsjNua72cZ9gR8CB+Li0m4R3zf2X58Ute/jgp09jmQ5IzXM\nLn6Ek30BDsV1SDDq0yMGnxmmhyUcSXszbukTzH99xG3Ae3CP4zP/zT7OAR6GWz57K3Ae7jdovusP\nfjh4/XfgBuBMVqD/FnEn+24EVmGbCWYZGxndTODX43+f0YDKVcDROP/OwtMyVirmgL/ELcGEMP/1\nAwcw3FW2B/BR3AHi5r9+4VyGMWrmu35gT2Cvwf9rgX/G7eRckf77b7idaN/EBeMZZg9vBX4A3IWL\nKXwCbifMh9C3KF+J8+ctwEMmWlODxP1wS2dfwC3BfB53JI75rx84Gfgczn834+KdwPzXN5zLcNen\n+a4fOBr3u/sC7mgjz0/MfwaDwWAwGAwGg8FgMBgMBoPBYDAYDAaDwWAwGAwGg8FgMBgMBoPBYDAY\nDAaDwWAwGAwGg8FgMBgMBoPBYDDsvtjB8My2zwNHTbc6neJk4A2D/38DeLn4fgvuyQEx/C/c+UwG\ng2EFo0/P+jQYDLsffoF7+LsGf1J3X59h+LsMyZl2Dbln/70WuAJ4Zsf1MhgMPUKfnvVpMBh2f2zE\nPX3ketxjyI7EEZ5PAV8Erg5snzew/d/AW4DnDD7fwlCpOgD3/ESABeDFQV5PGny+eZDmbcBXgb8K\nyrg37nEwXwA+gXtg/UeAUwObf8KpZyFWA2cBn85c7xxwEUNF8WvAt4LruDCT3mAwGAwGg2Fs2M6Q\npLwD2IBbDj1z8P0FwGsG/8/jnoF4fxwRuxlYg3vG3jeAZw/sPgycPvg/JGpPwpE7cETq0zhiuBn4\nKXAYjjh9DPeQ7FW4Z/B50rcOR/Yex/B5qMejk7GzGD6vEdzS549Zvsx7e1BPj78Fnhq8/wj2TGOD\nYUXDlj4NBsM0cQfLlz43ArfiVC9wRO0CHLEB98Dj43Dk7O+AOwd/N5LHBTjl6+LB+72BuwHbBuX9\nYPD5F3CxYbcDPwQ+O/j8Z4PXtwNX4ZS+3wTeqJS1YZDWYxfwNyxfxvywSPN7uKXgVwWf/QDXJl/N\nXJvBYNhNYUTNYDDMGn4u3r8Q+Avx2bMYxrAh/t/OMKxjjUj3dOCD4rPNwNbg/Q5c3xiLH/vFII9H\nAI9iVBVjkHZOfCbfhzgf+FXgAUqanYl0BoNhN4fFqBkMhlnG+3Gq1drB+8OBA4GP4oiSX/r85SDN\nd4B7Df6/OPj8/cDlDCeoxwN7RsrdhYsXOzTIay/c0ifA64A/xylxtynpbwUOCd6nSNoG4JXAo1lO\nGBmUf2sircFg2M1hiprBYJgmYrshPT6Ii9H6+OD97cCluKXQv8VtCvgxLk7Mk6GX4I62eBLwniC/\n1+GWET83sP0x8CvEd19uAx6D27m5B05JezBO8fscjqBpy54M6nWCuCatjDng8cB+wDsHn30fRzyX\ngCOAWyJlGAwGg8FgMPQCL2C463MSOAynuKXwJuA+Lcq4APifLdIbDIbdALb0aTAYdhdM6ry1x+GO\n6rgyY/cS4CktyvkthrtLDQaDwWAwGAwGg8FgMBgMBoPBYDAYDAaDwWAwGAwGg04iSOcAAAAnSURB\nVMFgMBgMBoPBYDAYDAaDwWAwGAwGg8FgMBgMBoPBYDAsx/8HXhfDWrHWklMAAAAASUVORK5CYII=\n", + "text": [ + "" + ] + } + ], + "prompt_number": 50 + }, + { + "cell_type": "heading", + "level": 3, + "metadata": {}, + "source": [ + "Group delay" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "ph = pylab.angle(resp)\n", + "\n", + "# heuristic \"de-modulo\" operation\n", + "for i in range(1,ph.size):\n", + " phdiff = ph[i - 1] - ph[i]\n", + " if(phdiff > pylab.pi):\n", + " ph[i:ph.size] += pylab.pi\n", + " elif(phdiff < pylab.pi):\n", + " ph[i:ph.size] -= pylab.pi\n", + "\n", + "ph /= -freq * 2 * pylab.pi\n", + "\n", + "plt.plot(freq, ph)" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "metadata": {}, + "output_type": "pyout", + "prompt_number": 52, + "text": [ + "[]" + ] + }, + { + "metadata": {}, + "output_type": "display_data", + "png": "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\nSZIkSZJajv8P2SWlGiTDH8MAAAAASUVORK5CYII=\n", + "text": [ + "" + ] + } + ], + "prompt_number": 52 + }, + { + "cell_type": "heading", + "level": 3, + "metadata": {}, + "source": [ + "Logarithmic Bode plot" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "freq = pylab.logspace(-1, pylab.log10(nyquist_freq), bode_points)\n", + "resp = respfunc(freq)\n", + "\n", + "fig, axes = plt.subplots(nrows=2, ncols=1, figsize=(10,10), dpi=100)\n", + "\n", + "axes[0].plot(freq, 10 * pylab.log10(abs(resp)), 'r')\n", + "axes[0].set_xlabel('Frequency (Hz)')\n", + "axes[0].set_xscale('log')\n", + "axes[0].set_ylabel('Magnitude (dB)')\n", + "\n", + "axes[1].plot(freq, pylab.angle(resp), 'r')\n", + "axes[1].set_xlabel('Frequency (Hz)')\n", + "axes[1].set_xscale('log')\n", + "axes[1].set_ylabel('Phase (radians)')\n", + "axes[1].set_ylim([-pylab.pi,pylab.pi])\n", + "axes[1].set_yticks(pylab.linspace(-pylab.pi, pylab.pi, 9))\n", + "axes[1].set_yticklabels(['-\u03c0', '-\u00be\u03c0', '-\u00bd\u03c0', '-\u00bc\u03c0', '0', '\u00bc\u03c0', '\u00bd\u03c0', '\u00be\u03c0', '\u03c0'])\n", + "\n", + "None" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "metadata": {}, + "output_type": "display_data", + "png": "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\ngg==\n", + "text": [ + "" + ] + } + ], + "prompt_number": 40 + }, + { + "cell_type": "heading", + "level": 3, + "metadata": {}, + "source": [ + "Impulse response" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "fi2 = fir.Filter(fi)\n", + "acausal = int(npoints / 2)\n", + "steady = 10\n", + "x = pylab.hstack([pylab.zeros(npoints + steady), 1, pylab.zeros(npoints + steady)])\n", + "t = pylab.linspace(0, x.size/sample_rate, x.size)\n", + "\n", + "y = np.array(x.size, dtype=np.double)\n", + "y.resize(x.size)\n", + "for i in range(0, y.size):\n", + " y[i] = fi2.f(x[i])\n", + "\n", + "fig, axes = plt.subplots(figsize=(10,6), dpi=100)\n", + "axes.plot(t, x)\n", + "axes.plot(t - acausal/sample_rate, y, 'r')\n", + "axes.set_xlabel('Time (s)')" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "metadata": {}, + "output_type": "pyout", + "prompt_number": 34, + "text": [ + "" + ] + }, + { + "metadata": {}, + "output_type": "display_data", + "png": "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\n", + "text": [ + "" + ] + } + ], + "prompt_number": 34 + }, + { + "cell_type": "heading", + "level": 3, + "metadata": {}, + "source": [ + "Step response" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "fi2 = fir.Filter(fi)\n", + "acausal = int(npoints / 2)\n", + "steady = 10\n", + "x = pylab.hstack([pylab.zeros(npoints + steady), 1, pylab.ones(npoints + steady)])\n", + "t = pylab.linspace(0, x.size/sample_rate, x.size)\n", + "\n", + "y = np.array(x.size, dtype=np.double)\n", + "y.resize(x.size)\n", + "for i in range(0, y.size):\n", + " y[i] = fi2.f(x[i])\n", + "\n", + "fig, axes = plt.subplots(figsize=(10,6), dpi=100)\n", + "axes.plot(t, x)\n", + "axes.plot(t - acausal/sample_rate, y, 'r')\n", + "axes.set_xlabel('Time (s)')" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "metadata": {}, + "output_type": "pyout", + "prompt_number": 35, + "text": [ + "" + ] + }, + { + "metadata": {}, + "output_type": "display_data", + "png": "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\nfSsrcgqczyWlZrDizw8AG4H3A7uB7wO3AI917HM08OfALwG7gMUVjylJ/a0o7OmSElS16lcB24Ad\nwAhwE7Bu3D4fAb5OCFwAP6l4TEnqa8Woc7qkFFWt+hOAnR3Pd5WvdToFOAb4DnA/8NGKx5SkvpYV\nzumSUlR1eLHoYZ8h4GzgQuAw4B7gXsIcsH2Gh4f3bTebTZrNZsWmSdLcZOiS+kur1aLValX+nKoz\nOVcDw4TJ9ACfAXLgsx37bAAOLfcDuA64Hbi5Y5+iKHrJb5LU/2796nOc94lTWbT3ubqbImkasrCw\n8ZQzVNVfte4nDB+uABYAv06YSN/pfwPnESbdHwacA/yw4nElqW/Z0yWlqerwYhtYD9xBCFXXE765\neHn5/ibCchK3Aw8ResGuxdAlKWFhyQhDl5SaubJQjMOLkpJx25ef5px/czbHvPZ03U2RNA11DS9K\nkqbI4UUpTVa9JMWWO7wopciql6TY8pzcni4pOVa9JEXm8KKUJqtekmJzeFFKklUvSbE5vCglyaqX\npMgcXpTSZNVLUmwOL0pJsuolKTZ7uqQkWfWSFNuoc7qkFFn1khSZc7qkNFn1khRZuOH1XLn1raRY\nDF2SFFmRF/Z0SQmy6iUpMocXpTRZ9ZIUW+GSEVKKrHpJis1vL0pJsuolKTKHF6U0WfWSFJsr0ktJ\nsuolKbKscHhRSpFVL0mx5Q4vSimy6iUpNkOXlCSrXpIicyK9lCarXpIiy1ynS0qSVS9JseVOpJdS\nZNVLUmzO6ZKSZNVLUmyGLilJVr0kReacLilNVr0kRea3F6U0WfWSFJsT6aUkWfWSFJs9XVKSrHpJ\niizLcyCruxmSIjN0SVJsfntRSpJVL0mRZRSGLilBVr0kxeZEeilJVr0kxeY6XVKSrHpJiizLc4qG\nl18pNVa9JMWW29Mlpciql6TIXJFeSpNVL0mRGbqkNM1E1a8BtgJPABsm2O9dQBv4lRk4piT1L7+9\nKCWpatUPABsJwet04BLgtIPs91ngdlyGWVLisiIHQ5eUnKpVvwrYBuwARoCbgHVd9vskcDPwDxWP\nJ0n9z54uKUlVq/4EYGfH813la+P3WQdcUz4vKh5Tkvqb63RJSRqs+PO9BKirgSvKfTMOMrw4PDy8\nb7vZbNJsNis2TZLmpizPIXOmhdQvWq0WrVar8udUrfrVwDBhThfAZ4CcMH9rzJMdx1kMvAr8a+CW\njn2KorADTFIaNl/yBX665cf80g+/UHdTJE1DFn5pmnKGqtrTdT9wCrACeAr4dcJk+k4ndWx/BfgG\nBwYuSUpKIx91yQgpQVVDVxtYD9xB+Ibi9cBjwOXl+5sqfr4kzT9FTt4YqLsVkiKrGroAbisfnQ4W\ntj4+A8eTpL6WeRsgKUlWvSRFluWj3vBaSpBVL0mx2dMlJcmql6TIMud0SUkydElSbN4GSEqSVS9J\nkWWjo94GSEqQVS9JkWVFTp45vCilxtAlSZFlDi9KSbLqJSk2V6SXkmTVS1JkWZEbuqQEWfWSFFmW\nO6dLSpGhS5Jis6dLSpJVL0mRNZzTJSXJqpek2HJXpJdSZOiSpMiywnsvSimy6iUpsiwfhYaXXyk1\nVr0kxVbk3gZISpBVL0mRhXW6nNMlpcbQJUmRZblLRkgpsuolKbLMJSOkJFn1khRZVuQULhkhJcfQ\nJUmxuSK9lCSrXpIiy/JRci+/UnKsekmKLCty1+mSEmTVS1JkWZ6Tu2SElBxDlyRFZk+XlCarXpIi\ny/JRV6SXEmTVS1JsrkgvJcnQJUmRZS4ZISXJqpekyFyRXkqTVS9JkdnTJaXJqpekyLLc2wBJKTJ0\nSVJk9nRJabLqJSky53RJabLqJSmyrHB4UUqRoUuSYnN4UUqSVS9JkTUcXpSSZNVLUmz2dElJsuol\nKbKsyMm9DZCUnJkIXWuArcATwIYu718KbAEeAr4HnDEDx5SkvpUVOTT8nVdKzWDFnx8ANgLvB3YD\n3wduAR7r2OdJ4L3Ai4SA9t+B1RWPK0l9yyUjpDRVrfpVwDZgBzAC3ASsG7fPPYTABbAZWFbxmJLU\n1xxelNJUNXSdAOzseL6rfO1gPgHcWvGYktTXHF6U0lR1eLGYwr4XAJcB76l4TEnqaw4vSmmqGrp2\nA8s7ni8n9HaNdwZwLWFO1wvdPmh4eHjfdrPZpNlsVmyaJM1N9nRJ/aXVatFqtSp/Tlbx5weBx4EL\ngaeA+4BLOHAi/YnAXcBvAvce5HOKophKp5kk9a8Xj3kLX/rlu/hP17+l7qZImoYsy2AaGapqT1cb\nWA/cQfgm4/WEwHV5+f4m4I+BNwHXlK+NECbgS1KSMhdHlZJUNXQB3FY+Om3q2P7t8iFJArJi1OFF\nKUFWvSRF5pIRUpoMXZIUWZY7vCilyKqXpMgcXpTSZNVLUmRZkZN7+ZWSY9VLUmRZkcOAc7qk1Bi6\nJCky53RJabLqJSmyrPA2QFKKrHpJiiwrcoqGw4tSagxdkhSZK9JLabLqJSmyLHd4UUqRVS9JkWVF\n7jpdUoKsekmKrOFtgKQkGbokKaaiACBrZDU3RFJshi5Jiml0lNz5XFKSrHxJiil3uQgpVYYuSYqp\nXI0+c3RRSo6hS5JiGnW5CClVVr4kxeR9F6VkWfmSFFMelotweFFKj6FLkmKyp0tKlpUvSTGVc7rs\n6ZLSY+iSpJhcMkJKlqFLkmJyeFFKlpUvSTE5vCgly9AlSTHZ0yUly8qXpJjKJSMkpcfQJUkxObwo\nJcvQJUkxtdvkA0N1t0JSDQxdkhTTyAh5Y9CeLilBhi5JiqndZrRhT5eUIkOXJMXUbpM3ButuhaQa\nGLokKSaHF6VkGbokKaZ2m9zhRSlJhi5JisnhRSlZhi5JisnhRSlZhi5JislvL0rJMnRJUkz2dEnJ\nMnRJUkzO6ZKSZeiSpJgcXpSSNROhaw2wFXgC2HCQfb5Yvr8FOGsGjilJ/cnhRSlZVUPXALCRELxO\nBy4BThu3z1pgJXAK8DvANRWPKUn9y+FFKVlVQ9cqYBuwAxgBbgLWjdvnIuCGcnszcDSwpOJxJak/\nfPe7cPfd+587vCglq+qvWycAOzue7wLO6WGfZcCeiseWpLnt2Wfhwguh0YDnn4dDD3V4UUpY1dBV\n9Ljf+MtLrz/Xn667DrZv733/qVx9E9/3Rz+CH/94ap9bvOGvX7U2TOdziyn9C+vnTvlzZ+n/McBg\n+zUOef1FwmUroz2wkJeOOI6XD1/CkS8/zbHPPcaKnX/DQD7CYysvYtdx7+Lxkz7ABfdcxTt+eBNb\n3vkfWP7UZu79yK08+raLOfeBNiNPO7wopahq5e8Glnc8X07oyZpon2XlawcYHh7et91sNmk2mxWb\nVqPDDoNFi3rbt5hC/nRfBgfhkIUFPef2KbQhm8rvAlP5b5vC52Zz5XN73H3OtHdWPjd8dnvwEF4/\n+k2EEFiwcORnHPPCgxy+81lePnIpzx/3Nu5cdSl5Y5CVW7/Jex66hl/75kfZsfL93HLp/+TpE36e\nn91/Hc0HPs9zp5/PYQvaHHXSEG//8BSbIqk2rVaLVqtV+XOqdnAPAo8DFwJPAfcRJtM/1rHPWmB9\n+edq4Oryz05FMeWLoSTNUbt2wXHHwcBAeP7aa3DppTAyAuefD3v2wOc+V28bJU1bFnrMp5yhqvZ0\ntQmB6g7CNxmvJwSuy8v3NwG3EgLXNuAV4OMVjylJc9uyZQc+P+QQ2LgRzjgDzj03dNlKSs5MVP5t\n5aPTpnHP18/AcSSpfy1dCqOjsHMnHHts3a2RVANXpJekGLIMTjwRHn8cDj+87tZIqoGhS5JiWboU\nnnwyfNlGUnIMXZIUy5IlsGOHPV1SogxdkhTL0qXhT3u6pCQZuiQplrHQZU+XlCRDlyTFsqS87aw9\nXVKSDF2SFIs9XVLSDF2SFMupp4ZbhB1/fN0tkVSDuXKfe28DJEmS+sJ0bwNkT5ckSVIEhi5JkqQI\nDF2SJEkRGLokSZIiMHRJkiRFYOiSJEmKwNAlSZIUgaFLkiQpAkOXJElSBIYuSZKkCAxdkiRJERi6\nJEmSIjB0SZIkRWDokiRJisDQJUmSFIGhS5IkKQJDlyRJUgSGLkmSpAgMXZIkSREYuiRJkiIwdEmS\nJEVg6JIkSYrA0CVJkhSBoUuSJCkCQ5ckSVIEhi5JkqQIDF2SJEkRGLokSZIiMHRJkiRFYOiSJEmK\noEroOga4E/gR8H+Ao7vssxz4DvAo8AjwuxWOJ0mS1LeqhK4rCKHrVODb5fPxRoB/D7wdWA38W+C0\nCsdMSqvVqrsJc5LnpTvPyxt5TrrzvHTneenO8zJzqoSui4Abyu0bgH/ZZZ9ngB+U2y8DjwHHVzhm\nUvyL3p3npTvPyxt5TrrzvHTneenO8zJzqoSuJcCecntP+XwiK4CzgM0VjilJktSXBid5/05gaZfX\n/3Dc86J8HMwRwM3Apwg9XpIkSUnJKvzsVqBJGEI8jjBh/m1d9hsCvgncBlx9kM/aBpxcoS2SJEmx\nbAdWxjzgnwIbyu0rgP/aZZ8M+EvgC7EaJUmSNN8cA/xf3rhkxPHAt8rt84CcMJn+wfKxJm4zJUmS\nJEmSpFnUy8KqYwYIPWTfiNCuurng7IHWEOYOPsH+oezxvli+v4Xw7dgUTHZeLiWcj4eA7wFnxGta\nbXr5uwLwLqAN/EqMRs0BvZyXJuEa+wjQitKq+k12XhYDtxNGaR4BPhatZfX5MmElgocn2CfF6+1k\n56Uvrrd/Cny63N5A9/lgY34P+Cvgltlu1BzQy3lZCpxZbh8BPM78XHB2gPAFixWEL2P8gDf+d64F\nbi23zwHujdW4GvVyXs4Fjiq31zD/z0sv52Rsv7sIX+y5OFbjatTLeTma8AvcsvL54liNq1Ev52UY\n+JNyezHwHJN/27/fnU8IUgcLFyleb2Hy8zKl621d917sZWFVCBeCtcB1VPumZb9wwdn9VhEujDsI\ndza4CVg3bp/O87WZ8A/IZOvF9btezss9wIvl9mb2/4M6X/VyTgA+SVi65h+itaxevZyXjwBfB3aV\nz38Sq3E16uW8PA0sKrcXEUJXO1L76nI38MIE76d4vYXJz8uUrrd1ha5eF1b9AvAfCZPxU+CCs/ud\nAOzseL6rfG2yfeZ7wOjlvHT6BPt/O52vev27sg64pnw+0bqC80Uv5+UUwrSG7wD3Ax+N07Ra9XJe\nriXcvu4pwtDRp+I0bU5L8Xo7VZNeb2ezu7Tqwqr/AniWMNegOaMtq5cLzvam138Ux/eAzvd/TKfy\n33cBcBnwnllqy1zRyzm5mrC0TUH4O5NCz3kv52UIOBu4EDiM8Fv7vYR5O/NVL+flDwgjCk3CGpJ3\nAu8AXpq9ZvWF1K63U9HT9XY2Q9c/n+C9PYTgMbaw6rNd9nk3oTtzLXAIoYv3L4F/NbPNjK7qeYFw\nofw68DXgr2e0dXPHbsKXBsYsZ/8QyMH2WVa+Np/1cl4gTOa8ljDHYKKu8fmgl3PyTsIwEoQ5Oh8g\nDC3N57mivZyXnYQhxZ+Vj78hhIv5HLp6OS/vBq4qt7cDfwe8ldAbmKoUr7e9mvPX214WVu30PtL4\n9qILzu43SLjYrQAWMPlE+tWkMbGzl/NyImHOyuqoLatPL+ek01dI49uLvZyXtxHWWxwg9HQ9DJwe\nr4m16OW8fB64stxeQghlx0RqX51W0NtE+lSut2NWcPDz0hfX214WVu30Pub3b6RjXHD2QB8gfDtz\nG/CZ8rXLy8eYjeX7WwjDJCmY7LxcR5j4O/b3477YDaxBL39XxqQSuqC38/L7hG8wPsz8XoKm02Tn\nZTHhF/0thPPykdgNrMGNhDlsewk9oJfh9RYmPy8pXm8lSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIk\nSfX5OfavefM0YWHKBwm3YNk4S8dcD3xsgvcvAv5olo4tSZJUuyuB35vlY2SEUDfRbdEywoLEQ7Pc\nFknzWKPuBkjSJMZusttk/+3AhoEbCPcK3EFYYf5zwEPAbewPUO8EWoR75t1O95vNvwfYCrTL579L\nWKF9C2E1agg39r0H+MWq/zGS0mXoktSv3gJcQBj6+xpwJ+HGsz8DPkjolfoScDHw84Tb/1zV5XPO\n48AbGW8AziTc+LnzFij3Ae+d0f8CSUmZqDtdkuaqgtCjNQo8QvgF8o7yvYcJN6g9FXg74X6mEG7q\n/FSXzzoR+G7H84eA/wH8dfkY8xTz9z6nkiIwdEnqV3vLP3NgpOP1nHBtywjDhO/u4bOyju0PEnq0\nPgT8IfBPy89sEMKeJE2Lw4uS+lE2+S48DrwZWF0+HwJO77Lf37N/rldG6PlqAVcARwFHlO8dV+4r\nSdNi6JI01xUdf3bbhjf2QBWE3q9fBT5L+Obhg8C5XT7/u4Q5XxB6yL5KGGL8f8CfAf9YvreKMHFf\nkiRJ0zC2ZMSCCfZpEIKbUzIkTdtA3Q2QpDlgADiNEKy6+RDwHGHYUZIkSZIkSZIkSZIkSZIkSZIk\nSZIkSZIkSZKUhv8PSQWT/+nRGwQAAAAASUVORK5CYII=\n", + "text": [ + "" + ] + } + ], + "prompt_number": 35 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 35 + } + ], + "metadata": {} + } + ] +} \ No newline at end of file diff --git a/python/fir++.h b/python/fir++.h new file mode 120000 index 0000000..7dde2d2 --- /dev/null +++ b/python/fir++.h @@ -0,0 +1 @@ +../obj/fir++.h \ No newline at end of file diff --git a/python/pyfir.i b/python/pyfir.i new file mode 100644 index 0000000..836a349 --- /dev/null +++ b/python/pyfir.i @@ -0,0 +1,24 @@ +%module fir +%include + +/* + * List conversion + * + * SWIG knows how to turn std::vector func() into a function that returns a + * Python list. We do need to tell it about all types with %template, + * however. + */ +%include +%template(vectord) std::vector; + + + +%{ +#include "fir++.h" +%} + + + +%include "fir++.h" + +// vim: ts=4:sw=4 diff --git a/python/setup.py b/python/setup.py new file mode 100644 index 0000000..781b001 --- /dev/null +++ b/python/setup.py @@ -0,0 +1,16 @@ +#!/usr/bin/env python3 + +from distutils.core import setup, Extension + +fir_module = Extension('_fir', + sources=['pyfir_wrap.cxx'], + libraries=['fir++'], + ) + +setup(name = 'fir', + version = '0.0.0', + author = 'Laurence Withers', + description = 'FIR filter', + ext_modules = [fir_module], + py_modules = ['fir'], + ) diff --git a/src/libfir++/000_TopHeader.h b/src/libfir++/000_TopHeader.h index 697e38d..1c7ed19 100644 --- a/src/libfir++/000_TopHeader.h +++ b/src/libfir++/000_TopHeader.h @@ -10,6 +10,7 @@ // standard includes, or includes needed for type declarations #include +#include // forward declares, allowing us to avoid including the C library header extern "C" { diff --git a/src/libfir++/100_Filter.cc b/src/libfir++/100_Filter.cc index 201d868..e377368 100644 --- a/src/libfir++/100_Filter.cc +++ b/src/libfir++/100_Filter.cc @@ -32,6 +32,13 @@ Filter::Filter(const std::vector& coeff, Symmetry symm) +Filter::Filter(struct fir_filter_t* fi) +{ + fi_ = fi; +} + + + Filter::~Filter() { fir_filter_free(fi_); @@ -71,6 +78,14 @@ Filter::coeff(int idx) const +std::complex +Filter::response(double freq) const +{ + return std::complex(fir_filter_response(fi_, freq)); +} + + + /* options for text editors vim: expandtab:ts=4:sw=4 */ diff --git a/src/libfir++/100_Filter.h b/src/libfir++/100_Filter.h index 06a46d9..43b0dc6 100644 --- a/src/libfir++/100_Filter.h +++ b/src/libfir++/100_Filter.h @@ -39,7 +39,7 @@ enum Symmetry { -/*! \brief Basic FIR filter object. +/*! \brief Basic %FIR filter object. \ingroup libfirpp_fir @@ -88,12 +88,25 @@ public: + /*! \brief Take ownership of underlying C filter object. + + \param fi Filter. + + This constructor may be used to build a filter object using an underlying C + library filter object. The new instance will take ownership of \a fi and + free it when the instance is deleted. + + */ + explicit Filter(struct fir_filter_t* fi); + + + /*! \brief Destructor (frees underlying memory). */ virtual ~Filter(); - /*! \brief Filter a sample. + /*! \brief %Filter a sample. \param x Input sample. \returns Filter output. @@ -141,6 +154,20 @@ public: + /*! \brief Evaluate response of filter at given frequency. + + \param freq Frequency as a fraction of sampling rate. + \returns Complex response of filter at given frequency. + + Performs Z-domain analysis of the filter to determine its complex response + (phase and magnitude) to a signal of the given frequency \a freq, which is + expressed as a fraction of the sampling rate being used with the filter. + + */ + std::complex response(double freq) const; + + + private: struct fir_filter_t* fi_; diff --git a/src/libfir++/200_CommonFilters.cc b/src/libfir++/200_CommonFilters.cc new file mode 100644 index 0000000..644542b --- /dev/null +++ b/src/libfir++/200_CommonFilters.cc @@ -0,0 +1,28 @@ +/* libfir/src/libfir++/200_CommonFilters.cc + * + * Copyright: ©2014, Laurence Withers. + * Author: Laurence Withers + * License: GPLv3 + */ + + + +Filter +SincLowpass(int npoints, double corner, double gain) +{ + return Filter(fir_sinc_lowpass(npoints, corner, gain)); +} + + + +Filter +LanczosLowpass(int npoints, double corner, double gain, int a) +{ + return Filter(fir_lanczos_lowpass(npoints, corner, gain, a)); +} + + + +/* options for text editors +vim: expandtab:ts=4:sw=4 +*/ diff --git a/src/libfir++/200_CommonFilters.h b/src/libfir++/200_CommonFilters.h new file mode 100644 index 0000000..7955dee --- /dev/null +++ b/src/libfir++/200_CommonFilters.h @@ -0,0 +1,48 @@ +/* libfir/src/libfir++/200_CommonFilters.h + * + * Copyright: ©2014, Laurence Withers. + * Author: Laurence Withers + * License: GPLv3 + */ + + + +/*! \defgroup libfirpp_common Common filter types + +\ingroup libfirpp + +*/ +/*!@{*/ + + + +/*! \brief Brickwall low-pass linear phase: sinc filter. + +\param npoints Number of points required (≥1). +\param corner Corner frequency as fraction of sample rate. +\param gain Gain of filter. +\returns Newly-allocated %FIR filter. + +Builds a truncated-sinc filter which has a low-pass, brickwall effect (cutoff +at \a corner, which is a fraction of sampling rate, i.e. 0 < \a corner < +0.5). + +The number of points \a npoints is a trade-off between accuracy of filter (an +ideal sinc filter would have an infinite number of points) and computation time. +\a npoints may be odd or even; symmetry will be exploited in either case. + +The DC gain of the filter is normalised to \a gain, which is often 1.0. + +*/ +Filter SincLowpass(int npoints, double corner, double gain); + + + +Filter LanczosLowpass(int npoints, double corner, double gain, int a); + + + +/*!@}*/ +/* options for text editors +vim: expandtab:ts=4:sw=4:syntax=cpp.doxygen +*/ diff --git a/src/libfir/000_TopHeader.h b/src/libfir/000_TopHeader.h index b0ad494..6b587c9 100644 --- a/src/libfir/000_TopHeader.h +++ b/src/libfir/000_TopHeader.h @@ -8,14 +8,15 @@ #ifndef HEADER_libfir #define HEADER_libfir +/* standard includes, or includes needed for type declarations */ +#include + #ifdef __cplusplus extern "C" { #endif /*! \defgroup libfir C library */ -/* standard includes, or includes needed for type declarations */ - /* options for text editors vim: expandtab:ts=4:sw=4:syntax=ch.doxygen */ diff --git a/src/libfir/200_common_filters.c b/src/libfir/200_common_filters.c index 17d374f..2a03650 100644 --- a/src/libfir/200_common_filters.c +++ b/src/libfir/200_common_filters.c @@ -29,7 +29,7 @@ fir_sinc_lowpass(int npoints, double corner, double gain) sum += 1; /* not 2, as we don't repeat this coeff */ } else { t = i + 0.5 - npoints * 0.5; - t *= corner * 2; + t *= corner * 2 * M_PI; coeff[i] = sin(t) / t; sum += coeff[i] * 2; } @@ -47,6 +47,46 @@ fir_sinc_lowpass(int npoints, double corner, double gain) +struct fir_filter_t* +fir_lanczos_lowpass(int npoints, double corner, double gain, int a) +{ + double* coeff, t, sum = 0; + int i, spoints; + + if(npoints < 1) { + errno = EINVAL; + return 0; + } + + /* find number of points after taking symmetry into account */ + spoints = (npoints + 1) / 2; + coeff = alloca(sizeof(double) * spoints); + + /* only fill out for t ≤ 0 */ + for(i = 0; i < spoints; ++i) { + if((i * 2 + 1) == npoints) { + coeff[i] = 1; + sum += 1; /* not 2, as we don't repeat this coeff */ + } else { + t = i + 0.5 - npoints * 0.5; + t *= corner * 2 * M_PI; + coeff[i] = (sin(t) / t) * sin(t / a) / (t / a); + sum += coeff[i] * 2; + } + } + + /* normalise gain */ + gain /= sum; + for(i = 0; i < spoints; ++i) { + coeff[i] *= gain; + } + + return fir_filter_new(spoints, coeff, + (npoints & 1) ? fir_symmetry_odd : fir_symmetry_even); +} + + + /* options for text editors vim: expandtab:ts=4:sw=4 */ diff --git a/src/libfir/200_common_filters.h b/src/libfir/200_common_filters.h index 3adfc2c..eb77880 100644 --- a/src/libfir/200_common_filters.h +++ b/src/libfir/200_common_filters.h @@ -41,6 +41,10 @@ struct fir_filter_t* fir_sinc_lowpass(int npoints, double corner, double gain); +struct fir_filter_t* fir_lanczos_lowpass(int npoints, double corner, double gain, int a); + + + /*!@}*/ /* options for text editors vim: expandtab:ts=4:sw=4:syntax=ch.doxygen diff --git a/src/libfir/300_response.c b/src/libfir/300_response.c new file mode 100644 index 0000000..412a710 --- /dev/null +++ b/src/libfir/300_response.c @@ -0,0 +1,28 @@ +/* libfir/src/libfir/300_response.c + * + * Copyright: ©2014, Laurence Withers. + * Author: Laurence Withers + * License: GPLv3 + */ + + + +double complex +fir_filter_response(const struct fir_filter_t* fi, double freq) +{ + int i, ncoeff = fir_filter_get_ncoeff(fi); + double omega = 2 * M_PI * freq; + double complex resp = 0; + + for(i = 0; i < ncoeff; ++i) { + resp += fir_filter_get_coeff(fi, i) * cexp(I * omega * i); + } + + return resp; +} + + + +/* options for text editors +vim: expandtab:ts=4:sw=4:syntax=ch.doxygen +*/ diff --git a/src/libfir/300_response.h b/src/libfir/300_response.h new file mode 100644 index 0000000..ad8b2d4 --- /dev/null +++ b/src/libfir/300_response.h @@ -0,0 +1,39 @@ +/* libfir/src/libfir/300_response.h + * + * Copyright: ©2014, Laurence Withers. + * Author: Laurence Withers + * License: GPLv3 + */ + + + +/*! \defgroup libfir_response Response analysis + +\ingroup libfir + +Routines in this section allow the evaluation of the filter's response. + +*/ +/*!@{*/ + + + +/*! \brief Measure phase and frequency response of filter at frequency. + +\param fi Filter to evaluate. +\param freq Frequency (as a ratio of sample rate). +\returns Complex response of filter at given frequency. + +Performs Z-domain analysis of the filter to determine the magnitude and phase of +its response to a signal of the given frequency. \a freq is expressed as a +fraction of the sample rate to be used with the filter. + +*/ +double complex fir_filter_response(const struct fir_filter_t* fi, double freq); + + + +/*!@}*/ +/* options for text editors +vim: expandtab:ts=4:sw=4:syntax=ch.doxygen +*/