{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import matplotlib.pyplot as plt\n", "from ipywidgets import interact\n", "from matplotlib import animation\n", "from IPython.display import HTML\n", "\n", "import matplotlib\n", "matplotlib.rcParams['animation.writer'] = 'avconv'\n", "%matplotlib inline\n", "\n", "\n", "from ipywidgets import interact\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 complex Fourier Series and its relation to the Fourier Transform\n", "\n", "In two recent articles we have talked about the [Fourier Series](http://dspillustrations.com/pages/posts/misc/fourier-series-and-harmonic-approximation.html) and an application in harmonic analysis of [instrument sounds](http://dspillustrations.com/pages/posts/misc/the-sound-of-harmonics-approximating-instrument-sounds-with-fourier-series.html) in terms of their Fourier coefficients. In this article, we will analyze the relation between the Fourier Series and the Fourier Transform. \n", "\n", "## The Fourier Series as sums of sines and cosines\n", "To recap, the Fourier series of a signal $x(t)$ with period $P$ is given by\n", "\n", "$$\\begin{align}x(t)=\\frac{a_0}{2}+\\sum_{n=1}^\\infty a_n\\cos(2\\pi nt/P)+b_n\\sin(2\\pi nt/P)\\end{align}$$\n", "\n", "where the coefficients are given by\n", "\n", "$$\\begin{align}a_n&=\\frac{2}{P}\\int_{-\\frac{P}{2}}^\\frac{P}{2}x(t)\\cos(2\\pi nt/P)dt\\\\b_n&=\\frac{2}{P}\\int_{-\\frac{P}{2}}^\\frac{P}{2}x(t)\\sin(2\\pi nt/P)dt\\end{align}.$$\n", "\n", "As we see, the Fourier series is a sum of sines and cosines with different amplitudes. Let us first look at the sum of a sine and cosine with different amplitudes:\n", "\n", "### Sum of a sine and cosine with equal frequency" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "Fs = 100 # the sampling frequency for the discrete analysis\n", "T = 3 # time duration to look at\n", "P = 1 # signal period\n", "t = np.arange(0, T, 1/Fs)\n", "\n", "a_n = 1\n", "b_n = 0.4\n", "\n", "s = lambda t: a_n*np.cos(2*np.pi*t/P)\n", "c = lambda t: b_n*np.sin(2*np.pi*t/P)\n", "\n", "plt.plot(t, s(t), 'b', label='$a_n\\cos(2\\pi t)$')\n", "plt.plot(t, c(t), 'g', label='$b_n\\sin(2\\pi t)$')\n", "plt.plot(t, s(t)+c(t), 'r', label='$a_n\\cos(2\\pi t)+b_n\\sin(2\\pi t)$')\n", "plt.legend(); plt.grid(); plt.xlabel('$t$');" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "As it appears, the sum of a sine and cosine of different amplitudes but same frequency equals another harmonic function with different amplitude and some phase shift. Hence, we can write\n", "$$a_n\\cos(2\\pi nt/P)+b_n\\sin(2\\pi nt/P) = A_n\\cos(2\\pi nt/P+\\phi_n)$$\n", "where $A_n$ is the amplitude and $\\phi_n$ is the phase of the resulting harmonic. In the following, we will calculate the values of $A_n$ and $\\phi_n$ from $a_n, b_n$. Let us start with the following identities:\n", "\n", "$$\\begin{align}\\cos(x)&=\\frac{1}{2}(\\exp(jx)+\\exp(-jx))\\\\ \\sin(x)&=-\\frac{j}{2}(\\exp(jx)-\\exp(-jx))\\end{align}.$$\n", "\n", "Then, we can write the sine and cosine and their sum as \n", "\n", "$$\n", "\\begin{align}\n", "a_n\\cos(2\\pi nt/P)&=\\frac{a_n}{2}(\\exp(j2\\pi nt/P)+\\exp(-j2\\pi nt/P))\\\\\n", "b_n\\sin(2\\pi nt/P)&=-\\frac{jb_n}{2}(\\exp(j2\\pi nt/P)-\\exp(-j2\\pi nt/P))\\\\\n", "a_n\\cos(2\\pi nt/P)+b_n\\sin(2\\pi nt/P)&=(a_n-jb_b)\\frac{1}{2}\\exp(j2\\pi nt/P)+(a_n+jb_n)\\frac{1}{2}\\exp(-j2\\pi nt/P)\n", "\\end{align}\n", "$$\n", "\n", "We can now convert the cartesian expression for $a_n-jb_n$ into the polar form by\n", "$$\\begin{align}&&a_n-jb_n&=A_n\\exp(j\\phi_n)\\\\\n", "\\text{with }A_n&=\\sqrt{a_n^2+b_n^2} &\\text{and}&&\\phi_n&=\\tan^{-1}(-b_n/a_n)\\end{align}$$\n", "\n", "Accordingly, we can reformulate the sum of sine and cosine as\n", "$$\\begin{align}a_n\\cos(2\\pi nt/P)+b_n\\sin(2\\pi nt/P)&=A_n\\frac{1}{2}(\\exp(j2\\pi nt/P+\\phi_n)+\\exp(-j(2\\pi nt/P+\\phi_n))\\\\\n", "&=A_n\\cos(2\\pi nt/P+\\phi_n).\\end{align}$$\n", "\n", "This statement eventually confirms that the sum of a sine and cosine of same frequency but different amplitude is indeed another harmonic function. Let us verify this numerically:" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "def sumSineCosine(an, bn):\n", " Fs = 100\n", " T = 3\n", " P = 1\n", " t = np.arange(0, T, 1/Fs)\n", " \n", " A = np.sqrt(an**2+bn**2)\n", " phi = np.arctan2(-bn, an)\n", "\n", " f1 = an*np.cos(2*np.pi*t/P)\n", " f2 = bn*np.sin(2*np.pi*t/P)\n", " \n", " overall = A*np.cos(2*np.pi*t/P + phi)\n", "\n", " plt.gcf().clear()\n", " plt.plot(t, f1, 'b', label='$x(t)=a_n\\cos(2\\pi nft)$')\n", " plt.plot(t, f2, 'g', label='$y(t)=b_n\\sin(2\\pi nft)$')\n", " plt.plot(t, f1+f2, 'r', label='$x(t)+y(t)$')\n", " plt.plot(t, overall, 'ro', lw=2, markevery=Fs//(10), label='$A_n\\cos(2\\pi nft+\\phi)$')\n", " plt.grid(True)\n", " plt.xlabel('$t$');\n", " plt.ylabel(r'$a_n\\cos(2\\pi ft), b_n\\sin(2\\pi ft), A_n\\sin(2\\pi ft+\\phi)$')\n", " plt.legend(fontsize=10)\n", " plt.ylim((-3,3))\n", " plt.text(0.5, 2, r\"$a_n=%.1f, b_n=%.1f$\" % (an, bn), bbox=dict(facecolor=\"white\"))\n", " showInInteract()" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "scrolled": true }, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "7c68dbc9efec4c6794dc9d0e61fd49d9", "version_major": 2, "version_minor": 0 }, "text/plain": [ "interactive(children=(FloatSlider(value=0.0, description='an', max=2.0, min=-1.0), FloatSlider(value=0.0, desc…" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "interact(sumSineCosine, an=(-1, 2, 0.1), bn=(-1, 2, 0.1));" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "As we can see, the result perfectly holds. \n", "\n", "## The Fourier Series with amplitude and phase\n", "\n", "Now, let us express the Fourier Series in terms of our new formulation\n", "$$x(t)=\\frac{a_0}{2}+\\sum_{n=1}^\\infty A_n\\cos(2\\pi nt/P+\\phi_n)$$\n", "\n", "Here we see, that $x(t)$ is consisting of different harmonics, with the $n$th one having the amplitude $A_n$. Since a harmonic function wave with amplitude $A$ has power $A^2/2$, the $n$th harmonic of $x(t)$ has the power $A_n^2/2=\\frac{1}{2}(a_n^2+b_n^2)$. \n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Fourier Series with complex exponential\n", "\n", "Let us now write the Fourier Series even in a different form. By replacing the sum of sine and cosine with exponential terms, we get\n", "\n", "$$\\begin{align}x(t)&=\\frac{a_0}{2}+\\sum_{n=1}^\\infty a_n\\cos(2\\pi nt/P)+b_n\\sin(2\\pi nt/P)\\\\\n", "&=\\frac{a_0}{2}+\\sum_{n=1}^\\infty \\frac{a_n-jb_n}{2}\\exp(j2\\pi nt/P) + \\frac{a_n+jb_n}{2}\\exp(-j2\\pi nt/P)\\end{align}$$\n", "\n", "Let us now set $$c_n=\\begin{cases}\\frac{a_n-jb_n}{2} & n > 0\\\\\\frac{a_0}{2} & n=0 \\\\ \\frac{a_n+jb_n}{2} & c < 0\\end{cases},$$\n", "\n", "such that we can alternatively write the Fourier series as\n", "\n", "$$x(t)=\\sum_{n=-\\infty}^{\\infty}c_n\\exp(j2\\pi nt/P).$$\n", "\n", "Even, the calculation of the coefficients $c_n$ is very straight-forward, as we have\n", "\n", "$$\\begin{align}c_n = \\frac{a_n-jb_n}{2}&=\\frac{1}{2}\\left[\\frac{2}{P}\\int_{-\\frac{P}{2}}^{\\frac{P}{2}}x(t)\\cos(2\\pi nt/P)dt-j\\frac{2}{P}\\int_{-\\frac{P}{2}}^{\\frac{P}{2}}x(t)\\sin(2\\pi nt/P)dt\\right]\\\\&=\\frac{1}{P}\\int_{-\\frac{P}{2}}^{\\frac{P}{2}}x(t)[\\cos(2\\pi nt/P)-j\\sin(2\\pi nt/P)]dt\\\\&=\\frac{1}{P}\\int_{-\\frac{P}{2}}^{\\frac{P}{2}}x(t)\\exp(-j2\\pi nt/P)dt\\end{align}$$\n", "\n", "for $n>0$. We get exactly the same expression for $n\\leq 0$.\n", "\n", "So, to summarize, the formulation for the Fourier series is given by\n", "\n", "$$\\begin{align}x(t)&=\\sum_{n=-\\infty}^{\\infty}c_n\\exp(j2\\pi nt/P)\\\\\n", "\\text{with }c_n&=\\int_{-\\frac{P}{2}}^{\\frac{P}{2}}x(t)\\exp(-j2\\pi nt/P)dt.\\end{align}$$\n", "\n", "We can again verify this numerically. First, let us implement the two different possibilities to calculate the Fourier series coefficients $a_n,b_n$ or $c_n$:" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "def fourierSeries_anbn(period, N):\n", " \"\"\"Calculate the Fourier series coefficients an, bn 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)\n", "\n", "def fourierSeries_cn(period, N):\n", " \"\"\"Calculate the Fourier series coefficients an, bn up to the Nth harmonic\"\"\"\n", " result = []\n", " T = len(period)\n", " t = np.arange(T)\n", " for n in range(N+1):\n", " c_plusn = 1/T * (period * np.exp(-2j*np.pi*n*t/T)).sum()\n", " c_minusn = 1/T * (period * np.exp(2j*np.pi*n*t/T)).sum()\n", " result.append((c_plusn, c_minusn))\n", " return np.array(result)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Then, let's calculate the coefficients for some function $x(t)$ with both methods and compare them." ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "x = lambda t: (abs(t % 1)<0.05).astype(float) # define a rectangular function\n", "\n", "t = np.arange(-1.5, 1.5, 0.001)\n", "\n", "plt.figure(figsize=(8,3))\n", "plt.subplot(131) \n", "plt.plot(t, x(t))\n", "plt.ylim((-0.1, 1.1)); plt.title('Time domain $x(t)$'); plt.xlabel('$t$'); plt.ylabel('$x(t)$'); plt.grid(True)\n", "\n", "\n", "t_period = np.arange(0, 1, 0.001)\n", "period = x(t_period)\n", "anbn = fourierSeries_anbn(period, 100)\n", "cn = fourierSeries_cn(period, 100)\n", "\n", "plt.subplot(132)\n", "plt.plot(anbn[:,0], label='$a_n$')\n", "plt.plot(anbn[:,1], label='$b_n$')\n", "plt.grid(True); plt.xlabel('$n$'); plt.ylabel('$a_n,b_n$'); plt.title('fourierSeries_anbn'); plt.legend(fontsize=10)\n", "yl = plt.gca().get_ylim()\n", "\n", "plt.subplot(133)\n", "plt.plot(cn[:,0].real, label='$Re(c_n)$')\n", "plt.plot(cn[:,0].imag, label='$Im(c_n)$')\n", "plt.grid(True); plt.xlabel('$n$'); plt.ylabel('$cn$'); plt.title('fourierSeries_cn'); plt.legend(fontsize=10)\n", "plt.ylim(yl)\n", "\n", "plt.tight_layout()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "As shown, the relation $c_n=\\frac{a_n-jb_n}{2}, n>0$ exactly holds.\n", "\n", "## The relation between the Fourier Series and Fourier Transform\n", "\n", "Let us first repeat the Fourier series and Fourier transform pairs:\n", "\n", "$$\\begin{align}x(t)&=\\sum_{n=-\\infty}^{\\infty}c_n\\exp(j2\\pi \\frac{n}{P}t) &c_n&=\\int_{-\\frac{P}{2}}^{\\frac{P}{2}}x(t)\\exp(-j2\\pi \\frac{n}{P}t)dt&\\text{Fourier Series}\\\\\n", "x(t)&=\\int_{-\\infty}^{\\infty}X(f)\\exp(j2\\pi ft)dt&X(f)&=\\int_{-\\infty}^{\\infty}x(t)\\exp(-j2\\pi ft)dt&\\text{Fourier Transform}\\end{align}$$\n", "\n", "We already see, that there is quite some similarity between the expressions for the series and transform. Let us investigate their relations:\n", "\n", "We know that the Fourier transform can be applied for an aperiodic signal, whereas the Fourier series is used for a periodic signal with period $P$. Furthermore, we see that the Fourier transform allows the signal $x(t)$ to consist of arbitrary frequencies $f$, whereas the periodic signal $x(t)$ in the Fourier series is consisting only of harmonics of discrete frequency $f_n=\\frac{n}{P}$. Let us reformulate the Fourier series with using the Dirac filter property\n", "\n", "$$\\int_{-\\infty}^{\\infty}x(t)\\delta(t-\\tau)dt=x(\\tau)$$\n", "\n", "to become \n", "\n", "$$x(t)=\\int_{-\\infty}^{\\infty}X(f)\\exp(j2\\pi \\frac{n}{P}t)df \\text{ with }X(f)=\\sum_{n=-\\infty}^{\\infty}c_n\\delta(f-\\frac{n}{P}).$$\n", "\n", "The expression for $x(t)$ is now equal to the inverse Fourier transform, and we can already identify $X(f)$ as the spectrum of the periodic $x(t)$. We see that $X(f)$ of the periodic signal is discrete, i.e. it is nonzero at only the harmonic frequencies $\\frac{n}{P}$. The difference between the discrete frequencies is $\\frac{1}{P}$, i.e. it decreases with larger period lengths. If we now eventually assume $P\\rightarrow\\infty$, i.e. we let the period duration of the signal become infinite, we directly end up with the expression for the Fourier transform, because \n", "\n", "$$\\lim_{P\\rightarrow\\infty}\\sum_{n=-\\infty}^{\\infty}c_n\\delta(f-\\frac{n}{P})$$\n", "\n", "becomes a continuous function of $f$, since the Diracs get closer and closer together, eventually merging to a smooth function (intuitively; mathematical rigorous treatment is omitted here). \n", "\n", "Let us eventually verify this relation numerically: We take a single rectangular pulse and increase its period's length, i.e. we keep the length of the rect pulse constant, but increase the distance between the pulses, eventually leading to a single, aperiodic pulse, when the period duration becomes infinite:" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "def compareSeriesAndTransform(P):\n", " Fs = 1000\n", " t = np.arange(0, 100, 1/Fs)\n", " t_period = np.arange(0, P, 1/Fs)\n", " x_p = lambda t: (abs((t % P)-0.5) <= 0.5).astype(float)\n", " x = lambda t: (abs(t-0.5) <= 0.5).astype(float)\n", " plt.gcf().clear()\n", " plt.subplot(121)\n", " plt.plot(t, x_p(t))\n", " plt.annotate(xy=(0, -0.02), xytext=(P, -0.02), s='', arrowprops=dict(arrowstyle='<->', shrinkA=0, shrinkB=0))\n", " plt.text(P/2, -0.02, '$P$', va='top', ha='center')\n", " plt.ylim((-0.1, 1.1)); plt.xlim((0, 15)); plt.ylabel('$x(t)$'); plt.xlabel('$t$')\n", " \n", " cn = fourierSeries_cn(x_p(t_period), 100)[:,0]\n", " f_discrete = np.arange(len(cn))/P\n", " \n", " f = np.linspace(0, Fs, len(t), endpoint=False)\n", " X = np.fft.fft(x(t))/Fs\n", " plt.subplot(122)\n", " plt.plot(f, abs(X), label='Fourier Tr. of rect')\n", " plt.stem(f_discrete, abs(cn*P), label='Fourier Series $c_n$')\n", " plt.xlim((0, 4))\n", " plt.xlabel('$f$'); plt.ylabel('$c_n, X(f)$'); plt.grid(True); plt.title('Frequency domain'); plt.legend(fontsize=10);\n", " \n", " plt.tight_layout(); showInInteract()" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "670b39745e1043618d29834770d7e8d9", "version_major": 2, "version_minor": 0 }, "text/plain": [ "interactive(children=(FloatSlider(value=5.0, description='P', max=10.0, min=1.0), Output()), _dom_classes=('wi…" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "interact(compareSeriesAndTransform, P=(1, 10, 0.1));" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "As we have expected, the Fourier series provides a discrete spectrum of the periodic signal. The value of the discrete samples is equal to the value of the Fourier transform of the aperiodic signal." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Summary\n", "> - The Fourier Series can be formulated in 3 ways:\n", "\n", " $$\\begin{align}1)\\quad x(t)&=\\frac{a_0}{2}+\\sum_{n=1}^\\infty a_n\\cos(2\\pi nt/P)+b_n\\sin(2\\pi nt/P)&a_n&=\\frac{2}{P}\\int_{-\\frac{P}{2}}^\\frac{P}{2}x(t)\\cos(2\\pi nt/P)dt&b_n&=\\frac{2}{P}\\int_{-\\frac{P}{2}}^\\frac{P}{2}x(t)\\sin(2\\pi nt/P)dt \\\\\n", " 2)\\quad x(t)&=\\frac{a_0}{2}+\\sum_{n=1}^\\infty A_n\\cos(2\\pi nt/P+\\phi_n)&A_n&=\\sqrt{a_n^2+b_n^2}&\\phi_n&=\\tan^{-1}(-b_n/a_n)\\\\3)\\quad x(t)&=\\sum_{n=-\\infty}^{\\infty}c_n\\exp(j2\\pi nt/P)&c_n&=\\int_{-\\frac{P}{2}}^{\\frac{P}{2}}x(t)\\exp(-j2\\pi nt/P)dt\\end{align}$$\n", " \n", "> - The Fourier Transform can be understood as the limiting case of the complex Fourier series, when the period grows to infinity. " ] } ], "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": 1 }