Last active
March 21, 2017 14:42
-
-
Save rutj3/091feca4f76730861dc78e879910f428 to your computer and use it in GitHub Desktop.
scipy_sg_filter
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"cells": [ | |
{ | |
"cell_type": "code", | |
"execution_count": 1, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"'0.18.1'" | |
] | |
}, | |
"execution_count": 1, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"import scipy\n", | |
"scipy.__version__" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 2, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"import numba\n", | |
"import numpy as np\n", | |
"from scipy import signal\n", | |
"import matplotlib.pyplot as plt\n", | |
"\n", | |
"np.set_printoptions(precision=3)\n", | |
"\n", | |
"%matplotlib inline" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"### Savitzky-Golay coefficients" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 3, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [], | |
"source": [ | |
"@numba.jit\n", | |
"def savgol_coeffs(window, order):\n", | |
" assert order > 0\n", | |
" \n", | |
" J = np.empty((window, order), dtype=np.float64)\n", | |
" \n", | |
" halfw = window//2\n", | |
" \n", | |
" for i in range(window):\n", | |
" for j in range(order):\n", | |
" J[i,j] = (i-halfw)**j\n", | |
"\n", | |
" C = np.dot(np.linalg.inv(np.dot(J.T,J)), J.T)\n", | |
" \n", | |
" return C[0,:]" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 4, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"# See: http://robert.mellet.pagesperso-orange.fr/rgrs_pol/regrs_06.htm\n", | |
"# window, norm\n", | |
"test_cases = [( 5, 35),\n", | |
" ( 7, 21),\n", | |
" ( 9, 231),\n", | |
" (11, 429)]" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"### Reference implementation:" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 5, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"[ -3. 12. 17. 12. -3.]\n", | |
"[-2. 3. 6. 7. 6. 3. -2.]\n", | |
"[-21. 14. 39. 54. 59. 54. 39. 14. -21.]\n", | |
"[-36. 9. 44. 69. 84. 89. 84. 69. 44. 9. -36.]\n" | |
] | |
} | |
], | |
"source": [ | |
"order = 4 # quadratic\n", | |
"\n", | |
"for window, norm in test_cases:\n", | |
" print(savgol_coeffs(window, order) * norm)" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"### Scipy.signal:" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 6, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"[ -1.261e-16 8.045e-15 3.500e+01 1.892e-14 -1.821e-15]\n", | |
"[ 0.455 -2.727 6.818 11.909 6.818 -2.727 0.455]\n", | |
"[ 8.077 -29.615 16.154 72.692 96.385 72.692 16.154 -29.615 8.077]\n", | |
"[ 18. -45. -10. 60. 120. 143. 120. 60. -10. -45. 18.]\n" | |
] | |
} | |
], | |
"source": [ | |
"order = 4 # quadratic\n", | |
"\n", | |
"# scaled\n", | |
"for window, norm in test_cases:\n", | |
" print(signal.savgol_coeffs(window, order) * norm)" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"### Scipy.signal (order-1)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 7, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"[ -3. 12. 17. 12. -3.]\n", | |
"[-2. 3. 6. 7. 6. 3. -2.]\n", | |
"[-21. 14. 39. 54. 59. 54. 39. 14. -21.]\n", | |
"[-36. 9. 44. 69. 84. 89. 84. 69. 44. 9. -36.]\n" | |
] | |
} | |
], | |
"source": [ | |
"order = 4 # quadratic\n", | |
"\n", | |
"for window, norm in test_cases:\n", | |
" print(signal.savgol_coeffs(window, order-1) * norm)" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"### refence implementation, fixed window different orders:" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 8, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"1 [ 0.143 0.143 0.143 0.143 0.143 0.143 0.143]\n", | |
"2 [ 0.143 0.143 0.143 0.143 0.143 0.143 0.143]\n", | |
"3 [-0.095 0.143 0.286 0.333 0.286 0.143 -0.095]\n", | |
"4 [-0.095 0.143 0.286 0.333 0.286 0.143 -0.095]\n", | |
"5 [ 0.022 -0.13 0.325 0.567 0.325 -0.13 0.022]\n", | |
"6 [ 0.022 -0.13 0.325 0.567 0.325 -0.13 0.022]\n" | |
] | |
} | |
], | |
"source": [ | |
"window = 7\n", | |
"for order in range(1,7):\n", | |
" print(order, savgol_coeffs(window, order))\n" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"### Scipy.signal, fixed window different orders:" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 9, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"1 [ 0.143 0.143 0.143 0.143 0.143 0.143 0.143]\n", | |
"2 [-0.095 0.143 0.286 0.333 0.286 0.143 -0.095]\n", | |
"3 [-0.095 0.143 0.286 0.333 0.286 0.143 -0.095]\n", | |
"4 [ 0.022 -0.13 0.325 0.567 0.325 -0.13 0.022]\n", | |
"5 [ 0.022 -0.13 0.325 0.567 0.325 -0.13 0.022]\n", | |
"6 [ -2.592e-17 2.718e-16 -9.216e-16 1.000e+00 -4.181e-18 -1.844e-16\n", | |
" 2.169e-17]\n" | |
] | |
} | |
], | |
"source": [ | |
"window = 7\n", | |
"for order in range(1,7):\n", | |
" print(order, signal.savgol_coeffs(window, order))\n" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 10, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"(array([-3.557, -3.237, -2.434, -2.877, -2.476]),\n", | |
" array([-3.557, -3.237, -2.434, -2.877, -2.476]))" | |
] | |
}, | |
"execution_count": 10, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"y_noise = np.linspace(-np.pi, np.pi, 50) + np.random.randn(50)/4\n", | |
"y_sg = signal.savgol_filter(y_noise, 7, 6)\n", | |
"\n", | |
"y_noise[:5], y_sg[:5]" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 11, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"[<matplotlib.lines.Line2D at 0xa7351d0>]" | |
] | |
}, | |
"execution_count": 11, | |
"metadata": {}, | |
"output_type": "execute_result" | |
}, | |
{ | |
"data": { | |
"image/png": "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\nTkSuQmCC\n", | |
"text/plain": [ | |
"<matplotlib.figure.Figure at 0xa735048>" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
} | |
], | |
"source": [ | |
"plt.plot(y_noise, lw=6, alpha=.5)\n", | |
"plt.plot(y_sg)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [] | |
} | |
], | |
"metadata": { | |
"anaconda-cloud": {}, | |
"kernelspec": { | |
"display_name": "Python [default]", | |
"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.4.5" | |
} | |
}, | |
"nbformat": 4, | |
"nbformat_minor": 0 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment