libiir/python/filter_analysis.ipynb

325 lines
84 KiB
Plaintext
Raw Permalink Normal View History

{
"metadata": {
"name": "",
2014-07-08 11:42:13 +01:00
"signature": "sha256:1cb8a128cf0baef93386ff39d25370890fe1a95c2ff36083b1a83c2cad364c1c"
},
"nbformat": 3,
"nbformat_minor": 0,
"worksheets": [
{
"cells": [
{
"cell_type": "heading",
"level": 1,
"metadata": {},
"source": [
2014-07-08 11:42:13 +01:00
"Filter analysis laboratory"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"First configure the filter as desired. The filter is independent of sample rate, but is specified as a ratio to it. We use a specific value here simply to aid comprehension and label all the graph axes as desired. Setting it to 1 would be the same as specifying everything as a ratio."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import iir\n",
"\n",
"# change this to alter the sample rate we are displaying at\n",
"sample_rate = 100 # Hz\n",
"nyquist_freq = sample_rate / 2\n",
"\n",
"# build the filter object, fi, here\n",
"corner_freq = 10 # Hz\n",
"order = 4\n",
2014-07-08 11:42:13 +01:00
"gain = 1.0\n",
"filter_desc = \"butterworth_lowpass(%d, %f, %f)\" % (order, gain, corner_freq / nyquist_freq)\n",
"print(filter_desc)\n",
"fi = iir.Filter(filter_desc)"
],
"language": "python",
"metadata": {},
2014-07-08 11:42:13 +01:00
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"butterworth_lowpass(4, 1.000000, 0.200000)\n"
]
}
],
"prompt_number": 65
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Here we set up the plotting library and helper functions."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"%matplotlib inline\n",
"import matplotlib.pyplot as plt\n",
2014-07-08 11:42:13 +01:00
"import numpy as np\n",
"import pylab\n",
"\n",
"# number of points to plot on graphs (arbitrary)\n",
"num_points = 1000\n",
"\n",
"# helper function: calls the Filter.response() method on each member of the array\n",
"respfunc = pylab.vectorize(lambda f: fi.response(f/sample_rate))"
],
"language": "python",
"metadata": {},
"outputs": [],
2014-07-08 11:42:13 +01:00
"prompt_number": 66
},
{
"cell_type": "heading",
"level": 2,
"metadata": {},
"source": [
"Filter characteristics"
]
},
{
"cell_type": "heading",
"level": 3,
"metadata": {},
"source": [
"-3dB points"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"halfgain = np.array(fi.responseMinus3dB(gain)) * sample_rate\n",
"print(halfgain)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"[ 9.99999995]\n"
]
}
],
"prompt_number": 67
},
{
"cell_type": "heading",
"level": 3,
"metadata": {},
"source": [
"Impulse response"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# start at t=0, impulse at t=tau, end at t=10\u00d7tau\n",
"tau = sample_rate * (1 / corner_freq) # number of samples\n",
"\n",
"x = pylab.hstack([pylab.zeros(tau), pylab.ones(9*tau)])\n",
"t = pylab.linspace(0, tau / 10, x.size)\n",
"fi2 = iir.Filter(fi)\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, y, 'r')\n",
"axes.plot(t, x)\n",
"axes.set_xlabel('Time (s)')"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 68,
"text": [
"<matplotlib.text.Text at 0x7f40b82e4a58>"
]
},
{
"metadata": {},
"output_type": "display_data",
"png": "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\nw+2Od91u1bEaJaz6u5ewQvBm
"text": [
"<matplotlib.figure.Figure at 0x7f40b846a320>"
]
}
],
"prompt_number": 68
},
{
"cell_type": "heading",
"level": 3,
"metadata": {},
"source": [
"Impulse response"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"x = pylab.hstack([pylab.zeros(tau), 1, pylab.zeros(9*tau - 1)])\n",
"t = pylab.linspace(0, tau / 10, x.size)\n",
"fi2 = iir.Filter(fi)\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, y, 'r')\n",
"axes.plot(t, x)\n",
"axes.set_xlabel('Time (s)')"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 69,
"text": [
"<matplotlib.text.Text at 0x7f40b83cce80>"
]
},
{
"metadata": {},
"output_type": "display_data",
"png": "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\nOMwxPcBjwJNAbwbn7AhWuiRJUlV3yp/vAq4GjgWeBx4FbgeeShwzGVgI/CWwHpiS8pwdw9AlSZKq\n0la6DgNWA2uBPuA2YHbNMZ8BfkQIXACvpDxnxzB0SZKkqrSha3dgXeL1+sr3kvYFdgbuA34BnJny\nnB3D7kVJklSVdnqx3MAxE4EPAscA2wIPAQ8T1oCNa1a6JElSVdrQ9TwwNfF6KoPTiFXrCFOK71S2\nnwGHUBO65s+fv3W/p6eHnp6elENrPbsXJUnqfL29vfT29qb+nFLKn+8GniZUsTYAy4HTGbqQ/gDC\nYvu/BLYBHgFOBX6TOKZcLjdSNOss3d3wzjuDweu66+DRR2HRotaOS5IkjV2pVIIxZKi0la5+YB6w\njNDJeD0hcJ1Xef9awu0klgKPA1uARQwNXONSuQwDAyF4VVnpkiSpuNKGLoAllS3p2prXl1W2wujr\nC4GrlMjBEye6kF6SpKLyjvSR1HYuQnhtpUuSpGIydEVS27kITi9KklRkhq5IajsXwdAlSVKRGboi\nsdIlSZKSDF2RGLokSVKSoSuS4UKX3YuSJBWToSsSuxclSVKSoSsSpxclSVKSoSsSuxclSVKSoSsS\nK12SJCnJ0BWJoUuSJCUZuiKxe1GSJCUZuiKxe1GSJCUZuiJxIb0kSUoydEXimi5JkpRk6IrE0CVJ\nkpIMXZEYuiRJUpKhK5J6C+m7uqBchoGB1oxJkiS1jqErknqVrlLJapckSUVl6IqkXvciGLokSSoq\nQ1ck9SpdYOiSJKmoDF2RGLokSVKSoSuSkUKXjwKSJKl4DF2R1OteBB8FJElSURm6InF6UZIkJRm6\nIrF7UZIkJRm6IrHSJUmSkgxdkRi6JElSkqErErsXJUlSkqErErsXJUlSkqErEqcXJUlSkqErErsX\nJUlSkqErEitdkiQpydAViaFLkiQlGboisXtRkiQlGboisXtRkiQlGboicXpRkiQlGboisXtRkiQl\nGboisdIlSZKSDF2RGLokSVKSoSsSuxclSVKSoSsSuxclSVKSoSsSpxclSVKSoSsSuxclSVKSoSsS\nK12SJCnJ0BWJC+klSVKSoSsSK12SJCkpi9A1C1gFPAtcOMJxHwb6gU9ncM62N1zosntRkqRiShu6\nuoCrCcHrIOB04MBhjrsUWAqUUp6z7Q0MQKkEXV3vfs9KlyRJxZQ2dB0GrAbWAn3AbcDsOsf9PfBD\n4OWU5+sIw3UugqFLkqSiShu6dgfWJV6vr3yv9pjZwDWV1+WU52x7w00tgqFLkqSi6k75840EqMuB\nr1WOLTHM9OL8+fO37vf09NDT05NyaK0zWuiye1GSpM7R29tLb29v6s9Ju75qJjCfsKYL4CJgC2H9\nVtVzifNMAd4GvgDcnjimXC6PnwLYiy/C9Onha60lS+CKK2Dp0vzHJUmS0iuVSjCGDJW20vULYF9g\nGrABOJWwmD7p/Yn9G4E7GBq4xh2nFyVJUq20oasfmAcsI3QoXg88BZxXef/alJ/fkQxdkiSpVtrQ\nBbCksiUNF7bOyeB8bc/uRUmS
"text": [
"<matplotlib.figure.Figure at 0x7f40b83edf28>"
]
}
],
"prompt_number": 69
},
{
"cell_type": "heading",
"level": 2,
"metadata": {},
"source": [
"Linear Bode plot"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"freq = pylab.linspace(0, nyquist_freq, num_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",
2014-07-08 11:42:13 +01:00
"axes[1].plot(freq, pylab.angle(resp), 'r')\n",
"axes[1].set_xlabel('Frequency (Hz)')\n",
"axes[1].set_ylabel('Phase (radians)')\n",
2014-07-08 11:42:13 +01:00
"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": "iVBORw0KGgoAAAANSUhEUgAAAmcAAAJeCAYAAADxx6J0AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3XecVNX9//HX0kERVIoNBalWxAKoGNeCgkbR2GLvLZqi\niVGjxtU0TfJVEzX2KBoNit2fBevaFRDBSlsBBQXBgigd5vfHmc0Oyy47u+zMvXfm9Xw87mNm7k75\n4Ij79nPuOQckSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkNcC/gTnA+2t4zj+BKcAEoF8+ipIkSSpW\nexACV23h7ADgqfT9AcBb+ShKkiSpmHWl9nB2M3BUxuOJQOdcFyRJkhQXTaIuoJpNgc8yHs8ENouo\nFkmSpLyLWzgDKKn2OBVJFZIkSRFoFnUB1cwCumQ83ix9bhXdO3dOVcyZk7eiJEmS1kIF0CPbJ8ct\nnD0OnAuMAAYC3xJmd66iYs4cUqk8NNSWLIEZM2DqVKiogClTYMIEePdd2GADGDgQ9tknHFtumft6\nCkRZWRllZWVRl6EG8LtLNr+/5PK7S7aSkpLu9Xl+vsPZf4E9gQ6Ea8suB5qnf3YLYabmAcBU4Afg\n5DzXt6qWLaFXr3BkWrkyBLbXXoMXXoDLLoN114XDDoMjj4Qdd4SS6qOzkiRJdct3ODs6i+ecm/Mq\n1laTJlWh7ZRTIJWC8eNh5Ej46U/Dz888E046KXTYJEmSshTHCQHJU1IC/frBn/8MkyfDv/8dhj67\nd4ezzgpDo/qf0tLSqEtQA/ndJZvfX3L53RWXpI69pfJyzdnamjsXrr0WbrklDHlefjlsumnUVUmS\npDwqCZc6ZZ257JzlUseOoZs2ZQp06AB9+8JVV4WJBpIkSTWwc5ZPn3wC550HH30Ed94JgwZFXZEk\nScqx+nbODGdReOyxcC3aSSfBFVdAixZRVyRJknLEYc0kGDYsrJf28cdhrbTp06OuSJIkxYThLCqd\nOsEjj8AJJ4SA9uKLUVckSZJiwGHNOHjhBTj22LCY7TnnRF2NJElqRF5zllTTpsH++8Mxx4QlN9xh\nQJKkgmA4S7I5c2DIkDCL8x//CDsNSJKkRDOcJd38+XDQQWFrqFtvNaBJkpRwztZMunbt4Kmnwlpo\n558f9u2UJElFw3AWR+uuGwLayy/D738fdTWSJCmPDGdx1b49PPssPPgg3HBD1NVIkqQ8aRZ1AVqD\njh3hySdh992hR48wWUCSJBU0JwQkwWuvwU9+AuXlsPXWUVcjSZLqwQkBhWjQIPi//4Mf/xi+/jrq\naiRJUg7ZOUuS886DioqwcbqL1EqSlAh2zgrZ1VeHhWr/7/+irkSSJOVIUtsvxdk5A5gxA/r3h4cf\nDhMFJElSrNk5K3RbbAF33BH24Jw/P+pqJElSI7NzllRnnQWLF8Ndd0VdiSRJWgP31iwW338PffvC\nNdfAsGFRVyNJkmphOCsmr70GRxwB770XFqyVJEmxYzgrNr/9bZgkcP/9UVciSZJqYDgrNosWwXbb\nwfXXw9ChUVcjSZKqMZwVo2efDRMEPvgA2rSJuhpJkpTBcFasjjkGNt8crroq6kokSVIGw1mxmj0b\ntt8enn8+3EqSpFgwnBWzf/0LRo6EF190701JkmLCHQKK2RlnwLx58MgjUVciSZIaKKntFTtntXnh\nBTj9dPjoI2jVKupqJEkqenbOit0++4Rrzq67LupKJElSA9g5K0RTp8KAAfDhh7DRRlFXI0lSUXNC\ngILzz4elS+GGG6KuRJKkomY4UzB3Lmy1FYweDVtuGXU1kiQVLa85U9CxI/ziF/D730ddiSRJqgc7\nZ4VswQLo2RNGjYK+faOuRpKkomTnTFXatoXf/Q4uuSTqSiRJUpbsnBW6JUugd2+45x7YY4+oq5Ek\nqeg4IUCru/POEM5efDHqSiRJKjoOa2p1xx0H06fDq69GXYkkSapDvsPZEGAiMAW4sIafdwCeAcYD\nHwAn5a2yQta8ebj27A9/iLoSSZJUh3wOazYFJgH7ArOAMcDRwMcZzykDWgIXE4LaJKAzsLzaezms\nWV9Ll4aZmyNGwK67Rl2NJElFI87Dmv2BqcB0YBkwAhhW7TlfAOul768HfMXqwUwN0aIFXHyx3TNJ\nkmIun+FsU+CzjMcz0+cy3QZsA3wOTAB+mZ/SisTJJ8P778OYMVFXIkmSapHPcJbNOOTvCNebbQLs\nANwItM1lUUWlZUu48EK7Z5IkxVizPH7WLKBLxuMuhO5Zpt2AP6XvVwDTgN7A2OpvVlZW9r/7paWl\nlJaWNl6lhezUU+GPf4QPP4Rttom6GkmSCk55eTnl5eUNfn0+JwQ0I1zgvw9h2HI0q08IuAaYD1xB\nmAjwDrA98HW193JCwNr4059g6tSw/pkkScqpuC9COxS4jjBz8w7gL8CZ6Z/dQpiheSewOWHI9S/A\nfTW8j+FsbXz9NfToAe+9B5ttFnU1kiQVtLiHs8ZiOFtbv/pVWP/sb3+LuhJJkgqa4UzZmTEDdtwR\nPvkE2rWLuhpJkgpWnNc5U5xssQUMGQK33BJ1JZIkKYOds2I2fjwceGDonrVsGXU1kiQVJDtnyt4O\nO8C228J9Nc25kCRJUbBzVuyefz5MDnj/fShJ6r8OkiTFl50z1c8++4TbF1+Mtg5JkgQYzlRSAr/4\nBfzjH1FXIkmScFhTAAsXhtmbb70F3btHXY0kSQXFYU3VX5s2cMopcMMNUVciSVLRs3Om4NNPoV8/\nmD4d2raNuhpJkgqGnTM1zOabw157wd13R12JJElFzc6Zqrz6Kpx2Gnz8MTQxt0uS1BjsnKnhBg0K\n1589+2zUlUiSVLQMZ6pSUgK//KXLakiSFCGHNbWqxYvDshqvvAK9e0ddjSRJieewptZOq1Zw6qlw\n881RVyJJUlGyc6bVTZ8OO+8cltdo0ybqaiRJSjQ7Z1p7XbvCwIFw//1RVyJJUtExnKlmZ58NN90U\ndRWSJBUdw5lqNmQIfPklvPNO1JVIklRUDGeqWdOmcOaZds8kScozJwSodl9+GZbTmDYN2rePuhpJ\nkhLJCQFqPJ06heFN99uUJClvDGdas7PPDmue2amUJCkvDGdasz32CJugv/xy1JVIklQUDGdas5IS\nOOssJwZIkpQnTghQ3ebPDwvTfvwxbLRR1NVIkpQoTghQ42vXDo44Au68M+pKJEkqeHbOlJ0xY+Cn\nP4UpU8I1aJIkKSt2zpQbO+8M660HL74YdSWSJBU0w5myU1ICp58Ot90WdSWSJBU0hzWVvcqJAZMm\nhQVqJUlSnRzWVO60aweHHALDh0ddiSRJBcvOmernzTfhxBND96wkqf/6SJKUP3bOlFsDB0KLFu4Y\nIElSjhjOVD8lJXDGGU4MkCQpR5I6LuWwZpS+/hq23BIqKmDDDaOuRpKkWHNYU7m3wQZw0EFwzz1R\nVyJJUsExnKlhzjgDbr0V7GBKktSoDGdqmEGDQjB7442oK5EkqaAYztQwlTsG3Hpr1JVIklRQnBCg\nhps3D3r2hE8+gfXXj7oaSZJiKe4TAoYAE4EpwIW1PKcUeBf4ACjPS1VqmA4dYMgQuPfeqCuRJKlg\n5LNz1hSYBOwLzALGAEcDH2c8pz3wOrA/MBPoAMyr4b3snMXFiy/Cr34FEya4Y4AkSTWIc+esPzAV\nmA4sA0YAw6o95xjgIUIwg5qDmeKktBQWLYLRo6OuRJKkgpDPcLYp8FnG45npc5l6AhsALwFjgePz\nU5oarEkTOO00JwZIktRImuXxs7IZh2wO7AjsA7QB3gTeIlyjtoqysrL/3S8tLaW0tLQxalRDnHQS\n9OkD114L660XdTWSJEWqvLyc8vLyBr++IRcJNQGOBboBVwKbAxsBdY1rDQTKCJMCAC4GVgJXZzzn\nQqB1+nkAtwPPAA9Wey+vOYubww+HffeFs86KuhJJkmIlH9ec/QvYlXB9GMD36XN1GUsYtuwKtACO\nAh6v9pzHgEGEyQNtgAHARw2o
"text": [
2014-07-08 11:42:13 +01:00
"<matplotlib.figure.Figure at 0x7f40b83d4390>"
]
}
],
2014-07-08 11:42:13 +01:00
"prompt_number": 70
},
{
"cell_type": "heading",
"level": 2,
"metadata": {},
"source": [
"Logarithmic Bode plot"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
2014-07-08 11:42:13 +01:00
"freq = pylab.logspace(-3, pylab.log10(nyquist_freq), num_points)\n",
"resp = respfunc(freq)\n",
"\n",
"fig, axes = plt.subplots(nrows=2, ncols=1, figsize=(10, 10), dpi=100)\n",
"\n",
2014-07-08 11:42:13 +01:00
"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",
"axes[0].axhline(y=-3)\n",
2014-07-08 11:42:13 +01:00
"for f in halfgain:\n",
" axes[0].axvline(f)\n",
"\n",
2014-07-08 11:42:13 +01:00
"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",
2014-07-08 11:42:13 +01:00
"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",
2014-07-08 11:42:13 +01:00
"png": "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\nSZKk1qVSoSp3221RRxKZ9uYt
"text": [
2014-07-08 11:42:13 +01:00
"<matplotlib.figure.Figure at 0x7f40b8467b70>"
]
}
],
2014-07-08 11:42:13 +01:00
"prompt_number": 71
},
{
"cell_type": "code",
"collapsed": false,
"input": [],
"language": "python",
"metadata": {},
"outputs": [],
2014-07-08 11:42:13 +01:00
"prompt_number": 71
}
],
"metadata": {}
}
]
}