{ "cells": [ { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "# Smooth a signal" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "%matplotlib inline\n", "import numpy as np\n", "from matplotlib import pyplot as plt\n", "import rampy as rp\n", "\n", "# the following code is for the rendering of plotly graphs in Rampy docs, you don't need it\n", "# Set renderer for Jupyter notebooks\n", "import plotly.io as pio\n", "pio.renderers.default = 'notebook'" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "First we creating a fake, noisy signal" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Text(0.5, 1.0, 'A noisy observation')" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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ki4YZgOAmTNnyv9vG6Kpra3FL7/8AgDw9/dHZWUl1q1b1+TzLlu2DNdccw0CAgJQWFgo31JTU2EymbB582a76ydPnoyQkBC7Y5MmTYJarcZ///tf+djBgwdx+PBhTJkyRT6m0WigUll+JZtMJhQVFcHX1xddunTBnj17mmzjxfz0009wc3PDY489Znd8zpw5EEJg9erVdsdTU1ORkJAgf92zZ09otVq77xEiZ8SwQ+TgTCYTlixZghEjRiArKwvHjx/H8ePHMWjQIOTn52P9+vXNepyYmJgLjgUEBNiFk+zs7EZrZ7p27Sqfb4xGo8Ebb7yB1atXIywsDNdeey3efPNN6PV6u+vuvvtuVFdXY/ny5QAsdSu7d+/GXXfdddG22563sbYlJSVd0C6VSoWOHTvaHevcuTMAyDVEjzzyCDp37oxx48YhKioK99133wX1KZmZmVizZg1CQkLsbqmpqQCAgoICu+sbC2zBwcEYNWoUli5dKh/773//C7VajUmTJsnHzGYz3nnnHSQmJkKj0SA4OBghISHYv38/SktLL/r+NCU7OxuRkZHw8/OzO97Uv2dzvkeInBHDDpGD27BhA86ePYslS5YgMTFRvt12220A0OxC5aZmTok/FKpeqVmzZuHYsWOYN28ePD098cILL6Br167Yu3evfE1ycjL69euHr7/+GgDw9ddfw8PDQ34tbSk0NBTp6elYuXIlbrzxRvz6668YN24cpk2bJl9jNpvxpz/9CevWrWv0NnnyZLvH9PLyavS5br/9dhw7dkxeG2fp0qUYNWoUgoOD5Wtee+01zJ49G9deey2+/vprrF27FuvWrUO3bt3abDp5a3+PECmF6+wQObjFixcjNDQUCxYsuODcd999h+XLl2PhwoVNftBejtjYWGRkZFxw/OjRo/L5i0lISMCcOXMwZ84cZGZmonfv3vjnP/8phxvA0rsze/ZsnD17Ft988w3Gjx+PgICAS7YLsPQEjRw50u5cRkbGBe0ym804efKk3JsDAMeOHQMAu9lKHh4emDBhAiZMmACz2YxHHnkEH3/8MV544QV06tQJCQkJqKiokHtyrtTEiRPx4IMPykNZx44dw9y5c+2u+fbbbzFixAh89tlndsdLSkrsQpEkSc1+3tjYWPzyyy8oLy+3691p7r8nkatgzw6RA6uursZ3332HG264AbfccssF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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "nb_points = 200\n", "x = np.linspace(50, 600, nb_points)\n", "\n", "# gaussian peaks\n", "p1 = 20.0 * np.exp(-np.log(2) * ((x-150.0)/15.0)**2)\n", "p2 = 100.0 * np.exp(-np.log(2) * ((x-250.0)/20.0)**2)\n", "p3 = 50.0 * np.exp(-np.log(2) * ((x-450.0)/50.0)**2)\n", "p4 = 20.0 * np.exp(-np.log(2) * ((x-350.0)/300)**2)\n", "p5 = 30.0 * np.exp(-np.log(2) * ((x-460.0)/5.0)**2)\n", "\n", "# background: a large gaussian + linear \n", "bkg = 60.0 * np.exp(-np.log(2) * ((x-250.0)/200.0)**2) + 0.1*x\n", "\n", "#noise\n", "noise = 2.0 * np.random.normal(size=nb_points)\n", "\n", "#observation\n", "y = p1 + p2 + p3 + p4 + p5 + noise +bkg\n", "\n", "\n", "plt.plot(x, y)\n", "plt.xlabel('X')\n", "plt.ylabel('Y')\n", "plt.title('A noisy observation')" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "To smooth this signal, we can use the `rampy.smooth` function. It has 10 different smnoothings algorithms.\n", "\n", "Spline, Savitsky-Golay and Whittaker smoothing are available as:\n", " - GCVSmoothedNSpline (Generalised Cross Validated Spline, see [scipy.interpolate.make_smoothing_spline](https://docs.scipy.org/doc/scipy/reference/generated/scipy.interpolate.make_smoothing_spline.html) doc)\n", " - DOFSmoothedNSpline (Degree of Freedom spline, see [gcvspline](https://charlesll.github.io/gcvspline/) doc)\n", " - MSESmoothedNSpline (Mean Square Error spline, see [gcvspline](https://charlesll.github.io/gcvspline/) doc)\n", " - savgol, the scipy Savitsky-Golay filter\n", " - whittaker, a Whittaker smoother (see `rampy.whittaker()`)\n", "\n", "Moving window smoothings are available by setting the method to:\n", " - flat, a flat window smoothing\n", " - hanning, a hanning window smoothing\n", " - hamming, a hamming window smoothing\n", " - bartlett, a bartlett window smoothing\n", " - blackman, a blackman window smoothing\n", " \n", "See the smooth function help for more details on parameters" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "y_smo_1 = rp.smooth(x,y,method=\"GCVSmoothedNSpline\")\n", "#y_smo_2 = rp.smooth(x,y,method=\"DOFSmoothedNSpline\") # activate only if you have gcvspline install (see charlesll/gcvspline on Github)\n", "#y_smo_3 = rp.smooth(x,y,method=\"MSESmoothedNSpline\") # activate only if you have gcvspline install (see charlesll/gcvspline on Github)\n", "y_smo_4 = rp.smooth(x,y,method=\"savgol\",window_length=5,polyorder=2)\n", "y_smo_5 = rp.smooth(x,y,method=\"whittaker\",Lambda=10**0.5)\n", "y_smo_6 = rp.smooth(x,y,method=\"flat\",window_length=5)\n", "y_smo_7 = rp.smooth(x,y,method=\"hanning\",window_length=5)\n", "y_smo_8 = rp.smooth(x,y,method=\"hamming\",window_length=5)\n", "y_smo_9 = rp.smooth(x,y,method=\"bartlett\",window_length=5)\n", "y_smo_10 = rp.smooth(x,y,method=\"blackman\",window_length=5)" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "# Figures\n", "\n", "To do a figure that allows interactively comparing the smoothing results, we use the `rampy.plot_spectrum` function:" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/html": [ " \n", " \n", " " ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
\n", "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig = rp.plot_spectrum(x, y,\n", " smoothed_signals=[y_smo_1, y_smo_4, y_smo_5, y_smo_6, y_smo_7, y_smo_8, y_smo_9, y_smo_10],\n", " smoothed_labels=[\"GCVSmoothedNSpline\", \"savgol\", \"whittaker\", \"flat\", \"hanning\", \"hamming\", \"bartlett\", \"blackman\"])\n", "fig.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can compare in more details the Sav-Gol, GCV spline and Whittaker method:" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig = rp.plot_spectrum(x, y, smoothed_signals=[y_smo_1, y_smo_4, y_smo_5], \n", " smoothed_labels=[\"GCV spline\", \"Sav Gol\", \"Whittaker\"])\n", "fig.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [] } ], "metadata": { "kernelspec": { "display_name": "gpvisc", "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.11.9" } }, "nbformat": 4, "nbformat_minor": 2 }