{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "[exercises](dft.ipynb)" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": false }, "outputs": [], "source": [ "%matplotlib inline\n", "import matplotlib.pyplot as plt\n", "import numpy as np" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false }, "outputs": [], "source": [ "amplitudes = 1, 0.75, 0.5, 0.25, 0.125\n", "frequencies = 200, 400, 600, 800, 1000 # Hz\n", "phaseshifts = 0, 0, 90, 90, -90 # degree\n", "duration = 1 # second\n", "fs = 44100 # Hz\n", "\n", "# parameters as row vectors\n", "amplitudes = np.asarray(amplitudes).reshape(1, -1)\n", "frequencies = np.asarray(frequencies).reshape(1, -1)\n", "phaseshifts = np.asarray(phaseshifts).reshape(1, -1)\n", "\n", "# time values as column vector\n", "t = (np.arange(np.ceil(duration * fs)) / fs).reshape(-1, 1)\n", "\n", "cosines = amplitudes * np.cos(2 * np.pi * frequencies * t + np.deg2rad(phaseshifts))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Split into several variables (e.g. for listening), each holding a row (no copies of the data are made!):" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false }, "outputs": [], "source": [ "x1, x2, x3, x4, x5 = cosines.T" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false }, "outputs": [], "source": [ "x6 = np.sum(cosines, axis=1)" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false }, "outputs": [], "source": [ "six_signals = np.column_stack((cosines, x6))" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.plot(six_signals[:500])\n", "plt.ylim(-2.3, 2.3);" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "When playing back with a sound card or when writing to a sound file, the values are automatically clipped to a range from -1 to 1, leading to heavy distortions for signals that exceed this range:" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\nIU9E5LH/B/9+9bjPIofKAAAAAElFTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.plot(np.clip(x6[:500], -1, 1))\n", "plt.ylim(-2.3, 2.3);" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To avoid this clipping, we should scale the signal values to $\\pm 1$ beforehand:" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": false }, "outputs": [], "source": [ "x6_norm = x6 / np.max(np.abs(x6))" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\nRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.plot(x6_norm[:500])\n", "plt.ylim(-2.3, 2.3);" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "collapsed": false }, "outputs": [], "source": [ "def naive_fourier_transform(x):\n", " \"\"\"Naive implementation of the DFT equation.\n", " \n", " The input must be a one-dimensional array.\n", " WARNING: this implementation is extremely inefficient!\n", " \n", " \"\"\"\n", " N = len(x)\n", " n = np.arange(N)\n", " return np.array([np.sum(x * np.exp(-1j * 2 * np.pi * k * n / N))\n", " for k in range(N)])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In case you wonder what that last thing is, up there inside of the `np.array(...)`: it's a *list comprehension*!\n", "This is a really nice feature of Python, to learn more about them, have a look at [List Comprehensions, Generators, Generator Expressions](http://nbviewer.ipython.org/github/mgeier/python-audio/blob/master/misc/comprehensions-and-generators.ipynb)." ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "collapsed": false }, "outputs": [], "source": [ "#X1_naive = naive_fourier_transform(x1) # takes much too long!" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Complexity of naive implementation: $\\mathcal{O}(N^2)$" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "collapsed": false }, "outputs": [], "source": [ "X1_naive = naive_fourier_transform(x1[:1000])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Matrix multiplication:\n", "One could calculate the DFT by multiplying a matrix containing the values of the exponential function by the vector $x$.\n", "The computation could *theoretically* be a bit more efficient, since the whole matrix multiplication can be done in C or Fortran (or whatever NumPy uses) instead of native Python.\n", "But this only matters for very short signals, because the memory requirements would be quadratic instead of linear!\n", "For example, storing the above-mentioned matrix for a one-second signal @ 44.1 kHz would need ..." ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "15558480000" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "44100**2 * np.dtype('float64').itemsize" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "... thats about 14.5 GB of memory!" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "collapsed": false }, "outputs": [], "source": [ "X1_fft = np.fft.fft(x1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Algorithmic complexity of FFT: $\\mathcal{O}(N\\log_2N)$" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "collapsed": false }, "outputs": [], "source": [ "X1_fft = np.fft.fft(x1[:1000])" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "7.8615763522521785e-11" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.max(np.abs(X1_fft - X1_naive))" ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "356.59263628672301" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.max(np.abs(X1_naive))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Maximum error in decibel (where 0 dB is the absolute maximum value of `X1_naive`):" ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "-253.13325467955931" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "20 * np.log10(np.max(np.abs(X1_fft - X1_naive)) / np.max(np.abs(X1_naive)))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Maximum dynamic range of a 16-bit signal: about 96 dB.\n", "This does not depend on the sampling rate." ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "96.329598612473987" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "20 * np.log10(2**16)" ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "collapsed": false }, "outputs": [], "source": [ "cosine_spectra = np.fft.fft(cosines, axis=0)\n", "X6 = np.fft.fft(x6)" ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Using matplotlib backend: TkAgg\n" ] } ], "source": [ "%matplotlib\n", "plt.plot(np.abs(cosine_spectra))\n", "plt.figure()\n", "plt.plot(np.abs(X6));" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note the warning message when plotting a complex signal!" ] }, { "cell_type": "code", "execution_count": 22, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# TODO: phase plot" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "It's probably best to write your own plotting functions for spectra, but you should also have a look at [matplotlib.pyplot.magnitude_spectrum()](http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.magnitude_spectrum) and [matplotlib.pyplot.phase_spectrum()](http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.phase_spectrum)." ] }, { "cell_type": "code", "execution_count": 23, "metadata": { "collapsed": false }, "outputs": [], "source": [ "x1_ifft = np.fft.ifft(cosine_spectra[:, 0])" ] }, { "cell_type": "code", "execution_count": 24, "metadata": { "collapsed": false }, "outputs": [], "source": [ "plt.figure()\n", "plt.plot(x1_ifft.imag)\n", "plt.figure()\n", "plt.plot(x1_ifft.real - x1);" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The maximum of the imaginary part is in the order of magnitude of $10^{-15}$, same for the difference of the real part compared to the original signal $x_1$." ] }, { "cell_type": "code", "execution_count": 25, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# TODO: plot function" ] }, { "cell_type": "code", "execution_count": 26, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# TODO: plot function using rfft()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Which parameters are visible?\n", "\n", "* time domain: amplitude, frequency, duration. Also the phase, if you look closely.\n", "\n", "* frequency domain: amplitude, frequency. Phase not that easily. Duration not visible." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

\n", " \n", " \"CC0\"\n", " \n", "
\n", " To the extent possible under law,\n", " the person who associated CC0\n", " with this work has waived all copyright and related or neighboring\n", " rights to this work.\n", "

" ] } ], "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.4.3+" } }, "nbformat": 4, "nbformat_minor": 0 }