{ "cells": [ { "cell_type": "markdown", "metadata": { "nbsphinx": "hidden" }, "source": [ "# Design of Digital Filters\n", "\n", "*This jupyter notebook is part of a [collection of notebooks](../index.ipynb) on various topics of Digital Signal Processing. Please direct questions and suggestions to [Sascha.Spors@uni-rostock.de](mailto:Sascha.Spors@uni-rostock.de).*" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Example: Non-Recursive versus Recursive Filter\n", "\n", "In the following example, the characteristics and computational complexity of a non-recursive and a recursive filter are compared for a particular design. Quantization is not considered. In order to design the filters we need to specify the requirements. This is typically done by a *tolerance scheme*. The scheme states the desired frequency response and allowed deviations. This is explained at an example.\n", "\n", "We aim at the design of a low-pass filter with \n", "\n", "1. unit amplitude with an allowable symmetric deviation of $\\delta_\\text{p}$ for $|\\Omega| < \\Omega_\\text{p}$\n", "2. an attenuation of $a_\\text{s}$ for $|\\Omega| > \\Omega_\\text{s}$\n", "\n", "where the indices p and s denote the pass- and stop-band, respectively. The region between the pass-band $\\Omega_\\text{p}$ and the stop-band $\\Omega_\\text{s}$ is known as *transition-band*. The phase of the filter is not specified.\n", "\n", "The resulting tolerance scheme is illustrated for the design parameters $\\Omega_\\text{p} = \\frac{\\pi}{3}$, $\\Omega_\\text{s} = \\frac{\\pi}{3} + 0.05$, $\\delta_\\text{p} = 1.5$ dB and $a_\\text{s} = -60$ dB." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "%matplotlib inline\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "import matplotlib.patches as mpatches\n", "import scipy.signal as sig\n", "\n", "def plot_tolerance_scheme(Omp, Oms, d_p, a_s):\n", " Omp = Omp * np.pi\n", " Oms = Oms * np.pi\n", "\n", " p = [[0, -d_p], [Omp, -d_p], [Omp, -300], [np.pi, -300], [np.pi, a_s], [Oms, a_s], [Oms, d_p], [0, d_p]]\n", " polygon = mpatches.Polygon(p, closed=True, facecolor='r', alpha=0.3)\n", " plt.gca().add_patch(polygon)\n", "\n", "\n", "Omp = .3 # normalized corner frequency of pass-band\n", "Oms = .3 + 0.05 # normalized corner frequency of stop-band\n", "d_p = 1.5 # one-sided pass-band ripple in dB\n", "a_s = -60 # stop-band attenuation in dB\n", "\n", "plt.figure(figsize = (10, 5))\n", "plot_tolerance_scheme(Omp, Oms, d_p, a_s)\n", "plt.title('Tolerance scheme')\n", "plt.xlabel(r'$\\Omega$')\n", "plt.ylabel(r'$|H(e^{j \\Omega})|$ in dB')\n", "plt.axis([0, np.pi, -70, 3])\n", "plt.grid();" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Exercise**\n", "\n", "* What corner frequencies $f_\\text{p}$ and $f_\\text{s}$ result for a sampling frequency of $f_\\text{s} = 48$ kHz?\n", "\n", "Solution: It follows that $f_\\text{p} = \\frac{\\Omega_\\text{p}}{\\pi} \\cdot \\frac{f_\\text{s}}{2} = 8$ kHz and $f_\\text{s} = \\frac{\\Omega_\\text{s}}{\\pi} \\cdot \\frac{f_\\text{s}}{2} \\approx 8.4$ kHz, since the normalized frequency $\\Omega = \\pi$ corresponds to $\\frac{f_\\text{s}}{2}$." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The comparison of non-recursive and recursive filters depends heavily on the chosen filter design algorithm. For the design of the non-recursive filter a technique is used which bases on numerical optimization of the filter coefficients with respect to the desired response. The [Remez algorithm](https://en.wikipedia.org/wiki/Remez_algorithm), as implemented in `scipy.signal.remez`, is used for this purpose. The parameters for the algorithm are the corner frequencies of the pass- and stop-band, as well as the desired attenuation in the stop-band. For the recursive filter, a [Chebyshev type II](https://en.wikipedia.org/wiki/Chebyshev_filter) design is used. Here the parameters are the corner frequency and attenuation of the stop-band. The order of both filters has been chosen manually to fit the given tolerance scheme." ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAnQAAAFPCAYAAADEPFM8AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4wLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvpW3flQAAIABJREFUeJzs3Xd8VFX+//HXZyaNEkJLIQTIACH0jlIGgYAI9t5dV+K6/nbd5lrA3f1udVHX7rq6akBcK3bXrkDAQOg2qpQJJCCi9BpSzu+PGSSylEQzTMr7+XjMY+4955ZPDsPMZ84594455xARERGR2ssT6QBERERE5IdRQiciIiJSyymhExEREanllNCJiIiI1HJK6ERERERqOSV0IiIiIrWcEjoRqRXMLNfMro10HCIiNZESOhGpMcyswMz2mdluM/vKzJ40s8aRjktEpKZTQiciNc1ZzrnGQF+gP/D7CMdzRGYWFekYREQOUkInIjWSc24D8A7QvUJxOzObbWa7zOx9M2t5sMLMXjSzTWa2w8xmmVm3CnWnm9my0H4bzOymCnVnmtknZrbdzOaYWc+jxWRmzsx+bmargFWhss5m9oGZbTWzlWZ28fHOa2bDzazIzG4zs29CPZNXVNgvwcyeMrOvzWydmf3ezDyhuh+bWZ6Z3W1m28wsYGZjK+z7YzNbGzpn4LDjjjOz5aH93jOzdlX9dxGRmkkJnYjUSGbWBjgd+LhC8eXANUASEAPcVKHuHSAjVLcYeKZCXQ7wU+dcPMEEcXroHH2AScBPgRbAv4E3zCz2GKGdC5wMdDWzRsAHwLOh814K/MvMuh7rvCEpQEugNXA18JiZZYbqHgISgPbAMOBHob/7oJOBlaH97wJyLKgR8CAwNnTOwcAnob/1HOA24HwgEfgIeO4Yf6eI1CJK6ESkpnnNzLYDecBM4O8V6iY7575wzu0DpgK9D1Y45yY553Y554qBPwG9zCwhVF1CMAFr4pzb5pxbHCq/Dvi3c26ec67MOTcFKAYGHiO+ic65raEYzgQKnHOTnXOlzrmPgZeBi45z3oP+4Jwrds7NBN4CLjYzL8HEcELo7ykA7gGuqrDfOufc4865MmAK0ApIDtWVA93NrIFz7kvn3NJQ+fWh2Jc750pD7dpbvXQidYMSOhGpac51zjV1zrVzzv0slDgdtKnC8l6gMYCZec3sDjNbY2Y7gYLQNgeHZC8g2Nu3zsxmmtmgUHk74Leh4dbtoUSyDZB6jPgKKyy3A04+bP8rCPa+Heu8ANucc3sqrK8LnbclEB1ar1jX+kjt4JzbG1psHDreJQSTty/N7C0z61wh1gcqxLkVsMOOKyK1lBI6EakLLgfOAUYRHKpMD5UbgHNugXPuHILDoq8R7N2DYHJ2eyiBPPho6Jw71lCkq7BcCMw8bP/Gzrn/d5zzAjQLDZEe1BbYCHxDsGev3WF1GyrTEM6595xzpxLstVsBPF4h1p8eFmsD59ycyhxXRGo2JXQiUhfEExwq3QI0pMIwrZnFmNkVZpbgnCsBdhIcloRgsnO9mZ18cA6amZ1hZvGVPO+bQCczu8rMokOPAWbW5TjnPejPoe2GEhy+fTE0jDoVuN3M4kNDojcCTx8vGDNLNrNzQoliMbC7wjkfBSYcvFgkdOHFRUc5lIjUMkroRKQueIrgsOQGYBkw97D6q4CC0HDs9QSHRXHOLQR+AvwT2AasBn5c2ZM653YBownOedtIcCj0TuDgRRVHPG/IptA5NxK8gON659yKUN0vgD3AWoJzCZ8lePHG8XgIJn8bCQ6pDgMO9ha+Gort+VA8S4CxRzmOiNQy5pw7/lYiIlJtzGw48LRzLi3SsYhI3aAeOhEREZFaTgmdiIiISC2nIVcRERGRWk49dCIiIiK1nBI6ERERkVouKtIBnGhNmzZ1HTt2jHQYddaePXto1KjR8TeU701tHH5q4/BTG4ef2ji8TlT7Llq06BvnXOLxtqt3CV1ycjILFy6MdBh1Vm5uLsOHD490GHWa2jj81MbhpzYOP7VxeJ2o9jWzdcffSkOuIiIiIrWeEjoRERGRWk4JnYiIiEgtp4ROREREpJZTQiciIiJSyymhExEREanllNCJiIiI1HK1PqEzszFmttLMVpvZ+EjHIyIiInKi1eqEzsy8wMPAWKArcJmZdY1sVCIiIiInVm3/pYiTgNXOubUAZvY8cA6wLKJRiYiIVFVpMSx7HcoOgCcq9PCCJ/qw9SjwRn933RMV2u7QevSB7bBvW4X60MMs0n+phEFtT+haA4UV1ouAk4+1Q8PdBZTc043omDjwxgQfUbGHLUeDNxaiQmVHXT7WvkdbrnAcb21vfhGpE8pKYMvqYELgjQ69R1VcjgkmChJeq6fBKz+ptsMNAZhzhArzHpbkVUwSD687/OGtkExWTCiPkGB+r+OF4ZjmBU+tHpCslHqRUZjZdcB1AL6UBN7Y7iMptpTWDctJiCrFs28f5nbhKS/BU16KueCzp7wEc6Wh8hI8rqRa43J4KPdE4Syack9UheXoKi5HUe6JxlnU99j3yMf5vt/gdu/eTW5ubrW2k3yX2jj86lsbt18zmbaFrx1zm0PvVwffq7zfvm8cKjveczTOvJR7okgrdRQEnqnSMY5c5q0Qz3fXsdr1IZ68aS5dgI97/53i2OaYK8NTXoa5g4/y0HNpheUjPYJ1B/bvIS4m+jt1VTpeeRlWdnC7A5jbe4TtykOfm2XHj4nyiLWtw0KvEU/o2Xuc9aNvB8HlzPJyNi/9x1GOdbTlyp2j4npl1faEbgPQpsJ6WqjsO5xzjwGPAXTslOnWn3Ivf5+7ji2bD9A5JZ5sv4+ze6cSG3WchnMOykuD3eJlB4KP0uLgt9uy4sOWQ/VHXT6AlRbjrdJx9hxaPzwGV1Z9rYpBVBxExwWfDz6+XY+FqAbB5+jQc2ibgq83kd6083f3+852R97v20c9+Bb1Q+kHt8PkwF545kLYv4Md+0pIaJ5U4XXf4Lv/Hyq+ng/Wf/u6Pk69N6bmDXltfS441nFBzqH3lbKS7yxbWUno/arkqNtQXnJY+b7gcmnFshIoK6G8ZH+1f0n+XxbqqYkOjogc7IGsuO6JOqwuqsI20Yf1DB2h7jvHO9pxoo5yvMPqaAgroM+oi6Bx0g/+62vce0V5efAz9JiPstBrqcJ6eWnwtfWd9dLQdmVHP1ZZSfCzsbwMKy/Fvt3/8H0OW3fH26YEyovZs2sHjTyxRz5GeVnoOBXKwqy2J3QLgAwz8xFM5C4FLj/WDl6D35zaif83vANvfLKRnLwAN7/0GXe+u5KrBrbjyoFtadE49sg7mx0ahqhpysu+R4J5pORwf3C9dD+U7K+wvi/4XLIv+MG3d2uoLlQf2ja9rBjW/YC/wxsT/NCLbgQxDSE69Di4HNPou8/RDSqUNaywX6NQXcPvHqumfZDWVzs3Bof4YhpBTHzwObYxxDSO3NDezg2wbjYAZc16B9+A934Tem3vq/D/IfT43ux/E75vp2OEpmhExR5WFhNMFL+d2lGJ7b0HvzAdXlZh+4PTPspLoHkH6HHhD2/HSpqVm8vwYcMOvXcdNSk80nLJYduXVPiAP3y99Bh1JVBWIVk4WFey77t1/3O8w+pw1dcw5gn+P6iLPB7wxAAxkY6kWiyoSsLsHLjDE9pKJJflZfDn/pU6Ra1O6JxzpWZ2A/Ae4AUmOeeWVmbfuGgvFw9ow0X905i9egtP5K3lvg+/4OHc1ZzXuzXZQ310So4Pa/zVyuMFT4PgB0UE5c6YznD/oMMSwoqJ377vJoiHb1eyL/h8YA+U7A0mjyV7YP9O2LUpVL4vVLeHKr2Rmgdi4yG2SegRH3zEVViOTThyeVxTaNAs+KxexB/uxWugcO6R66IahJK7w5O9o6x/u9zo0BeAil8CohsGE5jjJfNlB4LPF03hs6+bHvuNurw89OVo/5ETvoOv42PWFx8qP/hFq3R/MI69eyp82Tqsrjp75M0TTOzKS6BFRvUcs0rnt2BS6Y0CGp7481eXb3uVSo6QRB4vmTwsaYxPCb52pW4xC83l8wJH6TT6gWp1QgfgnHsbePv77m9m+DNa4s9oyerNu5g0u4BXFhfxwsJChma0JNvvY1inREw9O5VjnlAPWwMId27pXCj5CyV9B/YGE72KieDBsgN74MBuKN4VTA6LQ4+938C2QKhsV/AD9nh/X4Nm0KA5NGweem4BDSuUNUoKvik3SYVGibV/Mvm6fNi/HeISQolt0+BzdIPv3+O5b1uwbc7+Z/Df5cBuKN4d+nfaFXwu3n2obu9W2F5YYbtdwW+7lWWeQz26R0r4ohsEEyUI9oIdj8dz6AtUJL5DlZdVSPYO9sYflgBWui5Ulj4kAn9IHeE5+EEdF+lIpB6r9QlddeqYFM/fz+vBzaMzeXb+eqbMKeDHkxfQMakx44b4OL9va+Kia/mHc11idih5pEX1HLOsJJjYFe+skPztCiY0e7fCvq0VnrfAjiLY9Flw+UjDcOaFxsnBBC++VTDJa+4LDm81bw/N0oNDYTVV8W6YPObIdd6Y/03y4hIOLTcIrcclfLf3M65JMMHwnQKZRzn28XybzO8J/vsc2HOoV7dkb2hqwJ7DEvx9wST/27pQT+/uTYfqE9pCywzY9D9TcWsWjzfUi6OeHBEJUkJ3BM0axfDzER35ydD2vPlZcJ7dba9+zj/eW8EVJ7fjR4PakdRE38TqJG90sJetYfOq73tgbzDR2705ODy8ayPs/PLQ8ta1UPBRMFk8yDyQ0AYSMyG5O6T0CD6at68ZPXsloR7L3ldCjwtg33bYvyOY4O7bXuF5R7C3c8vqYNn+HcfvQWv3A3qEKibzjVp+/+McVQ1P6EREDqOE7hhiojyc3zeN8/q0Zl5gKzl5AR7OXc2/Z63hrF6pZPt9dEtNiHSYUlPEhIbxEtKOvo1zwR6+rWuCCd6WNcHlzStgzfRDV0JFN4SkLpDcDZK6QXLX4HOjauqJBFg4GeY/HhombhkaOg49N2oRfD6YlKX1hw5ZlT+2c4d6Ng/2chbvrDDcvQsyT6++v0VEpJ5TQlcJZsbA9i0Y2L4FBd/s4ck5BUxdWMgrizcwsH1zsv3tGdk5CY9H8+zkOMyCyVKjFtDmpO/WlRbD1ytg0xL4agls+hyWvwmLnzq0TeNkeka3gv2DoZkvOGTb3AdN2wYn/lfF6g9h81JoMzB4rr1bgnPbjiSmUdWObRYcWo1rUrX9RETke1FCV0XpLRvxp7O78ZtTO/F8aJ7dT55aSHqLhozz+7igbxqNYtWs8j1ExUKrXsHHQc7B7q/gq6WweRl8tYzoNfOCvWvfuYDDoElraNYuNFevFcSnHro4I75V8FFxvl55KaT0hOz3DpWVlQaTur1bgkOoe7cEh5I7nxH2P19ERL4/ZR7fU0KDaH46rAPj/D7eXbKJnLwA//f6Uu5+byWXndyWqwelk9o0srcQkTrALHRBRQp0HAnAooP379q9GbYVBK/S3VYQeqyDDQth+ZfBqxcP17Bl8CKNxonw1bJgz15F3qhgXePEcP9lIiJSjZTQ/UDRXg9n9UrlrF6pLFq3jZy8tTw+ay1PfBTg9B6tyPb76N2maaTDlLrGDOKTg4+2R/j5YueCPW27vgxdmLHx0PPur2HP5uAFBbpVhYhInaCErhr1a9eMfu36Ubh1L1PmFPDCgkL+++lG+rVrRrbfx+iuyUR5dVNaOQHMDl2tm9wt0tGIiEiYKbsIgzbNG/L7M7syZ0IW/3dmVzbv2s/PnlnM8LtzeeKjtezaH+7fLxQREZH6RAldGMXHRTPO7yP3phE8emU/UhMa8Le3ljNo4nT+8t9lFG7dG+kQRUREpA7QkOsJ4PUYY7qnMKZ7Cp8VbScnL8BT+QU8OSfAad1SyPb76NeumX5eTERERL4XJXQnWM+0pjxwaR/Gj+3MU/nreHbeet5ZsoleaQmM8/s4vUcrojXPTkRERKpAmUOEtEpowK1jOpM/IYu/ntONnftL+dXzn3DKXTN4JHcNO/Zqnp2IiIhUjhK6CGsYE8VVg9KZduMwcq7uj69lI+58dwUDJ07j/15fQuCbPZEOUURERGo4DbnWEB6PMbJLMiO7JLNs404mzQ7w/PxC/jN3HSM7JzHO72NQ+xaaZyciIiL/Qz10NVDX1CbcfVEv8saP4BdZGSxev53LH5/HGQ/m8dKiIopLyyIdooiIiNQgSuhqsKT4OG48tRNzxmdxx/k9KCkr56YXP8V/5wwemraKrXsORDpEERERqQE05FoLxEV7ufSktlwyoA0frfqGnLwA93zwBf+csZrz+7Zm3BAfGcnxkQ5TREREIkQJXS1iZpzSKZFTOiWy6qtdTJod4JXFG3hufiGndErkWr+PoRktNc9ORESkntGQay2VkRzPxPN7Mmd8Fr89tRPLv9zJjybN57T7Z/H8/PXsL9E8OxERkfpCCV0t16JxLL8YmUHerSO456JeRHk8jH/lcwbfMZ1731/J5l37Ix2iiIiIhJmGXOuI2CgvF/RL4/y+rZm7dis5eWt5aMZqHp25lrN6pZLt99E1tUmkwxQREZEwUEJXx5gZgzq0YFCHFgS+2cPk2QFeXFjEy4uLGNyhBdl+HyMyk/B4NM9ORESkrtCQax3ma9mIv5zTnbkTRjJ+bGfWfr2H7CkLGXXvTP6TX8DeA6WRDlFERESqgRK6eiChYTTXD+vAR7eO4IFLexMfF8UfXl/KoInTufPdFWzaoXl2IiIitZmGXOuRaK+Hc3q35uxeqSxat42cvAD/nrmGx2et5Yyercj2++iZ1jTSYYqIiEgVKaGrh8yM/unN6Z/enMKte5k8u4CpCwt5/ZONDEhvRrbfx6ldU/Bqnp2IiEitoCHXeq5N84b831ldyZ+Qxe/P6MKXO/Zz/dOLGX73DCblBdhdrHl2IiIiNZ0SOgEgPi6aa4e2J/em4TxyRV+S4+P4y5vLGPT3afztzWUUbt0b6RBFRETkKDTkKt8R5fUwtkcrxvZoxSeF28nJCzB5TgGTZgcY0z2FbH97+rVrFukwRUREpAIldHJUvds05aHL+jBhbGem5Bfw3Lz1vP35Jnq3aUq238fY7ilEedXJKyIiEmn6NJbjSm3agAlju5A/YSR/Oacb2/ce4BfPfcwpd83g3zPXsGNfSaRDFBERqdfUQyeV1ig2ih8NSufKk9sxbcVmcvLWMvGdFTwwbRUX92/DNUPSIx2iiIhIvaSETqrM4zFO7ZrMqV2TWbpxBzl5AZ6Zt44p+QX0TvQS13YLJ/uaY6bbnoiIiJwIGnKVH6RbagL3Xtyb2bdmccOIjqzaVsalj83lzIfyeGVxEQdKyyMdooiISJ2nhE6qRVKTOH47OpN7hzfk7+f1oLi0nBunfor/zuk8PGM12/YciHSIIiIidZaGXKVaxXiNy09uy6UD2jBr1dfk5AX4x3sreWj6Ks7vm8a4IT46JjWOdJgiIiJ1ihI6CQuPxxiemcTwzCRWbtrFpLwALy0q4tl56xmemUi234e/Y0vNsxMREakGGnKVsMtMiefOC3syZ3wWvxnViSUbdnBVznzGPvARUxcUsr+kLNIhioiI1GpK6OSEadk4ll+NymD2+Cz+cWFPAG55+TP8d07nvg++4OtdxRGOUEREpHbSkKuccLFRXi7q34YL+6WRv2YLOXkBHpi2ikdy13BO71Syh/ronNIk0mGKiIjUGkroJGLMjMEdWzK4Y0vWfL2bybOD8+xeXFSEv2NLsv0+hnVKxOPRPDsREZFj0ZCr1AgdEhvzt3N7MHfCSG4Zk8mqzbu45skFjLpvJk/PXce+A5pnJyIicjQ1PqEzsz+Z2QYz+yT0OL1C3QQzW21mK83stEjGKdWjacMYfja8Ix/dksX9l/SmUUwUv39tCYPumMZd767gq537Ix2iiIhIjVNbhlzvc87dXbHAzLoClwLdgFTgQzPr5JxTV04dEBPl4dw+rTmndyoLCraRk7eWR2au4fGP1nJmz1Sy/T66t06IdJgiIiI1Qm1J6I7kHOB551wxEDCz1cBJQH5kw5LqZGac5GvOSb7mrN+yl8lzAkxdUMirH2/gJF9zsv0+RnVJxqt5diIiUo/V+CHXkBvM7DMzm2RmzUJlrYHCCtsUhcqkjmrboiF/PKsb+beN5PdndGHDtn389D+LyLonl8mzA+wuLo10iCIiIhFhzrlIx4CZfQikHKHqd8Bc4BvAAX8FWjnnxpnZP4G5zrmnQ8fIAd5xzr10hONfB1wHkJiY2G/q1Knh+UOE3bt307jxiflpr7Jyx6LNZbxfUMLq7eU0iIJhadGc2i6KFg1qy3eVqjuRbVxfqY3DT20cfmrj8DpR7TtixIhFzrn+x9uuRiR0lWVm6cCbzrnuZjYBwDk3MVT3HvAn59wxh1wzMzPdypUrwx1qvZWbm8vw4cNP+Hk/Xr+NnLwA7yzZBMCY7ilk+330bdvsOHvWPpFq4/pEbRx+auPwUxuH14lqXzOrVEJX4+fQmVkr59yXodXzgCWh5TeAZ83sXoIXRWQA8yMQotQAfdo245+XN2PD9n1MmVPAc/PX89ZnX9KnbVOu9bfntG7JRHnrbq+diIjUbzU+oQPuMrPeBIdcC4CfAjjnlprZVGAZUAr8XFe4SuumDbjt9C78cmQGLy0sZPKcAn7+7GJaN23Ajwenc8lJbWgSFx3pMEVERKpVjU/onHNXHaPuduD2ExiO1BKNY6P48RAfVw1KZ9ryr8jJC3D728u5/8MvuKh/G8YN8dG2RcNIhykiIlItanxCJ/JDeD3G6G4pjO6WwpINO8jJC/D03HVMyS9gdNdksv3tGZDeDDPd9kRERGovJXRSb3RvncB9l/Rm/NjOPJVfwDPz1vPe0q/o0TqBbL+P03u0IiZK8+xERKT20aeX1DvJTeK4+bTO5I8fye3ndWfPgVJ+/cInDL1rOg/PWM32vQciHaKIiEiVqIdO6q0GMV6uOLkdlw1oy8wvviYnL8A/3lvJQ9NXcWG/NK4Z4qNDou7hJCIiNZ8SOqn3PB5jROckRnROYsWmnUzKCzB1QRFPz11PVucksv0+BndooXl2IiJSY2nIVaSCzilNuOvCXswen8WvRmbwaeF2rnhiHmMf+IgXFxZSXKo744iISM2jhE7kCBLjY/nNqZ2YPT6Luy7oiXNw80ufMeSOGTzw4Sq+2V0c6RBFRES+pSFXkWOIi/Zy8YA2XNQ/jdmrt5CTt5b7PvyCh3NXc17v1ozz+8hMiY90mCIiUs8poROpBDPDn9ESf0ZLVm/ezaTZAV5ZXMQLCwsZmtGScX4fwzIS8Xg0z05ERE48DbmKVFHHpMb8/bwe5I8fyc2nZbJy0y6umbyA0ffP4tl569lfonl2IiJyYimhE/memjWK4ecjOpJ3axb3XdKL2CgPt736OYMmTuPu91ayeef+SIcoIiL1hIZcRX6gmCgP5/VJ49zerZkX2EpOXoCHc1fz71lrOKtXKtl+H91SEyIdpoiI1GFK6ESqiZkxsH0LBrZvQcE3e3hyTgFTFxbyyuINDGzfnGx/e0Z2TtI8OxERqXYachUJg/SWjfjT2d3InzCS207vzPote/nJUwvJuieXKXMK2FNcGukQRUSkDlFCJxJGCQ2iue6UDsy6ZQQPXdaHpg1j+OMbSxk0cRoT317Oxu37Ih2iiIjUARpyFTkBorwezuqVylm9Ulm0bhuT8gI8/tFansgLcHqPVmT7ffRu0zTSYYqISC2lhE7kBOvXrhn92jWjcOtepswp4IUFhfz30430a9eMbL+P0V2TifKq81xERCpPnxoiEdKmeUN+f2ZX8m8byf+d2ZXNu/bzs2cWM/zuXJ74aC279pdEOkQREakllNCJRFjj2CjG+X3k3jSCR6/sR2pCA/721nIGTZzOX/67jMKteyMdooiI1HAachWpIbweY0z3FMZ0T+Hzoh3k5K3lqfwCnpwTYHTXFLKH+ujfrlmkwxQRkRpICZ1IDdQjLYH7L+3D+LFdmJJfwLPz1vPu0k30TEtgcPNShpSVE615diIiEqJPBJEaLCUhjlvHdCZ/QhZ/Pbc7u/eX8uhnxZxy1wweyV3Djr2aZyciIkroRGqFhjFRXDWwHR/eOIxf943F17IRd767goETp/GH15aw9uvdkQ5RREQiSEOuIrWIx2P0Tori1xcPZNnGnUyaHeCFBYU8PW8dIzsnMc7vY1D7Fpjp58VEROoT9dCJ1FJdU5tw90W9yBs/gl9kZfDx+u1c/vg8zngwj5cWFVFcWhbpEEVE5ARRQidSyyXFx3HjqZ2YPT6LOy/oQWl5OTe9+Cn+O2fw4LRVbNldHOkQRUQkzDTkKlJHxEV7uWRAWy7u34aPVn1DTl6Aez/4godnrOb8vq0ZN8RHRnJ8pMMUEZEwUEInUseYGad0SuSUToms+moXk2YX8MriIp6bX8gpnRLJ9vs4JaOl5tmJiNQhGnIVqcMykuOZeH4P8ieM5LendmL5lzu5etJ8Rt83i+fnr2d/iebZiYjUBUroROqB5o1i+MXIDPJuHcE9F/Ui2uth/CufM/iO6dz7/ko279of6RBFROQH0JCrSD0SG+Xlgn5pnN+3NXPXbiUnL8BDM1bz6My1nNUrlWy/j66pTSIdpoiIVJESOpF6yMwY1KEFgzq0IPDNHibPDvDiwiJeXlzE4A4tyPb7GJGZhMejeXYiIrWBhlxF6jlfy0b85ZzuzJ0wkvFjOxP4Zg/ZUxYy6t6Z/Ce/gL0HSiMdooiIHIcSOhEBIKFhNNcP68CsW0bw4GV9iI+L4g+vL2XQxOnc8c4KvtyxL9IhiojIUWjIVUS+I9rr4exeqZzVsxWL1m0jJy/AY7PW8MRHazmjZyuy/T56pjWNdJgiIlKBEjoROSIzo396c/qnN6dw616enFPACwsKef2TjQxIb0a238epXVPwap6diEjEachVRI6rTfOG/OHMruRPyOL3Z3Thyx37uf7pxQy/ewaT8gLsLtY8OxGRSFJCJyKVFh8XzbVD2zPz5hE8ckVfkuPj+Mubyxj092n87c1lFG7dG+kQRUTqJQ25ikiVeT3G2B6tGNujFZ8WbicnL8DkOQVMmh1gTPdiWw/VAAAgAElEQVQUsv0++rZtpp8XExE5QZTQicgP0qtNUx68rA/jx3ZmSn4Bz81bz9ufb6JXm6Zk+32M7Z5CtFeDASIi4aR3WRGpFqlNGzBhbBfyJ4zkL+d0Y8feA/zyuY8ZdtcM/j1zDTv2lUQ6RBGROuu4PXRmduOx6p1z91ZfOCJS2zWKjeJHg9K58uR2TF+xmZy8ABPfWcED01ZxUb80rhniI71lo0iHKSJSp1RmyDU+9JwJDADeCK2fBcwPR1AiUvt5PMaorsmM6prM0o07yMkL8Oz89Tw1dx2juiST7fdxsq+55tmJiFSD4w65Ouf+7Jz7M5AG9HXO/dY591ugH9C2OoIws4vMbKmZlZtZ/8PqJpjZajNbaWanVSgfEypbbWbjqyMOEQmPbqkJ3Htxb2bfmsUNIzqysGArlz42lzMfyuOVxUUcKC2PdIgiIrVaVebQJQMHKqwfCJVVhyXA+cCsioVm1hW4FOgGjAH+ZWZeM/MCDwNjga7AZaFtRaQGS2oSx29HZ5I/YSQTz+9BcWk5N079FP+d03l4xmq27Tlw/IOIiMj/qMpVrk8B883s1dD6ucCU6gjCObccONLQyznA8865YiBgZquBk0J1q51za0P7PR/adll1xCMi4RUX7eWyk9py6YA2zPzia3LyAvzjvZU8NH0V5/dNY9wQHx2TGkc6TBGRWqPSCZ1z7nYzewcYGiq6xjn3cXjC+lZrYG6F9aJQGUDhYeUnhzkWEalmZsbwzCSGZybxxVe7mJQX4KVFRTw7bz3DMxPJ9vvwd2ypeXYiIsdR1fvQBUL7xAHxZnaKc27WcfYBwMw+BFKOUPU759zrVYyjSszsOuA6gMTERHJzc8N5unpt9+7dat8wq8ttPKYFDD4ljhnrS5gW+IbclV+T1tg4NT2aQa2iiPGemMSuLrdxTaE2Dj+1cXjVtPatdEJnZtcCvyJ4ccQnwEAgH8iqzP7OuVHfI74NQJsK62mhMo5RfqRzPwY8BpCZmemGDx/+PUKRysjNzUXtG171oY3PBopLy3jjk43BX6FYsos3AnDlwHZcObAdifGxYT1/fWjjSFMbh5/aOLxqWvtW5aKIXxG8bck659wIoA+wPSxRHfIGcKmZxZqZD8ggeKuUBUCGmfnMLIbghRNvHOM4IlLLxEZ5uah/G9751VCevfZkerdpygPTVjHkjunc/OKnrNi0M9IhiojUGFUZct3vnNtvZphZrHNuhZllVkcQZnYe8BCQCLxlZp84505zzi01s6kEL3YoBX7unCsL7XMD8B7gBSY555ZWRywiUrOYGYM7tmRwx5as/Xo3k2cX8NKiIl5cVIS/Y0uy/T6GdUrE49E8OxGpv6qS0BWZWVPgNeADM9sGrKuOIJxzrwKvHqXuduD2I5S/DbxdHecXkdqhfWJj/npud347ulPwJsVz1nHNkwton9iIcUN8XNA3jQYx3kiHKSJywlUqobPgJWa/dM5tB/5kZjOABODdcAYnInIkTRvG8LPhHfnJ0Pa8/fmX5OQF+P1rS7j7/ZVcflJbfjQonZSEuEiHKSJywlQqoXPOOTN7G+gRWp8Z1qhERCoh2uvhnN6tObtXKgvXbeOJj9byyMw1PDZrLWf2bEW2vz090hIiHaaISNhVZch1sZkNcM4tCFs0IiLfg5kxIL05A9Kbs37LXibPCTB1QSGvfbKRk3zNyfb7GNUlGa/m2YlIHVWVhO5k4AozWwfsAYxg513PsEQmIvI9tG3RkD+e1Y3fnNqJqQsKmTy7gJ/+ZxHtWjTkx4PTuah/GxrHVvUWnCIiNVtV3tVOC1sUIiLVrElcNNcObc+PB6fz/rKveOKjtfz5v8u494MvuOyktlw9OJ3WTRtEOkwRkWpRlZ/+qpYrWkVETqQor4fTe7Ti9B6t+Hj9NnLyAt8+xnRPIdvvo2/bZpEOU0TkB9G4g4jUG33aNuOflzdjw/Z9PDWngGfnr+etz76kT9umZPt9jOmWQpS3KvdbFxGpGZTQiUi907ppAyac3oVfjszgxYWFTJ5TwA3Pfkzrpg348eB0Wpe4SIcoIlIlSuhEpN5qFBvFj4f4uGpQOtOWf0VOXoDb315OnBfm71vKNUPSadeiUaTDFBE5rkondGYWC1wApFfczzn3l+oPS0TkxPF6jNHdUhjdLYUlG3bw95fn8sy8dUzJL+DULslcO7Q9A9KbEbzHuohIzVOVHrrXgR3AIqA4POGIiERW99YJXNczlvv6DuSp/AKembee95d9RY/WCWT7fZzeoxUxUZpnJyI1S1USujTn3JiwRSIiUoMkN4nj5tM6c8OIDF75uIhJeQF+/cInTHxnOT8alM4VJ7elacOYSIcpIgJAVb5mzjGzHmGLRESkBmoQ4+WKk9vxwW+GMfmaAXRKjucf761k4MRp/O7Vz1nz9e5IhygiUqUeOj9wjZmtJTjkql+KEJF6w+MxRmQmMSIziRWbdjIpL8CLi4p4Zt56sjonke33MbhDC82zE5GIqEpCN4ZQEhemWEREaoXOKU2468Je3DKmM0/PXcfTc9dxxRPz6JwSzzi/j3N6pxIb5Y10mCJSjxx3yNXM8kKLS4HPgSWhx9LQs4hIvdSycSy/HtWJvFuzuOuC4GDFLS99xpA7pvPAh6v4ZreuHxORE+O4PXTOOX/oOT784YiI1D5x0V4uHtCGi/qnMXv1FnLy1nLfh1/wcO5qzuvdmnF+H5kpegsVkfDRjYVFRKqJmeHPaIk/oyWrN+9m8uwALy8u4oWFhQzNaMk4v49hGYl4PJpnJyLVSzdTEhEJg45Jjbn9vB7kjx/JzadlsnLTLq6ZvIDR98/imXnr2HegLNIhikgdooRORCSMmjWK4ecjOpJ3axb3XdKLuGgPv3t1CYPvmMbd761k8879kQ5RROqAKg+5mlkjYL9zTl8vRUQqKSbKw3l90ji3d2vmB7aSkxfg4dzV/HvWGs7qmco4v4/urRMiHaaI1FLHTejMzANcClwBDCB4D7pYM/sGeAv4t3NudVijFBGpI8yMk9u34OT2LSj4Zg9Pzilg6sJCXvl4AwPbNyfb356RnZM0z05EqqQyQ64zgA7ABCDFOdfGOZdE8EbDc4E7zezKMMYoIlInpbdsxJ/O7kb+hJHcdnpnCrfu4ydPLSTrnlymzClgT3FppEMUkVqiMkOuo5xzJYcXOue2Ai8DL5tZdLVHJiJSTyQ0iOa6UzowboiPd5duIicvwB/fWMo976/kspPacvXgdFKbNoh0mCJSg1XmPnTfJnNmFuWcK62w3tY5t/5ICZ+IiFRNlNfDmT1TObNnKovWbWNSXoDHP1rLE3kBTu/Rimy/j95tmkY6TBGpgSp1UYSZ/QS4CWhiZg2AxcBtwL+AvuELT0SkfurXrhn92jWjaNtepswp4Pn5hfz30430a9eMbL+P0V2TifLqRgUiElSZiyJuBfoDw5xzm0Jlo4HHgbbhDU9EpH5La9aQ353RlV+N6sSLCwuZNDvAz55ZTOumDbhmSDoXD2hDkzjNehGp7yrz9e4a4PKDyRyAc+59YBTwYbgCExGRQxrHRnHNEB+5N43g0Sv70bppA/721nIGT5zOX/67jMKteyMdoohEUKWGXI9yUcRXZvZQ9YckIiJH4/UYY7qnMKZ7Cp8X7SAnby1P5Rfw5JwAo7umkD3UR/92zTDTbU9E6pPK9NCtMbMzDi80s78A06o/JBERqYweaQncf2kf8m7N4vphHchfu4WLHs3nnIdn8/onGygpK490iCJyglQmofsZ8Gcze9HMfm9md5jZZ0A6sDKs0YmIyHGlJMRxy5jO5E/I4q/ndmf3/lJ+9fwnnHLXDB7JXcOOvboRgUhdV5nblqwzswHAaUAXYCdwpXPus9AFEyIiUgM0jIniqoHtuOKktuR+sZmcvAB3vruCB6et4sJ+aVwzJJ32iY0jHaaIhEFlrnI155wD3g09vuWcu/OwbUREJMI8HiOrczJZnZNZtnEnk2YHeGFBIU/PW0dWZhLZQ30Mat9C8+xE6pBK/fSXmf3CzL5zixIzizGzLDObAlwdnvBEROSH6JrahLsv6kXe+BH8IiuDTwq3c/nj8zj9wTxeWlREcWlZpEMUkWpQmYRuDFAGPGdmG81smZkFgFXAZcD9zrknwxijiIj8QEnxcdx4aidmj8/izgt6UFZezk0vfor/zhk8OG0VW3YXRzpEEfkBKjOHbj/wLzN7BBgAxAGfOud2hDs4ERGpXnHRXi4Z0JaL+7chb/U3PPFRgHs/+IKHZ6zm/L6tGTfER0ZyfKTDFJEqqtR96EJeBdKAQqCrmc0GbnDO6W6WIiK1jJkxNCORoRmJrN68i5y8Al5ZXMRz8ws5pVMi2X4fp2S01Dw7kVqiKj8E2B24AbjEOZcJ5AGPhCUqERE5YTomxTPx/B7kTxjJTaM7sfzLnVw9aT6j75vFc/PXs79E8+xEarqqJHR3ALcAy83sc4I//TXKzEabWVJYohMRkROmeaMYbsjKIO/WEdxzUS+ivR4mvPI5g++Yzr3vr2Tzrv2RDlFEjqIqCd1ZwFTnXAfADzwKeIGLgXfCEJuIiERAbJSXC/ql8dYv/Tz3k4H0bduMh2asxn/HDH479VOWbdwZ6RBF5DBVmUN3LTDZzCYAS4BM4F3n3LVhiUxERCLKzBjUoQWDOrQg8M0enpwd4MVFRby8uIhB7VuQ7feR1TkJj0fz7EQirdIJnXPua+BMM2tNcD7dDufc3LBFJiIiNYavZSP+fE53bjw1k+cWrGfKnAKufWoh7Vs24poh6VzQL42GMVXpIxCR6lSVIVcAnHMbnHPvKZkTEal/EhpGc/2wDsy6ZQQPXtaH+AbR/OH1pQyaOJ073lnBlzv2RTpEkXqpygldOJjZRWa21MzKzax/hfJ0M9tnZp+EHo9WqOtnZp+b2Woze9B0bb2IyAkT7fVwdq9UXvvZYF7+f4MY0rEFj81aw9A7Z/Cr5z/ms6LtkQ5RpF6pKf3jS4DzgX8foW6Nc673EcofAX4CzAPeJviLFro4Q0TkBDIz+rVrTr92zSncupcn5xTwwoJCXv9kIwPSm5Ht93Fq1xS8mmcnElY1oofOObfcObeystubWSugiXNurnPOAU8B54YtQBEROa42zRvyhzO7kj8hiz+c2ZUvd+zn+qcXM/zuGeTkBdi1vyTSIYrUWTUioTsOn5l9bGYzzWxoqKw1UFRhm6JQmYiIRFh8XDTZfh8zbx7BI1f0JTk+jr++uYzBE6fz1zeXUbhVPzAkUt0s2MF1Ak5k9iGQcoSq3znnXg9tkwvc5JxbGFqPBRo757aYWT/gNaAb0Am4wzk3KrTdUOBW59yZRzn3dcB1AImJif2mTp1arX+bHLJ7924aN24c6TDqNLVx+KmNq9/aHWW8X1DCgk1llDvo3cJxescGdGzq0c+LhYlex+F1otp3xIgRi5xz/Y+33QmbQ3cw+ariPsVAcWh5kZmtIZjMbSD4u7IHpYXKjnacx4DHADIzM93w4cOrGopUUm5uLmrf8FIbh5/auPoNB8YBX+7Yx5Q563hq9ho+nrefXm2aku33MbZ7CtHe2jBoVHvodRxeNa19a8pFEUdkZonAVudcmZm1BzKAtc65rWa208wGErwo4kfAQ5GMVUREjq9VQgPGj+1Mn+gv2dzIx6TZBfzyuY9JTYjj6sHpXHpSWxIaREc6TJFap0Z8HTKz88ysCBgEvGVm74WqTgE+M7NPgJeA651zW0N1PwOeAFYDa9AVriIitUZslHHVoHSm3TiMJ37Un3YtGjHxnRUMmjiNP76+hIJv9kQ6RJFapUb00DnnXgVePUL5y8DLR9lnIcFfrBARkVrK4zFGdU1mVNdklm7cwaS8Ap6dv56n5q5jZOdksv0+BrZvrnl2IsdRI3roREREuqUmcM/FvZh9axY3jOjI4vXbuOzxuZz5UB6vLC7iQGl5pEMUqbGU0ImISI2S1CSO347OZM74LCae34MDpeXcOPVT/HdO55/TV7F1z4FIhyhS49SIIVcREZHDxUV7ueyktlw6oA2zVn1DTl6Au9//goemr+b8vmlk+9PpmBQf6TBFagQldCIiUqOZGcM6JTKsUyJffLWLSXkBXl5cxHPz1zM8M5Fsvw9/x5aaZyf1moZcRUSk1uiUHM8dF/Qkf3wWN57aiSUbdnJVznzG3P8RLyxYz/6SskiHKBIRSuhERKTWadE4ll+OzGD2+BHcfVEvzODWlz9nyB3TufeDL/h6V3GkQxQ5oTTkKiIitVZslJcL+6VxQd/W5K/ZQk5egAenreLR3DWc0zuV7KE+Oqc0iXSYImGnhE5ERGo9M2Nwx5YM7tiStV/vZvLsAl5aVMSLi4oY0rEF2X4fwzsl4fFonp3UTRpyFRGROqV9YmP+em538idkceuYzqzZvIdxTy5k1H0zeXruOvYd0Dw7qXuU0ImISJ3UtGEM/294Bz66dQQPXNqbxrFR/P61JQy6Yxp3vbuCTTv2RzpEkWqjIVcREanTor0ezundmrN7pbJw3TZyPgrw6Mw1PDZrLWf2bEW2vz090hIiHabID6KETkRE6gUzY0B6cwakN2f9lr1MnhNg6oJCXvtkIyf5mpPt9zGqSzJezbOTWkhDriIiUu+0bdGQP57VjfzbRvL7M7qwYds+fvqfRYy4O5fJswPsLi6NdIgiVaKETkRE6q0mcdFcO7Q9M28ezr+u6EtifCx//u8yBk2cxu1vLaNo295IhyhSKRpyFRGRei/K6+H0Hq04vUcrPincTk5egEmzC5g0u4Ax3VPI9vvo27ZZpMMUOSoldCIiIhX0btOUhy7rw/ixnXlqTgHPzl/PW599SZ+2Tcn2+xjTLYUorwa4pGbRK1JEROQIWjdtwITTuzB3wkj+fHY3tu05wA3Pfsywf+Ty+Ky17NxfEukQRb6lhE5EROQYGsVGcfXgdKb9djiPXdWPtGYNuP3t5Qz6+zT+9MZS1m3ZE+kQRTTkKiIiUhlejzG6Wwqju6WwZMMOJuUFeGbeOqbkF3Bql2Sy/T5O8jXHTLc9kRNPCZ2IiEgVdW+dwL2X9ObWsZ35T/46npm3jveXfUX31k3I9vs4o0cqMVEaBJMTR682ERGR7ym5SRw3nZbJnPEj+ft5Pdh3oIzfvPApQ++azsMzVrN974FIhyj1hHroREREfqAGMV4uP7ktlw5ow8xVXzMpL8A/3lvJQ9NXcUHfNMb5fXRIbBzpMKUOU0InIiJSTTweY0RmEiMyk1i5aReT8gK8uKiIZ+atJ6tzEtl+H4M7tNA8O6l2GnIVEREJg8yUeO68sCdzxmfx61EZfFa0nSuemMfYBz5i6sJCikvLIh2i1CFK6ERERMKoZeNYfj2qE3m3ZnHXhT0BuOWlzxhyx3Tu//ALvtldHOEIpS7QkKuIiMgJEBft5eL+bbioXxqzV28hJ28t93+4in/lruHc3qlk+9uTmRIf6TClllJCJyIicgKZGf6MlvgzWrJ6824mzw7w8uIipi4sYmhGS8b5fQzLSMTj0Tw7qTwNuYqIiERIx6TG3H5eD/LHj+Tm0zL54qtdXDN5AafeN5Nn5q1j3wHNs5PKUUInIiISYc0axfDzER356JYs7r+kNw1ivPzu1SUMvmMad7+3ks0790c6RKnhNOQqIiJSQ8REeTi3T2vO6Z3K/MBWcvICPJy7mn/PWsNZPVMZ5/fRvXVCpMOUGkgJnYiISA1jZpzcvgUnt2/Bui17mDy7gKkLC3nl4w2c7GtOtt/HyC7JeDXPTkI05CoiIlKDtWvRiD+d3Y38CSO57fTOFG3bx3X/WUTWPblMmVPAnuLSSIcoNYASOhERkVogoUE0153SgZk3D+efl/eheaMY/vjGUgZNnMbEt5ezcfu+SIcoEaQhVxERkVokyuvhzJ6pnNkzlcXrt5GTF+CJ0GNs9xSuHdqe3m2aRjpMOcGU0ImIiNRSfds2o+/lzSjatpcpcwp4fn4hb372Jf3aNWNgs1L8ZeVEeTUYVx/oX1lERKSWS2vWkN+d0ZX820byx7O68vWuYh7+pJhh/8jliY/WsnN/SaRDlDBTQiciIlJHNI6N4pohPmbcNJxf9ImlddMG/O2t5QyeOJ2//HcZhVv3RjpECRMNuYqIiNQxXo/RLzmK314yiM+LdpCTt5an8gt4ck6A0V1TyB7qo3+7Zpjptid1hRI6ERGROqxHWgL3X9qH8WO78FR+Ac/OX8+7SzfRMy2BbL+P03u0Ilrz7Go9/QuKiIjUAykJcdwypjP540fyt3O7s7u4lF89/wlD75zBI7lr2LFX8+xqMyV0IiIi9UiDGC9XDmzHh78ZxqQf96dDUiPufHcFAydO4w+vLWHt17sjHaJ8DxpyFRERqYc8HiOrczJZnZNZ/uVOJuUFeGFBIU/PW0dWZhLZQ30Mat9C8+xqCfXQiYiI1HNdWjXhHxf1Yvb4LH6RlcEnhdu5/PF5nP5gHi8tKqK4tCzSIcpx1IiEzsz+YWYrzOwzM3vVzJpWqJtgZqvNbKWZnVahfEyobLWZjY9M5CIiInVHYnwsN57aidnjs7jzgh6UlZdz04uf4r9zBg9OW8WW3cWRDlGOokYkdMAHQHfnXE/gC2ACgJl1BS4FugFjgH+ZmdfMvMDDwFigK3BZaFsRERH5geKivVwyoC3v/foU/pN9Et1Sm3DvB18w+I7pjH/5M774alekQ5TD1Ig5dM659yuszgUuDC2fAzzvnCsGAma2GjgpVLfaObcWwMyeD2277ASFLCIiUueZGUMzEhmakcjqzbuYNLuAlxcV8fyCQk7plEi238cpGS01z64GqCk9dBWNA94JLbcGCivUFYXKjlYuIiIiYdAxKZ6/n9eD/AkjuWl0J1Z8uZOrJ81n9H2zeG7+evaXaJ5dJJlz7sScyOxDIOUIVb9zzr0e2uZ3QH/gfOecM7N/AnOdc0+H6nM4lOyNcc5dGyq/CjjZOXfDUc59HXAdQGJiYr+pU6dW418mFe3evZvGjRtHOow6TW0cfmrj8FMbh1+427i03DHvy1LeX1fKup3lxEfDiLbRZLWNomlsTewvql4n6jU8YsSIRc65/sfb7oQNuTrnRh2r3sx+DJwJjHSHsswNQJsKm6WFyjhG+ZHO/RjwGEBmZqYbPnx4VUKXKsjNzUXtG15q4/BTG4ef2jj8TkQbjwJuc465a7eSkxfgvyu+4t2CMs7qlUq230fX1CZhPX8k1bTXcI2YQ2dmY4BbgGHOuYq/HPwG8KyZ3QukAhnAfMCADDPzEUzkLgUuP7FRi4iIiJkxqEMLBnVoQeCbPTw5O8CLi4p4eXERg9q3INvvI6tzEh6P5tmFU41I6IB/ArHAB6GJlXOdc9c755aa2VSCFzuUAj93zpUBmNkNwHuAF5jknFsamdBFREQEwNeyEX8+pzs3nprJ8wvWM2VOAdc+tRBfy0ZcMySdC/ul0TCmpqQedUuNaFXnXMdj1N0O3H6E8reBt8MZl4iIiFRdQsNofjqsA+P8Pt5dsokn8gL83+tLuef9L7jspLZcPbgdrRIaRDrMOqVGJHQiIiJS90R7PZzVK5Uze7Zi8fpt5OQFeGzWGp74aC2n92hFtt9HrzZNj38gOS4ldCIiIhJWZka/ds3p1645hVv3MmVOAc8vKOSNTzcyIL0Z2X4fp3ZNwat5dt9b3b+uWERERGqMNs0b8vszu5I/IYs/nNmVTTv3c/3Tixl+9wxy8gLs2l8S6RBrJSV0IiIicsLFx0WT7feRe9MIHr2yLylN4vjrm8sYPHE6f31zGYVb9x7/IPItDbmKiIhIxHg9xpjurRjTvRWfFW0nJy/AlDkFTJ4dYEz3FLL9Pvq2baafFzsOJXQiIiJSI/RMa8oDl/Zh/NjOTJmzjufmr+ftzzfRq01Tsv0+xnZPIdqrwcUjUauIiIhIjdIqoQHjx3Ymf0IWfz2nGzv3lfDL5z7mlLtm8OjMNezYq3l2h1NCJyIiIjVSw5gorhqUzrQbh5FzdX/SWzTijndWMOiOafzx9SUUfLMn0iHWGBpyBUpKSigqKmL//v2RDqXWS0hIYPny5ZEOI+zi4uJIS0sjOjo60qGIiNR5Ho8xsksyI7sks3Tjjv/f3t2HVVXm+x9/32xUVFAL0RQssBR5cLN9AEFoxHyKsjqJSPnraOI0da60YzYk09MZxuaUZU7m2PE6HU0zS0xzso7nV0OmmamII2WKpI1oFHMi8gFMRHL9/oD2T5RkC8Jmw+d1XVzX3mvf+17f9fVWv9zrXmux7JNC3sg5yms7jjBqQE+mJ4QQ2/fqNr3OTgUdUFRUhJ+fH8HBwW16MFwJZWVl+Pn5uTuMJmVZFqWlpRQVFRESEuLucERE2pSI3l15YVIUc5JCeX37EV7feZTsV/6XiN5dmJ4Qwnh7b9p7t70TkG3viOtQUVGBv7+/ijlxiTEGf39/zeiKiLhRDz8fZo8N5dOMm3hmwkAqq84xe81nJMzbxJ83HeSHU5XuDrFZaYauhoo5uRwaLyIiLYNPOxt3x1zLXdF9+Pjg9yz95DDzP/iSRZsOMWFwENMTgrmhR+s+cwSaoZMm9O233zJx4sRG91NYWIgxhkWLFjm3zZgxg+XLl7v0/dLSUkaOHImvry8zZsyo9VliYiKhoaE4HA4cDgffffcdAAsWLCA8PBy73c6oUaM4cuRIo49DRESajjGGEf0DeC0thr8+/CsmDA7k7b8VMXrBx0xdlsPWgyVYluXuMJuMCro2pKqqqln77d27N2vXrr0i++jRowcLFy6ksvLyp9B9fHyYO3cu8+fPr/PzVatWkZeXR15eHj169ABg0KBB5Obm8vnnnzNx4kQeffTRRsUvIiLNp19PP56ZYOfTjJuYPaY/+749yT8vzeHmF7eStesoFWd/cneIV5wKuhagsLCQsLAw7rvvPiIiIhg7diynT58GIC8vj9jYWOx2OwYEXLsAABM1SURBVHfeeSfHjh0DqmeW5syZQ0xMDP3792fr1q119p2YmMisWbMYOnQoCxcupKSkhOTkZKKjo4mOjmbbtm0AlJeXM23aNAYOHIjdbmfdunUA+Pr6Ovtau3Yt9957LwD33nsvDzzwAMOGDePRRx9ly5YtOBwO4uPjGTRoEGVlZRQWFhIZGQlAbGws+/btqxVXbm4up06dIi0tjZiYGAYNGsQ777xT53EEBAQwatQoVqxYcdn57dy5MwkJCfj4+Lj8nZEjR9KpUydn7EVFRZe9XxERcS9/3w48NKof2zJGMj8lCi8vw5x1e4l/dhML/volJWVn3B3iFaM1dBfIfHcf+789eUX7DO/dhX+7LeKSbQ4ePMibb77JK6+8wqRJk1i3bh333HMPU6ZMYdGiRYwYMYKnnnqKzMxMXnzxRaB6ZiwnJ4eNGzeSmZlJdnZ2nX1XVlaSm5sLwOTJk3n44YdJSEjg6NGjjBs3jvz8fObOnUvXrl3Zu3cvgLNwvJSioiI+/fRTbDYbt912G4sXL8Zut2OMuah4Sk1NZc2aNWRmZlJcXExxcTFDhw7lscce46abbmLZsmUcP36cmJgYRo8eTefOnS/a35w5c0hKSiItLa3W9ueff55Vq1Zd1P5Xv/oVL730Ur3HMW3aNGw2G8nJyTzxxBMXrY9bunQpSUlJ9fYjIiItUwdvGxOHBJE8OJDtfy9l6dbDvPThQZZs/oo7HL2ZfmMIA67p4u4wG0UFXQsREhKCw+EAYMiQIRQWFnLixAmOHz/OiBEjAJg6dSopKSnO70yYMKFW+1+SmprqfJ2dnc3+/fud70+ePEl5eTnZ2dmsXr3auf2qq66qN+aUlBRsNhsA8fHxzJ49m+TkZCZPnkxQUFCttpMmTWLs2LFkZmayZs0a59q6Dz74gA0bNjhPh1ZUVHD06FHCwsIu2l/fvn0ZNmwYb7zxRq3t6enppKen1xtvXVatWkVgYCBlZWUkJyezcuVKpkyZ4vz89ddfJzc3ly1btjSofxERaTmMMQy/vjvDr+/O30vKeXVbIWt3F/HW7iLib/BnekIIif174OXleRe+qaC7QH0zaU2lQ4cOztc2m815ytWV79hsNuc6tmnTprFnzx569+7Nxo0bAWrNdp07d44dO3a4fPrx/NmqC2/TcX6/GRkZ3Hrrraxfv574+Hjef//9WvsIDAzE39+fzz//nKysLJYsWQJU39Nt3bp1hIaGuhTPY489xsSJE51FLjRuhi4wMBAAPz8/Jk+eTE5OjrOgy87O5o9//CNbtmyp9ecjIiKer2+AL3P/KZJHxvbnzZyvWfFpIWnLc+kb0Jlp8SEkDw6kU3vPKZO0hq4F69q1K1dddZVzfdzKlStrFTJ1efXVV8nLy3MWcxcaO3ZsratF8/LyABgzZgyLFy92bv/5lGvPnj3Jz8/n3LlzrF+//hf3+9VXXzFw4EAefvhhoqOjOXDgwEVtUlNTee655zhx4gR2ux2AcePGsWjRIueVR3v27Lnk8Q0YMIDw8HDeffdd57b09HTnRQ3n/9RXzFVVVfH9998D1U8Lee+995xr/vbs2cP999/Phg0bnBdKiIhI69OtU3v+JfF6ts4ZycK7HPh28ObJv3xB3DObeO7/HuAfJzzjnqMq6Fq4FStWkJ6ejt1uJy8vj6eeeqpR/b300kvk5uZit9sJDw93zpQ98cQTHDt2jMjISKKiovjoo48AePbZZxk/fjzDhw+nV69ev9jviy++SGRkJHFxcbRr167ONWcTJ05k9erVTJo0ybntySef5OzZs9jtdiIiInjyySfrPYbHH3/8si9SCA4OZvbs2SxfvpygoCD279/PmTNnGDduHHa7HYfDQWBgIPfddx9QXSSWl5eTkpKCw+Hg9ttvv6z9iYiIZ2ln8+IORyDvPBjPWw/EEdfXnyVbviJh3iZmrd7D3qIT7g7xkkxrvidLXUJDQ62CgoJa2/Lz8+tcsyWXry08+utn7ho3mzdvJjExsdn325Yox01POW56ynHjff3Dj7y6rZA1uV9TfqaKmOCrmX5jCKPDerL14y3Nkl9jzG7LsobW185zTg6LiIiINKM+V3fiqdvCmTWmH2t2fc2r2wq5f+Vurr26Ezf2qGLomSp8O7SMUkqnXEVEREQuoYtPO359Y1+2pCfy8v8ZTIBfB1YdqCTumQ/543/vp+jYj+4OUTN0IiIiIq7wtnlxy8Be3DKwF8v+8iF7Tl/Nsm2FLNtWyM0R15CWEMKQ6+q/7VeTxOaWvYqIiIh4sL7dbKT90yB+lzSAFdsLeWPnUf57bzGDru3G9IQQbo64Bm9b850I1SlXERERkQbq3a0jv0sKY8fvRpF5ewTHTlUy4409jHh+M//58VecOH22WeJQQSciIiLSSJ07eDN1eDAfPpLIK1OG0ufqjvz7xgMMf+ZDfr9hH0dKTzXp/lXQCUuWLOG1115rdD+///3v6dmzJ999951zm6+vr8vff+utt4iIiMDLy8v57FmAnJwcHA4HDoeDqKioS97gWERExJ1sXoYx4T1Z/Zs43puZwLiIa1i18wiJ8zfzm9dy2fn3UprilnFaQ9fCWJaFZVl4eV35Wvunn35yPnv1fA888MAV24e/vz8vvPAC8+bNu+zvRkZG8vbbb3P//fdftD03Nxdvb2+Ki4uJioritttuw9tbw1dERFquyMCuLEh1MCdpACu3H2HVziN8sP9/iQzswvSEEG4d2Jv23lfm/3vN0LUAhYWFhIaGMmXKFCIjI/n666/54IMPiIuLY/DgwaSkpFBeXg7Arl27GD58OFFRUcTExFBWVsby5cuZMWOGs7/x48ezefNmoHqG7JFHHiEqKort27eTkZFBeHg4drud3/72t0D1zNr8+fM5cOAAMTExteIaOHAgALt372bEiBEMGTKEcePGUVxcXOex3HPPPWRlZfHDDz9cdh7CwsLqfKZrp06dnMVbRUVFrefLioiItHQ9u/jw23GhfJoxin+/cyAVZ8/xcNZn3PjcJhZ/dIhjpyobvQ9NcVzofzLgH3uvbJ/XDISkZy/Z5ODBg6xYsYLY2Fi+//57nn76abKzs+ncuTPz5s1jwYIFZGRkkJqaSlZWFtHR0Zw8eZKOHTtest9Tp04xbNgwXnjhBUpLS5k+fToHDhzAGMPx48drtR0wYACVlZUcPnyYkJAQsrKySE1N5ezZs8ycOZN33nmHgIAAsrKyePzxx1m2bNlF+/P19SUtLY2FCxeSmZlZ67Mbb7yRsrKyi74zf/58Ro8efcnj2LlzJ2lpaRw5coSVK1dqdk5ERDxOx/Y2Jg+7lrui+/DxwRKWfnKY598vYNGmgyQPDiItIYTrA1xfqnQ+/a/YQlx33XXExsYCsGPHDvbv3098fDwAlZWVxMXFUVBQQK9evYiOjgagS5cu9fZrs9lITk4GoGvXrvj4+DB9+nTGjx/P+PHjL2o/adIksrKyyMjIICsri6ysLAoKCvjiiy8YM2YMUH3q9lLPdX3ooYdwOBzOGcCfbd261YVM1G3YsGHs27eP/Px8pk6dSlJSEj4+Pg3uT0RExF28vAyJoT1IDO1BwT/KWPbJYd7aXcSqnUcZGRrA9IS+xN/gf1lnpFTQXaiembSm0rlzZ+dry7IYM2YMb775Zq02e/fWPXPo7e3NuXPnnO8rKiqcr318fJzr5ry9vcnJyeHDDz9k7dq1/PnPf2bTpk21+kpNTSUlJYUJEyZgjKFfv37s3buXiIgItm/f7tKxdOvWjcmTJ7N48eJa2xszQ/ezsLAwfH19+eKLLxg6tN5H24mIiLRoodf4MW+infSbQ1m14ygrdxRyz9KdDLjGj7SEEJf7UUHXAsXGxvLggw9y6NAhbrjhBk6dOsU333xDaGgoxcXF7Nq1i+joaMrKyujYsSPBwcG8/PLLnDt3jm+++YacnJw6+y0vL+fHH3/klltuIT4+nr59+17U5vrrr8dmszF37lxSU1MBCA0NpaSkhO3btxMXF8fZs2f58ssviYiI+MVjmD17NtHR0VRVVTm3NXSG7vDhw/Tp0wdvb2+OHDnCgQMHCA4OblBfIiIiLVF33w786+h+3D+iLxs++5Zlnxzm0bWfu/x9FXQtUEBAAMuXL+fuu+/mzJkzADz99NP079+frKwsZs6cyenTp+nYsSPZ2dnEx8cTEhJCeHg4YWFhDB48uM5+y8rKuOOOO6ioqMCyLBYsWFBnu9TUVNLT0zl8+DAA7du3Z+3atTz00EOcOHGCqqoqZs2adcmCrnv37tx555386U9/cvm4169fz8yZMykpKeHWW2/F4XDw/vvv88knn/Dss8/Srl07vLy8ePnll+nevbvL/YqIiHgKn3Y2Jg3tQ8qQIHYe/oE4F28aYZriXigtWWhoqFVQUFBrW35+PmFhYW6KqHUpKyvDz8/P3WE0C3eNm82bN5OYmNjs+21LlOOmpxw3PeW4aTVXfo0xuy3LqneNkW5bIiIiIuLhVNCJiIiIeDgVdCIiIiIeTgVdjba2llAaR+NFRERaEhV0VN+rrbS0aR6WK62PZVmUlpbqxsYiItJi6LYlQFBQEEVFRZSUlLg7FI9XUVHRJgodHx8fgoKC3B2GiIgIoIIOgHbt2hES4vrdmOWXbd68mUGDBrk7DBERkTZFp1xFREREPJwKOhEREREPp4JORERExMO1uUd/GWPKgIJ6G0pDdQe+d3cQrZxy3PSU46anHDc95bhpNVd+r7MsK6C+Rm3xoogCV56JJg1jjMlVfpuWctz0lOOmpxw3PeW4abW0/OqUq4iIiIiHU0EnIiIi4uHaYkH3n+4OoJVTfpuectz0lOOmpxw3PeW4abWo/La5iyJEREREWpu2OEMnIiIi0qq0yoLOGHOzMabAGHPIGJNRx+cdjDFZNZ/vNMYEN3+Uns2FHN9rjCkxxuTV/PzaHXF6KmPMMmPMd8aYL37hc2OMeakm/58bYwY3d4yezoUcJxpjTpw3hp9q7hg9nTGmjzHmI2PMfmPMPmPMv9bRRmO5gVzMr8ZxIxhjfIwxOcaYz2pynFlHmxZRU7S6gs4YYwMWA0lAOHC3MSb8gmbTgWOWZd0A/AmY17xRejYXcwyQZVmWo+bnv5o1SM+3HLj5Ep8nAf1qfn4D/EczxNTaLOfSOQbYet4Y/kMzxNTaVAGPWJYVDsQCD9bxb4XGcsO5kl/QOG6MM8BNlmVFAQ7gZmNM7AVtWkRN0eoKOiAGOGRZ1t8ty6oEVgN3XNDmDmBFzeu1wChjjGnGGD2dKzmWRrAs62Pgh0s0uQN4zaq2A+hmjOnVPNG1Di7kWBrJsqxiy7L+VvO6DMgHAi9oprHcQC7mVxqhZlyW17xtV/Nz4cUHLaKmaI0FXSDw9Xnvi7h4gDvbWJZVBZwA/JslutbBlRwDJNecQllrjOnTPKG1Ga7+GUjjxNWcavkfY0yEu4PxZDWnoQYBOy/4SGP5CrhEfkHjuFGMMTZjTB7wHfBXy7J+cQy7s6ZojQWdtAzvAsGWZdmBv/L/f3sR8RR/o/qRO1HAIuAvbo7HYxljfIF1wCzLsk66O57Wpp78ahw3kmVZP1mW5QCCgBhjTKS7Y6pLayzovgHOnw0KqtlWZxtjjDfQFShtluhah3pzbFlWqWVZZ2re/hcwpJliaytcGefSCJZlnfz5VItlWRuBdsaY7m4Oy+MYY9pRXWyssizr7TqaaCw3Qn351Ti+cizLOg58xMVrb1tETdEaC7pdQD9jTIgxpj1wF7DhgjYbgKk1rycCmyzdkO9y1JvjC9bA3E712g65cjYAU2quEIwFTliWVezuoFoTY8w1P6+DMcbEUP3vpX7xuww1+VsK5FuWteAXmmksN5Ar+dU4bhxjTIAxplvN647AGODABc1aRE3h3dw7bGqWZVUZY2YA7wM2YJllWfuMMX8Aci3L2kD1X4CVxphDVC+Kvst9EXseF3P8kDHmdqqvwvoBuNdtAXsgY8ybQCLQ3RhTBPwb1YtxsSxrCbARuAU4BPwITHNPpJ7LhRxPBP7FGFMFnAbu0i9+ly0e+Gdgb80aJIDHgGtBY/kKcCW/GseN0wtYUXN3By9gjWVZ77XEmkJPihARERHxcK3xlKuIiIhIm6KCTkRERMTDqaATERER8XAq6EREREQ8nAo6EREREQ+ngk5ERETEw6mgExEREfFwKuhERBrIGBNsjNlojCkwxnxpjPmdu2MSkbZJBZ2ISAMYY7yofobmEsuyQoGBwFBjzG/cG5mItEV6UoSISAMYY5KAX1uWlXzetl7AFsuy+rsvMhFpizRDJyLSMGHAZ+dvqHmofBdjTHv3hCQibZUKOhGRhvkJ8D1/gzHGAJ2AKrdEJCJtlgo6EZGG2QzcUlPE/WwM8DfLss65JyQRaatU0ImINIBlWZ8Be4A/ABhjegILgMfcGZeItE0q6EREGsAYkwEMBZ4wxtwE/AdwHfCyMSbYjaGJSBukq1xFREREPJxm6EREREQ8nAo6EREREQ+ngk5ERETEw6mgExEREfFwKuhEREREPJwKOhEREREPp4JORERExMOpoBMRERHxcP8P5N61HTopdfAAAAAASUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "N = 152 # length of non-recursive filter\n", "M = 13 # order of recursive filter\n", "\n", "# design of non-recursive filter\n", "h = sig.remez(N, [0, Omp/2, Oms/2, 1/2], [1, 10**((a_s-5)/20)], weight=[1, 1])\n", "\n", "# design of recursive filter\n", "b, a = sig.cheby2(M, -a_s, Oms)\n", "\n", "# compute frequency response of filter\n", "Om, Hn = sig.freqz(h, worN=8192)\n", "Om, Hr = sig.freqz(b, a, worN=8192)\n", "\n", "# plot frequency response\n", "plt.figure(figsize = (10,5))\n", "plt.plot(Om, 20*np.log10(np.abs(Hn)), 'b-', label=r'non-recursive N=%d'%N)\n", "plt.plot(Om, 20*np.log10(np.abs(Hr)), 'g-', label=r'recursive N=%d'%M)\n", "plot_tolerance_scheme(Omp, Oms, d_p, a_s)\n", "plt.title('Magnitude response')\n", "plt.xlabel(r'$\\Omega$')\n", "plt.ylabel(r'$|H(e^{j \\Omega})|$ in dB')\n", "plt.legend()\n", "plt.axis([0, np.pi, -70, 3])\n", "plt.grid()\n", "# plot phase\n", "plt.figure(figsize = (10,5))\n", "plt.plot(Om, np.unwrap(np.angle(Hn)), label=r'non-recursive N=%d'%N)\n", "plt.plot(Om, np.unwrap(np.angle(Hr)), label=r'recursive N=%d'%M)\n", "plt.title('Phase response')\n", "plt.xlabel(r'$\\Omega$')\n", "plt.ylabel(r'$\\varphi(\\Omega)$ in rad')\n", "plt.legend(loc=3)\n", "plt.xlim([0, np.pi])\n", "plt.grid()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Exercises**\n", "\n", "* How do both designs differ in terms of their magnitude and phase responses?\n", "* Calculate the number of multiplications and additions required to realize the non-recursive filter\n", "* Calculate the number of multiplications and additions required to realize the recursive filter in [transposed direct form II](../recursive_filters/direct_forms.ipynb#Transposed-Direct-Form-II)\n", "* Decrease the corner frequencies and adapt the order of the filters to match the tolerance scheme\n", "\n", "Solution: Inspection of the magnitude response $|H(e^{j \\Omega})|$ for the designed non-recursive and recursive filters reveals that both fulfill the given tolerance scheme. An obvious difference between both filters is the structure of the magnitude response in the stop-band $\\Omega > \\Omega_\\text{s}$. While the magnitude of the non-recursive filter shows a high number of fluctuations below the desired attenuation, these are much less for the recursive filter. This is a consequence of the different orders of the filters and their respective number of zeros. The non-recursive filter requires $N$ multiplications and $N-1$ additions to compute one output sample, hence 152 multiplications and 151 additions. The recursive filter in transposed direct form II is realized by 7 SOS. Each of the SOS requires 5 multiplications and 4 additions per output sample, resulting in a total of 35 multiplications and 28 additions." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In order to evaluate the computational complexity of both filters, the execution time is measured when filtering a signal $x[k]$ of length $L=10^5$ samples. The non-recursive filter is realized by direct convolution, the recursive filter in transposed direct form II using the respective Python functions. " ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import timeit\n", "\n", "reps = 1000 # number of repetitions for timeit\n", "\n", "# setup environment for timeit\n", "tsetup = 'import numpy as np; import scipy.signal as sig; from __main__ import h, a, b; x=np.random.normal(size=int(1e5))'\n", "# non-recursive filter\n", "tn = timeit.timeit('np.convolve(x, h, mode=\"full\")', setup=tsetup, number=reps)\n", "# recursive filter\n", "tr = timeit.timeit('sig.lfilter(b, a, x)' , setup=tsetup, number=reps)\n", "\n", "# show the results\n", "plt.figure(figsize = (5, 3))\n", "plt.bar(1, tn/reps*1000)\n", "plt.bar(2, tr/reps*1000)\n", "plt.title('Execution time')\n", "plt.xticks([1, 2], ('non-recursive', 'recursive'))\n", "plt.ylabel('time in ms')\n", "plt.grid()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Exercises**\n", "\n", "* Do the execution times correspond with the number of algorithmic operations calculated in the previous exercise?\n", "* Estimate the computational load for the filtering of a signal with a sampling rate of 48 kHz\n", "* How could the execution time of the non-recursive filter be decreased?\n", "* Finally, would you prefer the non-recursive or the recursive design for a practical implementation? Consider the numerical complexity, as well as numerical aspects in your decision.\n", "\n", "Solution: On general purpose processors, the numerical complexity is mainly determined by the number of multiplications. The ratio of multiplications per output sample for the non-recursive and the recursive filter is given as $\\frac{152}{35} \\approx 4.3$, the ratio of execution times in above example as $\\frac{4.8 \\mathrm{ ms}}{1.5 \\mathrm{ ms}} \\approx 3.2$. The difference between both can be related to the implementation of both methods and their execution on the given hardware. Note that the execution times and their ratio may differ for other environments. The number of samples used in the measurement above relates to a signal with $\\frac{10^5}{f_s} \\approx 2$ seconds length. The computational load for the non-recursive filter can hence be estimated as $\\frac{4.8 \\mathrm{ ms}}{2000 \\mathrm{ ms}} \\approx 2.4 \\cdot 10^{-6}$. The execution time for the non-recursive filter may be decreased by using a fast convolution algorithm." ] }, { "cell_type": "markdown", "metadata": { "nbsphinx": "hidden" }, "source": [ "**Copyright**\n", "\n", "This notebook is provided as [Open Educational Resource](https://en.wikipedia.org/wiki/Open_educational_resources). Feel free to use the notebook for your own purposes. The text is licensed under [Creative Commons Attribution 4.0](https://creativecommons.org/licenses/by/4.0/), the code of the IPython examples under the [MIT license](https://opensource.org/licenses/MIT). Please attribute the work as follows: *Sascha Spors, Digital Signal Processing - Lecture notes featuring computational examples, 2016-2018*." ] } ], "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.5.2" } }, "nbformat": 4, "nbformat_minor": 1 }