{ "cells": [ { "cell_type": "markdown", "metadata": { "nbsphinx": "hidden" }, "source": [ "# Spectral Analysis of Deterministic Signals\n", "\n", "*This jupyter notebook is part of a [collection of notebooks](../index.ipynb) on various topics of Digital Signal Processing. Please direct questions and suggestions to [Sascha.Spors@uni-rostock.de](mailto:Sascha.Spors@uni-rostock.de).*" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Zero-Padding" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Concept" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's assume a signal $x_N[k]$ of finite length $N$, for instance a windowed signal $x_N[k] = x[k] \\cdot \\text{rect}_N[k]$. The discrete Fourier transformation (DFT) of $x_N[k]$ reads\n", "\n", "\\begin{equation}\n", "X_N[\\mu] = \\sum_{k=0}^{N-1} x_N[k] \\; w_N^{\\mu k}\n", "\\end{equation}\n", "\n", "where $w_N = \\mathrm{e}^{-\\mathrm{j} \\frac{2 \\pi}{N}}$ denotes the kernel of the DFT. For a sampled time-domain signal, the distance in frequency between two neighboring coefficients is given as $\\Delta f = \\frac{f_s}{N}$, where $f_s = \\frac{1}{T}$ denotes the sampling frequency. Hence, if $N$ is increased the distance between neighboring frequencies is decreased. This leads to the concept of zero-padding in spectral analysis. Here the signal $x_N[k]$ of finite length is filled up with (M-N) zero values to a total length $M \\geq N$\n", "\n", "\\begin{equation}\n", "x_M[k] = \\begin{cases}\n", "x_N[k] & \\mathrm{for} \\; k=0,1,\\dots,N-1 \\\\\n", "0 & \\mathrm{for} \\; k=N,N+1,\\dots,M-1\n", "\\end{cases}\n", "\\end{equation}\n", "\n", "Appending zeros does not change the contents of the signal itself. However, the DFT $X_M[\\mu]$ of $x_M[k]$ has now a decreased distance between neighboring frequencies $\\Delta f = \\frac{f_s}{M}$.\n", "\n", "The question arises what influence zero-padding has on the spectrum and if it can enhance spectral analysis. On first sight it seems that the frequency resolution is higher, however do we get more information on the signal? In order to discuss this, a short numerical example is evaluated followed by a derivation of the mathematical relations between the spectrum $X_M[k]$ with zero-padding and $X_N[k]$ without zero-padding." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Example - Zero-Padding" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The following example computes and plots the magnitude spectra $|X[\\mu]|$ of a truncated complex exponential signal $x_N[k] = \\mathrm{e}^{\\,\\mathrm{j}\\,\\Omega_0\\,k} \\cdot \\text{rect}_N[k]$ and its zero-padded version $x_M[k]$." ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "%matplotlib inline\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "\n", "N = 16 # length of the signal\n", "M = 32 # length of zero-padded signal\n", "Om0 = 5.33*(2*np.pi/N) # frequency of exponential signal\n", "\n", "\n", "# DFT of the exponential signal\n", "xN = np.exp(1j*Om0*np.arange(N))\n", "XN = np.fft.fft(xN)\n", "# DFT of the zero-padded exponential signal\n", "xM = np.concatenate((xN, np.zeros(M-N)))\n", "XM = np.fft.fft(xM)\n", "\n", "\n", "# plot spectra\n", "plt.figure(figsize = (10, 6))\n", "\n", "plt.subplot(121)\n", "plt.stem(np.arange(N),np.abs(XN))\n", "plt.title(r'DFT$_{%d}$ of $e^{j \\Omega_0 k}$ without zero-padding' %N)\n", "plt.xlabel(r'$\\mu$')\n", "plt.ylabel(r'$|X_N[\\mu]|$')\n", "plt.axis([0, N, 0, 18])\n", "plt.grid()\n", "\n", "plt.subplot(122)\n", "plt.stem(np.arange(M),np.abs(XM))\n", "plt.title(r'DFT$_{%d}$ of $e^{j \\Omega_0 k}$ with zero-padding' %M)\n", "plt.xlabel(r'$\\mu$')\n", "plt.ylabel(r'$|X_M[\\mu]|$')\n", "plt.axis([0, M, 0, 18])\n", "plt.grid()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Exercise**\n", "\n", "* Check the two spectra carefully for relations. Are there common coefficients for the case $M = 2 N$?\n", "* Increase the length `M` of the zero-padded signal $x_M[k]$. Can you gain additional information from the spectrum?\n", "\n", "Solution: Every second (because the DFT length has been doubled) coefficient has been added, the other coefficients stay the same. With longer zero-padding, the maximum of the main lobe of the window gets closer to its true maximum." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Interpolation of the Discrete Fourier Transformation" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Lets step back to the discrete-time Fourier transformation (DTFT) of the finite-length signal $x_N[k]$ without zero-padding\n", "\n", "\\begin{equation}\n", "X_N(\\mathrm{e}^{\\,\\mathrm{j}\\,\\Omega}) = \\sum_{k = -\\infty}^{\\infty} x_N[k] \\, \\mathrm{e}^{\\,-\\mathrm{j}\\,\\Omega\\,k} = \\sum_{k=0}^{N-1} x_N[k] \\,\\mathrm{e}^{-\\,\\mathrm{j}\\,\\Omega\\,k}\n", "\\end{equation}\n", "\n", "The discrete Fourier transformation (DFT) is derived by sampling $X_N(\\mathrm{e}^{\\mathrm{j}\\,\\Omega})$ at $\\Omega = \\mu \\frac{2 \\pi}{N}$\n", "\n", "\\begin{equation}\n", "X_N[\\mu] = X_N(\\mathrm{e}^{\\,\\mathrm{j}\\, \\Omega}) \\big\\vert_{\\Omega = \\mu \\frac{2 \\pi}{N}} = \\sum_{k=0}^{N-1} x_N[k] \\, \\mathrm{e}^{\\,-\\mathrm{j}\\, \\mu \\frac{2\\pi}{N}\\,k}\n", "\\end{equation}\n", "\n", "Since the DFT coefficients $X_N[\\mu]$ are sampled equidistantly from the DTFT $X_N(\\mathrm{e}^{\\,\\mathrm{j}\\, \\Omega})$, we can reconstruct the DTFT of $x_N[k]$ from the DFT coefficients by interpolation. Introduce the inverse DFT of $X_N[\\mu]$\n", "\n", "\\begin{equation}\n", "x_N[k] = \\frac{1}{N} \\sum_{\\mu = 0}^{N-1} X_N[\\mu] \\; \\mathrm{e}^{\\,\\mathrm{j}\\,\\frac{2 \\pi}{N} \\mu \\,k}\n", "\\end{equation}\n", "\n", "into the DTFT\n", "\n", "\\begin{equation}\n", "X_N(\\mathrm{e}^{\\,\\mathrm{j}\\,\\Omega}) = \\sum_{k=0}^{N-1} x_N[k] \\; \\mathrm{e}^{-\\,\\mathrm{j}\\, \\Omega\\, k} = \n", "\\sum_{\\mu=0}^{N-1} X_N[\\mu] \\cdot \\frac{1}{N} \\sum_{k=0}^{N-1} \\mathrm{e}^{-\\mathrm{j}\\, k \\,(\\Omega - \\frac{2 \\pi}{N} \\mu)}\n", "\\end{equation}\n", "\n", "reveals the relation between $X_N(\\mathrm{e}^{\\,\\mathrm{j}\\,\\Omega})$ and $X_N[\\mu]$. The last sum over $k$ constitutes a [geometric series](https://en.wikipedia.org/wiki/Geometric_series) and can be rearranged to\n", "\n", "\\begin{equation}\n", "X_N(\\mathrm{e}^{\\,\\mathrm{j}\\,\\Omega}) = \\sum_{\\mu=0}^{N-1} X_N[\\mu] \\cdot \\frac{1}{N} \\cdot \\frac{1-\\mathrm{e}^{-\\mathrm{j}(\\Omega-\\frac{2\\pi}{N}\\mu)N}}{1-\\mathrm{e}^{-\\mathrm{j}(\\Omega-\\frac{2\\pi}{N}\\mu)}}\n", "\\end{equation}\n", "\n", "By factorizing the last fraction to\n", "\n", "\\begin{equation}\n", "X_N(\\mathrm{e}^{\\,\\mathrm{j}\\,\\Omega}) = \\sum_{\\mu=0}^{N-1} X_N[\\mu] \\cdot \\frac{1}{N} \\cdot \\frac{\\mathrm{e}^{-\\mathrm{j}\\frac{(\\Omega-\\frac{2\\pi}{N}\\mu)N}{2}}}{\\mathrm{e}^{-\\mathrm{j}\\frac{\\Omega-\\frac{2\\pi}{N}\\mu}{2}}} \\cdot \\frac{\\mathrm{e}^{\\mathrm{j}\\frac{(\\Omega-\\frac{2\\pi}{N}\\mu)N}{2}}-\\mathrm{e}^{-\\mathrm{j}\\frac{(\\Omega-\\frac{2\\pi}{N}\\mu)N}{2}}}{\\mathrm{e}^{\\mathrm{j}\\frac{\\Omega-\\frac{2\\pi}{N}\\mu}{2}}-\\mathrm{e}^{-\\mathrm{j}\\frac{\\Omega-\\frac{2\\pi}{N}\\mu}{2}}}\n", "\\end{equation}\n", "\n", "and making use of [Euler's identity](https://en.wikipedia.org/wiki/Euler%27s_identity) $2\\mathrm{j}\\cdot\\sin(x)=\\mathrm{e}^{\\mathrm{j} x}-\\mathrm{e}^{-\\mathrm{j} x}$ this can be simplified to\n", "\n", "\\begin{equation}\n", "X_N(\\mathrm{e}^{\\,\\mathrm{j}\\,\\Omega}) = \\sum_{\\mu=0}^{N-1} X_N[\\mu] \\cdot \\mathrm{e}^{-\\mathrm{j}\\frac{(\\Omega-\\frac{2\\pi}{N}\\mu)(N-1)}{2}} \\cdot \\frac{1}{N} \\cdot \\frac{\\sin(N\\frac{\\Omega-\\frac{2\\pi}{N}\\mu}{2})}{\\sin(\\frac{\\Omega-\\frac{2\\pi}{N}\\mu}{2})}\n", "\\end{equation}\n", "\n", "The last fraction can be written in terms of the $N$-th order periodic sinc function (aliased sinc function, [Dirichlet kernel](https://en.wikipedia.org/wiki/Dirichlet_kernel)), which is defined as\n", "\n", "\\begin{equation}\n", "\\text{psinc}_N (\\Omega) = \\frac{1}{N} \\frac{\\sin(\\frac{N}{2} \\Omega)}{ \\sin(\\frac{1}{2} \\Omega)}\n", "\\end{equation}\n", "\n", "According to this definition, the periodic sinc function is not defined at $\\Omega = 2 \\pi \\,n$ for $n \\in \\mathbb{Z}$. This is resolved by applying [L'Hôpital's rule](https://en.wikipedia.org/wiki/L%27H%C3%B4pital%27s_rule) which results in $\\text{psinc}_N (2 \\pi \\,n) = 1$ for $n \\in \\mathbb{Z}$.\n", "\n", "Using the periodic sinc function, the DTFT $X_N(\\mathrm{e}^{\\,\\mathrm{j}\\, \\Omega})$ of a finite-length signal $x_N[k]$ can be derived from its DFT $X_N[\\mu]$ by\n", "\n", "\\begin{equation}\n", "X_N(\\mathrm{e}^{\\,\\mathrm{j}\\, \\Omega}) = \\sum_{\\mu=0}^{N-1} X_N[\\mu] \\cdot \\mathrm{e}^{-\\,\\mathrm{j}\\, \\frac{( \\Omega - \\frac{2 \\pi}{N} \\mu ) (N-1)}{2}} \\cdot \\text{psinc}_N ( \\Omega - \\frac{2 \\pi}{N} \\mu )\n", "\\end{equation}" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Example - Periodic sinc function\n", "\n", "This example illustrates the\n", "\n", "1. periodic sinc function, and\n", "2. interpolation of $X_N(\\mathrm{e}^{\\,\\mathrm{j}\\, \\Omega})$ from $X_N[\\mu]$ for an exponential signal using above relation." ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "N = 16 # order of periodic sinc function\n", "M = 1024 # number of frequency points\n", "Om = np.linspace(-np.pi, np.pi, M)\n", "\n", "# definition of periodic sinc function\n", "def psinc(x, N):\n", " x = np.asanyarray(x)\n", " y = np.where(x == 0, 1.0e-20, x)\n", " return 1/N * np.sin(N/2*y)/np.sin(1/2*y)\n", "\n", "# plot psinc\n", "plt.figure(figsize = (10, 8))\n", "plt.plot(Om, psinc(Om, 16))\n", "plt.xlabel(r'$\\Omega$')\n", "plt.ylabel(r'$\\mathrm{psinc}_N (\\Omega)$')\n", "plt.grid()" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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+eQ4b968GGOM1113XfzkJz+55bUrrrgifvjDH+732LVr18Z3vOMdcfPmzTlfX7lyZYwxxtdffz1+8YtfjNdee2287777Yowxbtq0KZ511llxw4YN8e1vf3vctGlTzjL1lavegDUxj3zT+6fouyBDCI3AucAtA4S7hZnHxcCdwLHFXk+SJNW3Cy64gLvvvpuuri7uvvtuOjo6uOGGfjvPuPHGGzn33HO3tHL159FHH+WYY46hs7OTI488EoDGxkZ23nlnGhsbOfXUU7nlln7jTEWUMg3Fu4DnYowLcr0YQtghhDAm+ztwGvB0CdeTJEl1bPvtt+f888/niiuu4LOf/Sy33347o0eP7nf/m2++mXPOOWfL83nz5nHOOedwzDHHcOyxx/LCCy8AbwawU089ldtuuw2AJUuWJC1RI0Ywffp0br755sq+uT7ymYbiZ0ALsEsIYQFwZYzxB8AHgZ/12Xci8P0Y45nA7sCdmTkzGoGfxhh/Wd7iS5Kkkl16KTz1VHnPOXUqfOMbBR920UUXcfDBB3PXXXex//7797vfxo0befnll2lubgaSpZUuvvhibrjhBvbff3/uuecerr32Wn7yk58wb948Jk+ezD333MNVV13FIYccwqWXXsqkSZNYsWIFhx12GI8++mix77Qo+dwFeX4/2y/MsW0RcGbm95eBI0ssnyRJGkauuuoqdt11VzZv3jzgfkuWLGHs2LFbns+YMYNnnnmG973vfQBs3ryZ448/nu9+97tbbjb49Kc/zac//WkAZs2atdX5Ro0aVdaliwbjWpCSJA13RbRUVcLXvvY11q9fz6233sqVV17Jueeeu+W1vffemx/84AecdtppnHfeedxwww1bLQs0a9YsvvrVr/Lxj398y7ZCAtWGDRtoamoq35sZhEsRSZKkqnvggQf44Q9/yE033URLSwsrV67kqUy36Pz58znjjDPo6OgAoKenh3HjxtHd3b0lhO25557ce++99PT0ADBnzpzsjAyDWrp0KbvssgsjR46swDvLzQAmSZKq6pVXXuHiiy/mtttu29Ji9bnPfY5vZFrmHn/8cVpaWli7di0vvvjilnFfp512Gg8++CCQjB3r6enh4IMPZurUqfz7v/973ms3/uY3v6G1tbX8b2wAdkFKkqSq2meffXj55Ze32nbhhRdy4YUXAkkA+9CHPkRPTw/XXnst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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "N = 16 # length of the signal\n", "M = 1024 # number of frequency points for DTFT\n", "Om0 = 5.33*(2*np.pi/N) # frequency of exponential signal\n", "\n", "\n", "# DFT of the exponential signal\n", "xN = np.exp(1j*Om0*np.arange(N))\n", "XN = np.fft.fft(xN)\n", "\n", "# interpolation of DTFT from DFT coefficients\n", "Xi = np.asarray(np.zeros(M), dtype=complex)\n", "for mu in np.arange(M):\n", " Omd = 2*np.pi/M*mu-2*np.pi*np.arange(N)/N\n", " interpolator = psinc(Omd, N) * np.exp(-1j*Omd*(N-1)/2)\n", " Xi[mu] = np.sum(XN * interpolator)\n", "\n", "# plot spectra\n", "plt.figure(figsize = (10, 8))\n", "ax1 = plt.gca()\n", "\n", "plt.plot(np.arange(M)*2*np.pi/M, abs(Xi), 'r', label=r'$|X_N(e^{j \\Omega})|$')\n", "plt.stem(np.arange(N)*2*np.pi/N, abs(XN), basefmt = ' ', label=r'$|X_N[\\mu]|$')\n", "plt.title(r'DFT $X_N[\\mu]$ and interpolated DTFT $X_N(e^{j \\Omega})$', y=1.08)\n", "plt.ylim([-0.5, N+2]);\n", "plt.legend()\n", "\n", "ax1.set_xlabel(r'$\\Omega$')\n", "ax1.set_xlim([0, 2*np.pi])\n", "ax1.grid()\n", "\n", "ax2 = ax1.twiny()\n", "ax2.set_xlim([0, N])\n", "ax2.set_xlabel(r'$\\mu$', color='C0')\n", "ax2.tick_params('x', colors='C0')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Relation between Discrete Fourier Transformations with and without Zero-Padding\n", "\n", "It was already outlined above that the DFT is related to the DTFT by sampling. Hence, the DFT $X_M[\\mu]$ is given by sampling the DTFT $X_M(\\mathrm{e}^{\\mathrm{j}\\, \\Omega})$ at $\\Omega = \\frac{2 \\pi}{M} \\mu$. Since the zero-padded signal $x_M[k]$ differs from $x_N[k]$ only with respect to the additional zeros, the DTFTs of both are equal\n", "\n", "\\begin{equation}\n", "X_M(\\mathrm{e}^{\\mathrm{j}\\, \\Omega}) = X_N(\\mathrm{e}^{\\mathrm{j}\\, \\Omega})\n", "\\end{equation}\n", "\n", "The desired relation between the DFTs $X_N[\\mu]$ and $X_M[\\mu]$ of the signal $x_N[k]$ and its zero-padded version $x_M[k]$ can be found by sampling the interpolated DTFT $X_N(\\mathrm{e}^{\\mathrm{j}\\, \\Omega})$ at $\\Omega = \\frac{2 \\pi}{M} \\mu$\n", "\n", "\\begin{equation}\n", "X_M[\\mu] = \\sum_{\\eta=0}^{N-1} X_N[\\eta] \\cdot \\mathrm{e}^{\\,-\\mathrm{j}\\, \\frac{( \\frac{2 \\pi}{M} \\mu - \\frac{2 \\pi}{N} \\eta ) (N-1)}{2}} \\cdot \\text{psinc}_N \\left( \\frac{2 \\pi}{M} \\mu - \\frac{2 \\pi}{N} \\eta \\right)\n", "\\end{equation}\n", "\n", "for $\\mu = 0, 1, \\dots, M-1$.\n", "\n", "Above equation relates the spectrum $X_N[\\mu]$ of the original signal $x_N[k]$ to the spectrum $X_M[\\mu]$ of the zero-padded signal $x_M[k]$. It essentially constitutes a bandlimited interpolation of the coefficients $X_N[\\mu]$.\n", "\n", "All spectral information of a signal of finite length $N$ is already contained in its spectrum derived from a DFT of length $N$. By applying zero-padding and a longer DFT, the frequency resolution is only virtually increased. The additional coefficients are related to the original ones by bandlimited interpolation. In general, zero-padding does not bring additional insights in spectral analysis. It may bring a benefit in special applications, for instance when estimating the frequency of an isolated harmonic signal from its spectrum. This is illustrated in the following example. \n", "\n", "Zero-padding is also used to make a circular convolution equivalent to a linear convolution. However, there is a different reasoning behind this. Details are discussed in a [later section](../nonrecursive_filters/fast_convolution.ipynb#Linear-Convolution-by-Periodic-Convolution)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Example - Interpolation of the DFT" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The following example shows that the coefficients $X_M[\\mu]$ of the spectrum of the zero-padded signal $x_M[k]$ can be derived by interpolation from the spectrum $X_N[\\mu]$." ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "N = 16 # length of the signal\n", "M = 32 # number of points for interpolated DFT\n", "Om0 = 5.33*(2*np.pi/N) # frequency of exponential signal\n", "\n", "\n", "# periodic sinc function\n", "def psinc(x, N):\n", " x = np.asanyarray(x)\n", " y = np.where(x == 0, 1.0e-20, x)\n", " return 1/N * np.sin(N/2*y)/np.sin(1/2*y)\n", "\n", "# DFT of the exponential signal\n", "xN = np.exp(1j*Om0*np.arange(N))\n", "XN = np.fft.fft(xN)\n", "\n", "# interpolation of DFT coefficients\n", "XM = np.asarray(np.zeros(M), dtype=complex)\n", "for mu in np.arange(M):\n", " Omd = 2*np.pi/M*mu-2*np.pi*np.arange(N)/N\n", " interpolator = psinc(Omd, N) * np.exp(-1j*Omd*(N-1)/2)\n", " XM[mu] = np.sum(XN * interpolator)\n", "\n", "# plot spectra\n", "plt.figure(figsize = (10, 6))\n", "\n", "plt.subplot(121)\n", "plt.stem(np.arange(N),np.abs(XN))\n", "plt.title(r'DFT of $e^{j \\Omega_0 k}$ without zero-padding')\n", "plt.xlabel(r'$\\mu$')\n", "plt.ylabel(r'$|X_N[\\mu]|$')\n", "plt.axis([0, N, 0, 18])\n", "plt.grid()\n", "\n", "plt.subplot(122)\n", "plt.stem(np.arange(M),np.abs(XM))\n", "plt.title(r'Interpolated spectrum')\n", "plt.xlabel(r'$\\mu$')\n", "plt.ylabel(r'$|X_M[\\mu]|$')\n", "plt.axis([0, M, 0, 18])\n", "plt.grid()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Exercise**\n", "\n", "* Compare the interpolated spectrum to the spectrum with zero padding from the first example.\n", "* Estimate the frequency $\\Omega_0$ of the exponential signal from the interpolated spectrum. How could you further increase the accuracy of your estimate?\n", "\n", "Solution: The interpolated spectrum is the same as the spectrum with zero padding from the first example. The estimated frequency from the interpolated spectrum is $\\Omega_0=\\frac{2\\pi}{M}\\mu=\\frac{2\\pi}{32}\\cdot11$. A better estimate can be obtained by increasing the number of points for the interpolated DFT or by further zero-padding of the time domain signal." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Example - Estimation of Frequency and Amplitude of a Harmonic Signal\n", "\n", "The estimation of the normalized frequency $\\Omega_0$ and amplitude $A$ of a single exponential signal $x_N[k] = A \\cdot e^{j \\Omega_0 k}$ by the DFT of the zero-padded signal (or interpolated DFT) is illustrated in the following example. The frequency is estimated from the DFT of the zero-padded signal by finding the maximum in the magnitude spectrum\n", "\n", "\\begin{equation}\n", "\\hat{\\mu_0} = \\underset{\\mu}{\\mathrm{argmax}} \\{ |X_M[\\mu]| \\}\n", "\\end{equation}\n", "\n", "The amplitude is estimated by taking the magnitude at the maximum $\\hat{A} = | X_M[\\hat{\\mu}_0] |$. \n", "\n", "First a function is defined which estimates the frequency for a given number of zeros appended to the signal before calculating the DFT. Without loss of generality is is assumed that $A=1$." ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": true }, "outputs": [], "source": [ "N = 128 # length of the signal\n", "Om0 = 5.33*(2*np.pi/N) # frequency of exponential signal\n", "\n", "# generate harmonic signal\n", "k = np.arange(N)\n", "x = np.exp(1j*Om0*np.arange(N))\n", "\n", "\n", "def estimate_frequency_amplitude(x, P):\n", " # perform zero-padding and DFT\n", " xM = np.concatenate((x, np.zeros(P)))\n", " XM = np.fft.fft(xM)\n", "\n", " # estimate frequency/amplitude of harmonic signal\n", " mu_max = np.argmax(abs(XM))\n", " amplitude = 1/N * abs(XM[mu_max])\n", "\n", " # print results\n", " Om = np.fft.fftfreq(N+P, 1/(2*np.pi))\n", " print('Normalized frequency of signal: {0:1.4f} (real) / {1:1.4f} (estimated) / {2:1.4f} (absolute error)'.format(Om0, Om[mu_max], abs(Om0 - Om[mu_max])))\n", " print('Amplitude of signal: {0:1.4f} (real) / {1:1.4f} (estimated) / {2:2.2f} dB (magnitude error)'.format(1, amplitude, 20*np.log10(abs(1/amplitude))))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "First the estimation is performed without zero-padding" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Normalized frequency of signal: 0.2616 (real) / 0.2454 (estimated) / 0.0162 (absolute error)\n", "Amplitude of signal: 1.0000 (real) / 0.8303 (estimated) / 1.62 dB (magnitude error)\n" ] } ], "source": [ "estimate_frequency_amplitude(x, 0)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Then the signal is zero-padded to a total length of eight times its original length" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Normalized frequency of signal: 0.2616 (real) / 0.2638 (estimated) / 0.0022 (absolute error)\n", "Amplitude of signal: 1.0000 (real) / 0.9967 (estimated) / 0.03 dB (magnitude error)\n" ] } ], "source": [ "estimate_frequency_amplitude(x, 7*N)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Exercise**\n", "\n", "* What is the maximum error that can occur when estimating the frequency from the maximum of the (zero-padded) magnitude spectrum?\n", "\n", "Solution: The maximum absolute error occurs if the maximum in the DTFT of the signal is in between two adjacent bins $\\mu$ of the DFT. Since the DTFT is sampled at $\\Omega = \\frac{2 \\pi}{M}$ to derive the DFT, the maximum absolute error is given by $\\frac{\\pi}{M}$ where $M$ denotes the length of the zero-padded signal/DFT." ] }, { "cell_type": "markdown", "metadata": { "nbsphinx": "hidden" }, "source": [ "**Copyright**\n", "\n", "This notebook is provided as [Open Educational Resource](https://en.wikipedia.org/wiki/Open_educational_resources). Feel free to use the notebook for your own purposes. The text is licensed under [Creative Commons Attribution 4.0](https://creativecommons.org/licenses/by/4.0/), the code of the IPython examples under the [MIT license](https://opensource.org/licenses/MIT). Please attribute the work as follows: *Sascha Spors, Digital Signal Processing - Lecture notes featuring computational examples, 2016-2018*." ] } ], "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.5.2" } }, "nbformat": 4, "nbformat_minor": 1 }