libfir/python/comparison.ipynb

140 lines
112 KiB
Plaintext
Raw Normal View History

2014-09-09 09:59:16 +01:00
{
"metadata": {
"name": "",
"signature": "sha256:46ebd0819e8459e236e33293377fddb82dc24781d6125093a26ed0006b1ede44"
},
"nbformat": 3,
"nbformat_minor": 0,
"worksheets": [
{
"cells": [
{
"cell_type": "code",
"collapsed": false,
"input": [
"%matplotlib inline\n",
"import matplotlib.pyplot as plt\n",
"import numpy as np\n",
"import pylab, fir"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 95
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"sample_rate = 20 # Hz\n",
"corner_frequency = 1.6 # Hz\n",
"npoints = 51\n",
"nyquist_freq = sample_rate / 2\n",
"\n",
"sinc = np.linspace(npoints / -2, npoints / 2, npoints)\n",
"sinc = np.sinc(sinc * 2 * (corner_frequency / sample_rate))\n",
"plt.plot(sinc)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 96,
"text": [
"[<matplotlib.lines.Line2D at 0x7fa0a36e9860>]"
]
},
{
"metadata": {},
"output_type": "display_data",
"png": "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\nWhqxLjT5mvghG0m/J7b4+efA
"text": [
"<matplotlib.figure.Figure at 0x7fa0a3953828>"
]
}
],
"prompt_number": 96
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def filter_from_points(points):\n",
" return fir.Filter(points / sum(points))\n",
"\n",
"bode_points = 997\n",
"respfunc = pylab.vectorize(lambda fi, freq: fi.response(freq/sample_rate))\n",
"freq = pylab.logspace(-1, pylab.log10(nyquist_freq), bode_points)\n",
"\n",
"fi_list = { }\n",
"fi_list[\"rectangle\"] = filter_from_points(sinc)\n",
"fi_list[\"blackman\"] = filter_from_points(sinc * np.blackman(len(sinc)))\n",
"fi_list[\"hamming\"] = filter_from_points(sinc * np.hamming(len(sinc)))\n",
"fi_list[\"hann\"] = filter_from_points(sinc * np.hanning(len(sinc)))\n",
"fi_list[\"kaiser_8\"] = filter_from_points(sinc * np.kaiser(len(sinc), 8))\n",
"fi_list[\"kaiser_10\"] = filter_from_points(sinc * np.kaiser(len(sinc), 10))"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 93
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"fig, axes = plt.subplots(figsize=(10,6), dpi=100)\n",
"axes.set_xlabel('Frequency (Hz)')\n",
"\n",
"for name, fi in fi_list.items():\n",
" resp = respfunc(fi, freq)\n",
" axes.plot(freq, 20 * np.log10(np.abs(resp)), label=name)\n",
" \n",
"axes.legend()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 94,
"text": [
"<matplotlib.legend.Legend at 0x7fa0a37a6c88>"
]
},
{
"metadata": {},
"output_type": "display_data",
"png": "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\nQgghhChGknwJIYQQQhQjSb6E
"text": [
"<matplotlib.figure.Figure at 0x7fa0a37a6da0>"
]
}
],
"prompt_number": 94
},
{
"cell_type": "code",
"collapsed": false,
"input": [],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 86
},
{
"cell_type": "code",
"collapsed": false,
"input": [],
"language": "python",
"metadata": {},
"outputs": []
}
],
"metadata": {}
}
]
}