{ "cells": [ { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "import matplotlib.pyplot as plt\n", "import matplotlib\n", "from matplotlib import animation\n", "import scipy.signal as signal\n", "import numpy as np\n", "\n", "from IPython.display import Audio, display, HTML\n", "from ipywidgets import interact\n", "\n", "from scipy.io import wavfile\n", "import requests\n", "from io import BytesIO\n", "\n", "%matplotlib inline\n", "matplotlib.rcParams['animation.writer'] = 'avconv'\n", "matplotlib.rcParams['figure.figsize'] = \"8,3\"\n", "\n", "# workaround function for strange interact implementation\n", "def showInInteract():\n", " import inspect\n", " for i in range(5):\n", " if 'interaction.py' in inspect.stack()[i][1]: plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# The Fourier Series and Harmonic Approximation\n", "\n", "In this article, we will walk through the origins of the Fourier transform: the **Fourier Series**. The Fourier series takes a periodic signal $x(t)$ and describes it as a sum of sine and cosine waves. Noting that sine and cosine are themselves periodic functions, it becomes clear that $x(t)$ is also a periodic function. \n", "\n", "Mathematically, the Fourier series is described as follows. Let $x(t)$ be a periodic function with period $T$, i.e.\n", "\n", "$$x(t)=x(t+nT), n\\in\\mathbb{Z}.$$ \n", "\n", "Then, we can write $x(t)$ as a Fourier series by\n", "\n", "$$x(t)=\\frac{a_0}{2}+\\sum_{n=1}^{\\infty}a_n\\cos(2\\pi \\frac{nt}{T})+b_n\\sin(2\\pi\\frac{nt}{T}),$$\n", "\n", "where $a_n$ and $b_n$ are the coefficients of the Fourier series. They can be calculated by\n", "$$\\begin{align}a_n&=\\frac{2}{T}\\int_0^Tx(t)\\cos(2\\pi \\frac{nt}{T})dt\\\\\n", "b_n&=\\frac{2}{T}\\int_0^Tx(t)\\sin(2\\pi \\frac{nt}{T})dt\\end{align}.$$\n", "\n", "Note that for a function with period $T$, the frequencies of the sines and cosines are $\\frac{1}{T}, \\frac{2}{T}, \\frac{3}{T}, \\dots$, i.e. they are multiples of the fundamental frequency $\\frac{1}{T}$, which is the inverse period duration of the function. Therefore the frequency $\\frac{n}{T}$ is called the $n$th *harmonic*. The name *harmonic* stems from the fact for the human ear frequencies with integer ratios sound \"nice\", and the frequencies are all integer multiples of the fundamental frequency.\n", "\n", "Let us verify the calculation of the Fourier coefficients and the function reconstruction numerically. First, we define some functions with period $T=1$ that we want to expand into a Fourier series:" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "Fs = 10000\n", "func1 = lambda t: (abs((t%1)-0.25) < 0.25).astype(float) - (abs((t%1)-0.75) < 0.25).astype(float)\n", "func2 = lambda t: t % 1\n", "func3 = lambda t: (abs((t%1)-0.5) < 0.25).astype(float) + 8*(abs((t%1)-0.5)) * (abs((t%1)-0.5)<0.25)\n", "func4 = lambda t: ((t%1)-0.5)**2\n", "t = np.arange(-1.5, 2, 1/Fs)\n", "plt.figure(figsize=(8,4))\n", "plt.subplot(221); plt.plot(t, func1(t))\n", "plt.xlabel('$t$'); plt.ylabel('$x(t)$'); plt.grid(True); plt.ylim((-1.1, 1.1)); plt.title(\"Function 1\")\n", "plt.subplot(222); plt.plot(t, func2(t))\n", "plt.xlabel('$t$'); plt.ylabel('$x(t)$'); plt.grid(True); plt.title(\"Function 2\")\n", "plt.subplot(223); plt.plot(t, func3(t))\n", "plt.xlabel('$t$'); plt.ylabel('$x(t)$'); plt.grid(True); plt.title(\"Function 3\")\n", "plt.subplot(224); plt.plot(t, func4(t))\n", "plt.xlabel('$t$'); plt.ylabel('$x(t)$'); plt.grid(True); plt.title(\"Function 4\")\n", "plt.tight_layout()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now, let us write a function `fourierSeries` that performs the calculation of the Fourier series coefficients:" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "def fourierSeries(period, N):\n", " \"\"\"Calculate the Fourier series coefficients up to the Nth harmonic\"\"\"\n", " result = []\n", " T = len(period)\n", " t = np.arange(T)\n", " for n in range(N+1):\n", " an = 2/T*(period * np.cos(2*np.pi*n*t/T)).sum()\n", " bn = 2/T*(period * np.sin(2*np.pi*n*t/T)).sum()\n", " result.append((an, bn))\n", " return np.array(result)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "And use it to calculate the coefficients up to the 20th order for the first function:" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "C:\\Users\\mopfe\\Anaconda3\\lib\\site-packages\\ipykernel_launcher.py:4: UserWarning: In Matplotlib 3.3 individual lines on a stem plot will be added as a LineCollection instead of individual lines. This significantly improves the performance of a stem plot. To remove this warning and switch to the new behaviour, set the \"use_line_collection\" keyword argument to True.\n", " after removing the cwd from sys.path.\n", "C:\\Users\\mopfe\\Anaconda3\\lib\\site-packages\\ipykernel_launcher.py:6: UserWarning: In Matplotlib 3.3 individual lines on a stem plot will be added as a LineCollection instead of individual lines. This significantly improves the performance of a stem plot. To remove this warning and switch to the new behaviour, set the \"use_line_collection\" keyword argument to True.\n", " \n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "t_period = np.arange(0, 1, 1/Fs)\n", "F = fourierSeries(func1(t_period), 20)\n", "plt.figure(figsize=(6,2))\n", "plt.subplot(121); plt.stem(F[:,0])\n", "plt.grid(True); plt.xlabel('$n$'); plt.ylabel('$a_n$'); plt.ylim((0,1.4))\n", "plt.subplot(122); plt.stem(F[:,1])\n", "plt.grid(True); plt.xlabel('$n$'); plt.ylabel('$b_n$'); plt.ylim((0,1.4))\n", "n = np.linspace(0.1,20,100);plt.plot(n, 4/(np.pi*n), label=r'$\\sim 1/n$'); plt.legend(fontsize=10)\n", "plt.tight_layout()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We make two observations here: First, we see that $a_n=0$. From the plot for function 1 we see that it is an odd function, i.e. $x(t)=-x(-t)$. In this case, the Fourier series only contains odd functions, which are solely the terms including the sines (since $\\sin(x)=-\\sin(-x)$). Second, the Fourier coefficients $b_n$ decay slowly with speed $1/n$ and every 2nd $b_n$ is zero. We can explain this by relating it to knowledge of the [Fourier Transform](http://dspillustrations.com/pages/posts/misc/approximating-the-fourier-transform-with-dft.html): The function is a sum of two rectangular functions of width $\\frac{1}{2}s$. We know the Fourier transform of such a rectangle is a sinc-function, which has zeros at a distance of $2Hz$. Furthermore, the magnitude of the sinc-function decays with $1/f$. This is very in line with the obtained coefficients: They decay with $1/n$ and every 2nd values is zero.\n", "\n", "Let us now look at the reconstruction of the signal, i.e. we calculate $x(t)$ from its Fourier series coefficients up to a given order. We write a function `reconstruct` to do this for us:" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "def reconstruct(P, anbn):\n", " result = 0\n", " t = np.arange(P)\n", " for n, (a, b) in enumerate(anbn):\n", " if n == 0:\n", " a = a/2\n", " result = result + a*np.cos(2*np.pi*n*t/P) + b * np.sin(2*np.pi*n*t/P)\n", " return result" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's have a look at the reconstructed signal for our rectangular function up to the 20th harmonic:" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "F = fourierSeries(func1(t_period), 100)\n", "plt.plot(t_period, func1(t_period), label='Original', lw=2)\n", "plt.plot(t_period, reconstruct(len(t_period), F[:2,:]), label='Reconstructed with 2 Harmonics');\n", "plt.plot(t_period, reconstruct(len(t_period), F[:5,:]), label='Reconstructed with 5 Harmonics');\n", "plt.plot(t_period, reconstruct(len(t_period), F[:20,:]), label='Reconstructed with 20 Harmonics');\n", "plt.plot(t_period, reconstruct(len(t_period), F[:100,:]), label='Reconstructed with 100 Harmonics');\n", "plt.grid(True); plt.ylabel('$x(t)$'); plt.xlabel('$t$');\n", "plt.legend(fontsize=10);" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "As we can see, the reconstructed signal roughly follows the original, and the more harmonics are used, the better. However, we also see that especially in the region of the jump at $t=0.5$, the reconstructed signal is not exact. Instead, the reconstructed signal significantly fluctuates at this position. This phenomenom is called [Gibbs Phenonenom](https://en.wikipedia.org/wiki/Gibbs_phenomenon \"Wikipedia Link\") and describes the fact that the Fourier series has large oscillations around jump discontinuities. In particular, the height of overshooting or undershooting does not depend on the number of harmonics and is roughly 9% of the jump height. However, the duration of the oscillations decreases with the number of harmonics, eventually leading to a correct approximation in the limit for infinitely many harmonics. \n", "\n", "Let us now have a look at the Fourier Series of some functions, and how their approximation by the Fourier series appears for different number of Harmonics:" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "def showHarmonics(period, N):\n", " \"\"\"Calculate the Fourier Series up to N harmonics, and show the reconstructed signal.\"\"\"\n", " F = fourierSeries(period, N+1)\n", " plt.gcf().clear()\n", " plt.subplot(231); plt.stem(F[:,0])\n", " plt.xlim((0,20)); Vi = F.min(); Va = F.max(); plt.ylim((Vi,Va)); plt.ylabel('$a_n$')\n", " plt.subplot(234); plt.stem(F[:,1])\n", " plt.xlim((0,20)); plt.ylim((Vi,Va)); plt.xlabel('Harmonic'); plt.ylabel('$b_n$')\n", " plt.subplot(132)\n", " T = len(period)\n", " t = np.arange(T)/T\n", " result = 0\n", " for n, (an, bn) in enumerate(F):\n", " if n == 0:\n", " an = an/2\n", " cos_part = an*np.cos(2*np.pi*n*t)\n", " sin_part = bn*np.sin(2*np.pi*n*t)\n", " plt.plot(t, cos_part)\n", " plt.plot(t, sin_part)\n", " result = result + cos_part + sin_part\n", " plt.grid(True); plt.ylabel(r'$a_n \\sin(2\\pi n t), b_n\\cos(2\\pi nt)$'); plt.xlabel('$t$');\n", " plt.text(0.5, 0.8*abs(F[1:,:]).max(), 'N=%d' % N, bbox=dict(facecolor='white'))\n", " plt.subplot(133)\n", " t2 = np.arange(2*T)/T\n", " plt.plot(t2, np.tile(period, 2))\n", " plt.plot(t2, np.tile(result, 2))\n", " plt.grid(True); plt.ylabel(r'$x(t), r_N(t)$'); plt.xlabel('$t$');\n", " plt.ylim((period.min()-0.4, period.max()+0.4))\n", " plt.tight_layout()\n", " showInInteract()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "First, we again see the rectangular function. With increasing number of harmonics, we see that the rect is approximated better. However, we also see that the amount of overshooting at the jump discontinuity stays constant, independent of the number of harmonics." ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "6639fc8aabad44e9a4de8ccd91103513", "version_major": 2, "version_minor": 0 }, "text/plain": [ "interactive(children=(IntSlider(value=10, description='N', max=20, min=1), Output()), _dom_classes=('widget-in…" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "period = func1(np.arange(0, 1, 1/Fs))\n", "interact(lambda N: showHarmonics(period, N), N=(1, 20));" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Next is the periodic linear ramp function. Again, we see that the amount of overshooting at the discontinuity is independent of the number of harmonics. However, the duration of the oscillations becomes shorter and in general the approximation becomes better with more harmonics. Also, except for the DC component $a_0$, all coefficients $a_n=0$. This is again due to the fact that the function is odd, i.e. we have $x(t)=1-x(-t)$. Therefore, only the components for the sine-wave are non-zero. " ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "5ad77f64ec3b4a27be35af4478a524b1", "version_major": 2, "version_minor": 0 }, "text/plain": [ "interactive(children=(IntSlider(value=10, description='N', max=20, min=1), Output()), _dom_classes=('widget-in…" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "period = func2(np.arange(0, 1, 1/Fs))\n", "interact(lambda N: showHarmonics(period, N), N=(1, 20));" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The third function looks more complicated since it has more jumps and is in general more irregular than the previous functions. In fact, there is a significant amount of overshooting in the lower part of the graph, which only very slowly decreases with more harmonics. This is coming from the high amount of discontinuities of the function. The function is an even function, i.e. $x(t)=x(-t)$. Therefore, all $b_n=0$, which correspond to the contribution of the sine-waves. Instead, only the cosine-waves, which are even functions, make up the overall Fourier series. " ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "2ad86696c38e438e9a88cdca805901ff", "version_major": 2, "version_minor": 0 }, "text/plain": [ "interactive(children=(IntSlider(value=10, description='N', max=20, min=1), Output()), _dom_classes=('widget-in…" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "period = func3(np.arange(0, 1, 1/Fs))\n", "interact(lambda N: showHarmonics(period, N), N=(1, 20));" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Eventually, we take a look at the periodic parabola function. First, we recognize that the function is well approximated with only very few harmonics. We can explain this by the general smoothness of the function with no discontinuities. Additionally, we again identify that $b_n=0$, since $x(t)$ is an even function, i.e. $x(t)=x(-t)$." ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "24e0c022c3e04cffb52bfcdc43f1d1ba", "version_major": 2, "version_minor": 0 }, "text/plain": [ "interactive(children=(IntSlider(value=10, description='N', max=20, min=1), Output()), _dom_classes=('widget-in…" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "period = func4(np.arange(0, 1, 1/Fs))\n", "interact(lambda N: showHarmonics(period, N), N=(1, 20));" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Summary\n", "> - The Fourier Series decomposes a periodic function with period T into sines and cosines with frequencies $\\frac{n}{T}, n=0,1,2,\\ldots$ which are called the $n$th harmonics of the signal. The more harmonics are used, the more accurate can a function be described.\n", "> - For **even functions**, i.e. $x(t)=x(-t)$, the Fourier series **only consists of cosines**. For **odd functions**, i.e. $x(t)=-x(-t)$, the Fourier series **only consists of sines**.\n", "> - At jump discontinuities, the value of the Fourier series is in the middle of the jump. Around the jump, overshooting of the series occurs, which is called **Gibbs Phenonemon**. The amount of overshooting does not reduce with the number of harmonics, but the duration reduces.\n", "> - Smooth functions need less harmonics to be accurately described by the Fourier series.\n", "\n", "In a future article, we will investigate the relation of the Fourier series to the Fourier transform, and analyze sounds of instruments according to their structure of the harmonics. Subscribe to our newsletter on the right to not miss upcoming posts!" ] } ], "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.6.5" } }, "nbformat": 4, "nbformat_minor": 2 }