{ "cells": [ { "cell_type": "markdown", "metadata": { "nbsphinx": "hidden" }, "source": [ "# Design of Digital Filters\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": [ "## Design of Recursive Filters by the Bilinear Transform\n", "\n", "The design of analog systems with certain desired properties is a topic with a long lasting history. It is often oft interest to realize these designs by digital systems which (approximately) preserve these properties. Consequently, various techniques have been developed to derive digital realizations of analog systems. For instance the [impulse invariance](https://en.wikipedia.org/wiki/Impulse_invariance) method, the [matched Z-transform](https://en.wikipedia.org/wiki/Matched_Z-transform_method) and the [bilinear transform](https://en.wikipedia.org/wiki/Bilinear_transform). The following section introduces the bilinear transform and its application to the digital realization of analog systems and recursive filter design." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### The Bilinear Transform\n", "\n", "The basic idea of the bilinear transform is to map a given transfer function $H(s) = \\mathcal{L}\\{ h(t) \\}$ of a continuous system to the transfer function $H(z) = \\mathcal{Z}\\{ h[k] \\}$ of its discrete counterpart. The transform is designed such to preserve certain properties of the continuous in the digital domain. In particular\n", "\n", "* a [rational function](https://en.wikipedia.org/wiki/Rational_function) $H(s)$ in $s$ should be mapped into a rational function $H(z)$ in $z^{-1}$ of the same order, and\n", "* poles and zeros should be mapped from the left $s$-half plane into the unit circle in the $z$-plane.\n", "\n", "The first condition ensures that the digital representation can be realized by a difference equation, the second that important system properties (e.g. causality and stability) are preserved. Introducing ideal sampling into the definition of the Laplace transform and comparing the result to the definition of the $z$-transform reveals the link between the complex frequencies $s$ and $z$ of the Laplace and $z$-transformation, respectively. It is given as\n", "\n", "\\begin{equation}\n", "z = \\mathrm{e}^{\\,s T}\n", "\\end{equation}\n", "\n", "where $T$ denotes the sampling interval.\n", "\n", "For sampled signals the resulting mapping from the $s$-plane into the $z$-plane is shown in the following illustration:\n", "\n", "![Mapping of s-plane onto z-plane for sampled signals](sz_mapping.png)\n", "\n", "The shading indicates how the different areas are mapped. The imaginary axis $s = \\mathrm{j}\\,\\omega$ is mapped onto the unit circle $z = \\mathrm{e}^{\\,\\mathrm{j}\\,\\Omega}$, representing the frequency response of the continuous and discrete system. The left half-plane of the $s$-plane is mapped into the unit circle of the $z$-plane.\n", "\n", "For the desired mapping of $H(s)$ to $H(z)$ we need the inverse of above equation. It is given as\n", "\n", "\\begin{equation}\n", "s = \\frac{1}{T} \\cdot \\ln (z)\n", "\\end{equation}\n", "\n", "However, when introduced into a rational transfer function $H(s)$ this non-linear mapping would not result in the desired rational transfer function $H(z)$. In order to achieve the desired mapping, $\\ln(z)$ is expanded into the power series\n", "\n", "\\begin{equation}\n", "\\ln(z) = 2 \\left( \\frac{z-1}{z+1} + \\frac{(z-1)^3}{3(z+1)^3} + \\frac{(z-1)^5}{5(z+1)^5} + \\dots \\right)\n", "\\end{equation}\n", "\n", "Using only the linear term as approximation of $\\ln(z)$ yields the bilinear transform\n", "\n", "\\begin{equation}\n", "s = \\frac{2}{T} \\cdot \\frac{z - 1}{z + 1}\n", "\\end{equation}\n", "\n", "and its inverse\n", "\n", "\\begin{equation}\n", "z = \\frac{2 + s T}{2 - s T}\n", "\\end{equation}\n", "\n", "It worthwhile noting that this mapping rule is a special case of a [conformal map](https://en.wikipedia.org/wiki/Conformal_map).\n", "\n", "Let's consider the mapping of the frequency response $H(\\mathrm{j}\\,\\omega) = H(s) \\big\\vert_{s = \\mathrm{j}\\,\\omega}$ of a continuous system to the frequency response $H_d(\\mathrm{e}^{\\,\\mathrm{j}\\,\\omega T}) = H_d(z)\\big\\vert_{z = \\mathrm{e}^{\\,\\mathrm{j}\\,\\Omega}}$ of a discrete system. Introducing the bilinear transform into the continuous system to yield its discrete counterpart results in\n", "\n", "\\begin{equation}\n", "H_d(\\mathrm{e}^{\\,\\mathrm{j}\\,\\Omega}) = H \\left( \\frac{2}{T} \\cdot \\frac{z - 1}{z + 1} \\right) \\Bigg\\vert_{z = \\mathrm{e}^{\\,\\mathrm{j}\\,\\Omega}} = H \\Big( \\mathrm{j} \\; \\underbrace{\\frac{2}{T} \\cdot \\tan(\\frac{\\Omega}{2})}_{\\omega} \\Big)\n", "\\end{equation}\n", "\n", "The imaginary axis $s=\\mathrm{j}\\,\\omega$ of the $s$-plane is mapped onto the unit circle $\\mathrm{e}^{\\,\\mathrm{j}\\,\\Omega}$ of the $z$-plane. Note, that for sampled signals the mapping between the continuous frequency axis $\\omega$ and the frequency axis $\\Omega$ of the discrete system is $\\Omega = \\omega T$. However, for the bilinear transform the mapping is non-linear\n", "\n", "\\begin{align}\n", "\\omega &= \\frac{2}{T} \\cdot \\tan(\\frac{\\Omega}{2}) \\\\\n", "\\Omega &= 2 \\arctan(\\frac{\\omega T}{2})\n", "\\end{align}\n", "\n", "In the following, this is illustrated for $T=1$" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "data": { "application/pdf": "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NjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAKNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCAzMTggNDAxIDQ2MCA4MzggNjM2Cjk1MCA3ODAgMjc1IDM5MCAzOTAgNTAwIDgzOCAzMTggMzYxIDMxOCAzMzcgNjM2IDYzNiA2MzYgNjM2IDYzNiA2MzYgNjM2IDYzNgo2MzYgNjM2IDMzNyAzMzcgODM4IDgzOCA4MzggNTMxIDEwMDAgNjg0IDY4NiA2OTggNzcwIDYzMiA1NzUgNzc1IDc1MiAyOTUKMjk1IDY1NiA1NTcgODYzIDc0OCA3ODcgNjAzIDc4NyA2OTUgNjM1IDYxMSA3MzIgNjg0IDk4OSA2ODUgNjExIDY4NSAzOTAgMzM3CjM5MCA4MzggNTAwIDUwMCA2MTMgNjM1IDU1MCA2MzUgNjE1IDM1MiA2MzUgNjM0IDI3OCAyNzggNTc5IDI3OCA5NzQgNjM0IDYxMgo2MzUgNjM1IDQxMSA1MjEgMzkyIDYzNCA1OTIgODE4IDU5MiA1OTIgNTI1IDYzNiAzMzcgNjM2IDgzOCA2MDAgNjM2IDYwMCAzMTgKMzUyIDUxOCAxMDAwIDUwMCA1MDAgNTAwIDEzNTAgNjM1IDQwMCAxMDcwIDYwMCA2ODUgNjAwIDYwMCAzMTggMzE4IDUxOCA1MTgKNTkwIDUwMCAxMDAwIDUwMCAxMDAwIDUyMSA0MDAgMTAyOCA2MDAgNTI1IDYxMSAzMTggNDAxIDYzNiA2MzYgNjM2IDYzNiAzMzcKNTAwIDUwMCAxMDAwIDQ3MSA2MTcgODM4IDM2MSAxMDAwIDUwMCA1MDAgODM4IDQwMSA0MDEgNTAwIDYzNiA2MzYgMzE4IDUwMAo0MDEgNDcxIDYxNyA5NjkgOTY5IDk2OSA1MzEgNjg0IDY4NCA2ODQgNjg0IDY4NCA2ODQgOTc0IDY5OCA2MzIgNjMyIDYzMiA2MzIKMjk1IDI5NSAyOTUgMjk1IDc3NSA3NDggNzg3IDc4NyA3ODcgNzg3IDc4NyA4MzggNzg3IDczMiA3MzIgNzMyIDczMiA2MTEgNjA4CjYzMCA2MTMgNjEzIDYxMyA2MTMgNjEzIDYxMyA5OTUgNTUw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aW9kIDQ4IC96ZXJvIC9vbmUgL3R3byAvdGhyZWUgNTMgL2ZpdmUKNTUgL3NldmVuIDk3IC9hIDk5IC9jIDExMCAvbiAxMTQgL3IgMTE2IC90IF0KL1R5cGUgL0VuY29kaW5nID4+Ci9GaXJzdENoYXIgMCAvRm9udEJCb3ggWyAtMTAyMSAtNDYzIDE3OTQgMTIzMyBdIC9Gb250RGVzY3JpcHRvciAxOSAwIFIKL0ZvbnRNYXRyaXggWyAwLjAwMSAwIDAgMC4wMDEgMCAwIF0gL0xhc3RDaGFyIDI1NSAvTmFtZSAvRGVqYVZ1U2FucwovU3VidHlwZSAvVHlwZTMgL1R5cGUgL0ZvbnQgL1dpZHRocyAxOCAwIFIgPj4KZW5kb2JqCjE5IDAgb2JqCjw8IC9Bc2NlbnQgOTI5IC9DYXBIZWlnaHQgMCAvRGVzY2VudCAtMjM2IC9GbGFncyAzMgovRm9udEJCb3ggWyAtMTAyMSAtNDYzIDE3OTQgMTIzMyBdIC9Gb250TmFtZSAvRGVqYVZ1U2FucyAvSXRhbGljQW5nbGUgMAovTWF4V2lkdGggMTM0MiAvU3RlbVYgMCAvVHlwZSAvRm9udERlc2NyaXB0b3IgL1hIZWlnaHQgMCA+PgplbmRvYmoKMTggMCBvYmoKWyA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMAo2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDMxOCA0MDEgNDYwIDgzOCA2MzYKOTUwIDc4MCAyNzUgMzkwIDM5MCA1MDAgODM4IDMxOCAzNjEgMzE4IDMzNyA2MzYgNjM2IDYzNiA2MzYgNjM2IDYzNiA2MzYgNjM2CjYzNiA2MzYgMzM3IDMzNyA4MzggODM4IDgzOCA1MzEgMTAwMCA2ODQgNjg2IDY5OCA3NzAgNjMyIDU3NSA3NzUgNzUyIDI5NQoyOTUgNjU2IDU1NyA4NjMgNzQ4IDc4NyA2MDMgNzg3IDY5NSA2MzUgNjExIDczMiA2ODQgOTg5IDY4NSA2MTEgNjg1IDM5MCAzMzcKMzkwIDgzOCA1MDAgNTAwIDYxMyA2MzUgNTUwIDYzNSA2MTUgMzUyIDYzNSA2MzQgMjc4IDI3OCA1NzkgMjc4IDk3NCA2MzQgNjEyCjYzNSA2MzUgNDExIDUyMSAzOTIgNjM0IDU5MiA4MTggNTkyIDU5MiA1MjUgNjM2IDMzNyA2MzYgODM4IDYwMCA2MzYgNjAwIDMxOAozNTIgNTE4IDEwMDAgNTAwIDUwMCA1MDAgMTM0MiA2MzUgNDAwIDEwNzAgNjAwIDY4NSA2MDAgNjAwIDMxOCAzMTggNTE4IDUxOAo1OTAgNTAwIDEwMDAgNTAwIDEwMDAgNTIxIDQwMCAxMDIzIDYwMCA1MjUgNjExIDMxOCA0MDEgNjM2IDYzNiA2MzYgNjM2IDMzNwo1MDAgNTAwIDEwMDAgNDcxIDYxMiA4MzggMzYxIDEwMDAgNTAwIDUwMCA4MzggNDAxIDQwMSA1MDAgNjM2IDYzNiAzMTggNTAwCjQwMSA0NzEgNjEyIDk2OSA5NjkgOTY5IDUzMSA2ODQgNjg0IDY4NCA2ODQgNjg0IDY4NCA5NzQgNjk4IDYzMiA2MzIgNjMyIDYzMgoyOTUgMjk1IDI5NSAyOTUgNzc1IDc0OCA3ODcgNzg3IDc4NyA3ODcgNzg3IDgzOCA3ODcgNzMyIDczMiA3MzIgNzMyIDYxMSA2MDUKNjMwIDYxMyA2MTMgNjEzIDYxMyA2MTMgNjEzIDk4MiA1NTAgNjE1IDYxNSA2MTUgNjE1IDI3OCAyNzggMjc4IDI3OCA2MTIgNjM0CjYxMiA2MTIgNjEyIDYxMiA2MTIgODM4IDYxMiA2MzQgNjM0IDYzNCA2MzQgNTkyIDYzNSA1OTIgXQplbmRvYmoKMjEgMCBvYmoKPDwgL2EgMjMgMCBSIC9jIDI0IDAgUiAvZml2ZSAyNiAwIFIgL24gMjggMCBSIC9vbmUgMjkgMCBSCi9wYXJlbmxlZnQgMzAgMCBSIC9wYXJlbnJpZ2h0IDMxIDAgUiAvcGVyaW9kIDMyIDAgUiAvciAzMyAwIFIgL3NldmVuIDM0IDAgUgovdCAzNSAwIFIgL3RocmVlIDM2IDAgUiAvdHdvIDM3IDAgUiAvemVybyAzOCAwIFIgPj4KZW5kb2JqCjMgMCBvYmoKPDwgL0YxIDIwIDAgUiAvRjIgMTQgMCBSID4+CmVuZG9iago0IDAgb2JqCjw8IC9BMSA8PCAvQ0EgMCAvVHlwZSAvRXh0R1N0YXRlIC9jYSAxID4+Ci9BMiA8PCAvQ0EgMSAvVHlwZSAvRXh0R1N0YXRlIC9jYSAxID4+Ci9BMyA8PCAvQ0EgMC44IC9UeXBlIC9FeHRHU3RhdGUgL2NhIDAuOCA+PiA+PgplbmRvYmoKNSAwIG9iago8PCA+PgplbmRvYmoKNiAwIG9iago8PCA+PgplbmRvYmoKNyAwIG9iago8PCAvRGVqYVZ1U2Fucy1PYmxpcXVlLW9tZWdhIDE3IDAgUiAvRGVqYVZ1U2Fucy1PbWVnYSAyMiAwIFIKL0RlamFWdVNhbnMtZG90bWF0aCAyNSAwIFIgL0RlamFWdVNhbnMtbWludXMgMjcgMCBSID4+CmVuZG9iagoyIDAgb2JqCjw8IC9Db3VudCAxIC9LaWRzIFsgMTAgMCBSIF0gL1R5cGUgL1BhZ2VzID4+CmVuZG9iagozOSAwIG9iago8PCAvQ3JlYXRpb25EYXRlIChEOjIwMjAwMTIxMDk1NjExKzAyJzAwJykKL0NyZWF0b3IgKG1hdHBsb3RsaWIgMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZykKL1Byb2R1Y2VyIChtYXRwbG90bGliIHBkZiBiYWNrZW5kIDMuMS4xKSA+PgplbmRvYmoKeHJlZgowIDQwCjAwMDAwMDAwMDAgNjU1MzUgZiAKMDAwMDAwMDAxNiAwMDAwMCBuIAowMDAwMDExMTA4IDAwMDAwIG4gCjAwMDAwMTA3NTAgMDAwMDAgbiAKMDAwMDAxMDc5MyAwMDAwMCBuIAowMDAwMDEwOTM1IDAwMDAwIG4gCjAwMDAwMTA5NTYgMDAwMDAgbiAKMDAwMDAxMDk3NyAwMDAwMCBuIAowMDAwMDAwMDY1IDAwMDAwIG4gCjAwMDAwMDAzOTkgMDAwMDAgbiAKMDAwMDAwMDIwOCAwMDAwMCBuIAowMDAwMDAyNTUwIDAwMDAwIG4gCjAwMDAwMDM1NTMgMDAwMDAgbiAKMDAwMDAwMzM0NSAwMDAwMCBuIAowMDAwMDAzMDMwIDAwMDAwIG4gCjAwMDAwMDQ2MDYgMDAwMDAgbiAKMDAwMDAwMjU3MSAwMDAwMCBuIAowMDAwMDAyNzE1IDAwMDAwIG4gCjAwMDAwMDk0OTUgMDAwMDAgbiAKMDAwMDAwOTI5NSAwMDAwMCBuIAowMDAwMDA4ODg3IDAwMDAwIG4gCjAwMDAwMTA1NDggMDAwMDAgbiAKMDAwMDAwNDYzOCAwMDAwMCBuIAowMDAwMDA1MDA5IDAwMDAwIG4gCjAwMDAwMDUzODYgMDAwMDAgbiAKMDAwMDAwNTY4OSAwMDAwMCBuIAowMDAwMDA1ODU5IDAwMDAwIG4gCjAwMDAwMDYxNzkgMDAwMDAgbiAKMDAwMDAwNjM0OSAwMDAwMCBuIAowMDAwMDA2NTgzIDAwMDAwIG4gCjAwMDAwMDY3MzUgMDAwMDAgbiAKMDAwMDAwNjk1NSAwMDAwMCBuIAowMDAwMDA3MTc3IDAwMDAwIG4gCjAwMDAwMDcyOTggMDAwMDAgbiAKMDAwMDAwNzUyOCAwMDAwMCBuIAowMDAwMDA3NjY4IDAwMDAwIG4gCjAwMDAwMDc4NzIgMDAwMDAgbiAKMDAwMDAwODI4MyAwMDAwMCBuIAowMDAwMDA4NjA0IDAwMDAwIG4gCjAwMDAwMTExNjggMDAwMDAgbiAKdHJhaWxlcgo8PCAvSW5mbyAzOSAwIFIgL1Jvb3QgMSAwIFIgL1NpemUgNDAgPj4Kc3RhcnR4cmVmCjExMzIyCiUlRU9GCg==\n", "image/svg+xml": [ "\n", "\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "\n" ], "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import numpy as np\n", "import matplotlib.pyplot as plt\n", "\n", "%matplotlib inline\n", "\n", "om = np.linspace(-10, 10, 200)\n", "Om = 2 * np.arctan(om * 1 / 2)\n", "\n", "plt.figure(figsize=(10, 4))\n", "plt.plot(om, Om, label=r\"$2 \\cdot \\arctan(\\frac{\\omega T}{2})$\")\n", "plt.plot(om, om, \"k--\", label=r\"$\\omega T$\")\n", "plt.xlabel(r\"$\\omega$\")\n", "plt.ylabel(r\"$\\Omega$\")\n", "plt.axis([-10, 10, -np.pi, np.pi])\n", "plt.legend(loc=2)\n", "plt.grid()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "It is evident that the frequency axis deviates from the linear mapping $\\Omega = \\omega T$, especially for high frequencies. The frequency response of the digital filter $H_d(\\mathrm{e}^{\\,\\mathrm{j}\\,\\Omega})$ therefore deviates from the desired continuous frequency response $H(\\mathrm{j}\\,\\omega)$. This is due to the first-order approximation of the mapping from the $s$-plane to the $z$-plane. The effect is known as *frequency warping*. It can be considered explicitly in the filter design stage, as shown in the examples.\n", "\n", "Besides this drawback, the bilinear transform has a number of benefits: \n", "\n", "* Stability and minimum-phase of the continuous filter is preserved. This is due to mapping of the left half-space of the $s$-plane into the unit-circle of the $z$-plane.\n", "* The order of the continuous filter is preserved. This is due to the linear mapping rule.\n", "* No aliasing distortion as for instance observed for the [impulse invariance method](https://en.wikipedia.org/wiki/Impulse_invariance).\n", "\n", "The application of the bilinear transform to the design of digital filters is discussed in the following." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Design of Digital Filter\n", "\n", "We aim at designing a digital filter $H_d(z)$ that approximates a given continuous prototype $H(s)$ using the bilinear transform. For instance, the transfer function $H(s)$ may result from the analysis of an analog circuit or filter design technique. The transfer function $H_d(z)$ of the digital filter is then given by\n", "\n", "\\begin{equation}\n", "H_d(z) = H(s) \\Big\\vert_{s = \\frac{2}{T} \\cdot \\frac{z - 1}{z + 1}}\n", "\\end{equation}\n", "\n", "The coefficients of the digital filter are derived by representing the numerator and denominator of $H_d(z)$ as polynomials with respect to $z^{-1}$. For instance, for a continuous system of second order (second order section) \n", "\n", "\\begin{equation}\n", "H(s) = \\frac{\\beta_0 + \\beta_1 s + \\beta_2 s^2}{\\alpha_0 + \\alpha_1 s + \\alpha_2 s^2}\n", "\\end{equation}\n", "\n", "the bilinear transform results in\n", "\n", "\\begin{equation}\n", "H_d(z) = \\frac{(\\beta_2 K^2 - \\beta_1 K + \\beta_0) \\, z^{-2} + (2 \\beta_0 - 2 \\beta_2 K^2) \\, z^{-1} + (\\beta_2 K^2 + \\beta_1 K + \\beta_0)}\n", "{(\\alpha_2 K^2 - \\alpha_1 K + \\alpha_0) \\, z^{-2} + (2 \\alpha_0 - 2 \\alpha_2 K^2) \\, z^{-1} + (\\alpha_2 K^2 + \\alpha_1 K + \\alpha_0)}\n", "\\end{equation}\n", "where $K = \\frac{2}{T}$.\n", "\n", "As outlined in the previous section, the frequency response of the digital filter $H_d(\\mathrm{e}^{\\,\\mathrm{j}\\,\\Omega})$ will differ for high frequencies from the desired analog frequency response $H(\\mathrm{j}\\,\\omega)$. For the design of a digital filter from an analog prototype, this can be coped for by replacing corner frequencies with\n", "\n", "\\begin{equation}\n", "\\omega_\\text{cw} = \\frac{2}{T} \\cdot \\tan \\left(\\frac{\\omega_\\text{c} T}{2} \\right)\n", "\\end{equation}\n", "\n", "where $\\omega_\\text{cw}$ denotes a *warped* corner frequency $\\omega_\\text{c}$. This techniques is known as *pre-warping*." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Examples\n", "\n", "The following two examples illustrate the digital realization of an analog system and the design of a recursive filter, respectively." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Digital realization of an analog system\n", "\n", "A second-order lowpass filter can be realized by the following passive circuit\n", "\n", "![Analog second-order lowpass](RLC_lowpass.png)\n", "\n", "where $x(t)$ denotes the input and $y(t)$ the output signal (voltage). Analysis of the circuit reveals its transfer function as\n", "\n", "\\begin{equation}\n", "H(s) = \\frac{Y(s)}{X(s)} = \\frac{1}{LC \\, s^2 + RC \\, s + 1}\n", "\\end{equation}\n", "\n", "Introducing this into the bilinear transform of a second order section (SOS) given in the previous section yields\n", "\n", "\\begin{equation}\n", "H_d(z) = \\frac{T^2 \\, z^{-2} + 2 T^2 \\, z^{-1} + T^2}{(4 LC - 2 TRC + T^2) \\, z^{-2} + (-8 LC + 2 T^2) \\, z^{-1} + (4 LC - 2 TRC + T^2)}\n", "\\end{equation}\n", "\n", "In the following, the frequency response of the analog filter and its digital realization is compared numerically." ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "application/pdf": "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tdRSpFSLOlFlsNUPczb/7vEa3z/mNz8eCmVuZHN0cmVhbQplbmRvYmoKMTQgMCBvYmoKPDwgL0Jhc2VGb250IC9EZWphVnVTYW5zLU9ibGlxdWUgL0NoYXJQcm9jcyAxNSAwIFIKL0VuY29kaW5nIDw8IC9EaWZmZXJlbmNlcyBbIDcyIC9IIDEwMCAvZCAvZSAvZiAxMDYgL2ogXSAvVHlwZSAvRW5jb2RpbmcgPj4KL0ZpcnN0Q2hhciAwIC9Gb250QkJveCBbIC0xMDE2IC0zNTEgMTY2MCAxMDY4IF0gL0ZvbnREZXNjcmlwdG9yIDEzIDAgUgovRm9udE1hdHJpeCBbIDAuMDAxIDAgMCAwLjAwMSAwIDAgXSAvTGFzdENoYXIgMjU1IC9OYW1lIC9EZWphVnVTYW5zLU9ibGlxdWUKL1N1YnR5cGUgL1R5cGUzIC9UeXBlIC9Gb250IC9XaWR0aHMgMTIgMCBSID4+CmVuZG9iagoxMyAwIG9iago8PCAvQXNjZW50IDkyOSAvQ2FwSGVpZ2h0IDAgL0Rlc2NlbnQgLTIzNiAvRmxhZ3MgOTYKL0ZvbnRCQm94IFsgLTEwMTYgLTM1MSAxNjYwIDEwNjggXSAvRm9udE5hbWUgL0RlamFWdVNhbnMtT2JsaXF1ZQovSXRhbGljQW5nbGUgMCAvTWF4V2lkdGggMTM1MCAvU3RlbVYgMCAvVHlwZSAvRm9udERlc2NyaXB0b3IgL1hIZWlnaHQgMCA+PgplbmRvYmoKMTIgMCBvYmoKWyA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMAo2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDMxOCA0MDEgNDYwIDgzOCA2MzYKOTUwIDc4MCAyNzUgMzkwIDM5MCA1MDAgODM4IDMxOCAzNjEgMzE4IDMzNyA2MzYgNjM2IDYzNiA2MzYgNjM2IDYzNiA2MzYgNjM2CjYzNiA2MzYgMzM3IDMzNyA4MzggODM4IDgzOCA1MzEgMTAwMCA2ODQgNjg2IDY5OCA3NzAgNjMyIDU3NSA3NzUgNzUyIDI5NQoyOTUgNjU2IDU1NyA4NjMgNzQ4IDc4NyA2MDMgNzg3IDY5NSA2MzUgNjExIDczMiA2ODQgOTg5IDY4NSA2MTEgNjg1IDM5MCAzMzcKMzkwIDgzOCA1MDAgNTAwIDYxMyA2MzUgNTUwIDYzNSA2MTUgMzUyIDYzNSA2MzQgMjc4IDI3OCA1NzkgMjc4IDk3NCA2MzQgNjEyCjYzNSA2MzUgNDExIDUyMSAzOTIgNjM0IDU5MiA4MTggNTkyIDU5MiA1MjUgNjM2IDMzNyA2MzYgODM4IDYwMCA2MzYgNjAwIDMxOAozNTIgNTE4IDEwMDAgNTAwIDUwMCA1MDAgMTM1MCA2MzUgNDAwIDEwNzAgNjAwIDY4NSA2MDAgNjAwIDMxOCAzMTggNTE4IDUxOAo1OTAgNTAwIDEwMDAgNTAwIDEwMDAgNTIxIDQwMCAxMDI4IDYwMCA1MjUgNjExIDMxOCA0MDEgNjM2IDYzNiA2MzYgNjM2IDMzNwo1MDAgNTAwIDEwMDAgNDcxIDYxNyA4MzggMzYxIDEwMDAgNTAwIDUwMCA4MzggNDAxIDQwMSA1MDAgNjM2IDYzNiAzMTggNTAwCjQwMSA0NzEgNjE3IDk2OSA5NjkgOTY5IDUzMSA2ODQgNjg0IDY4NCA2ODQgNjg0IDY4NCA5NzQgNjk4IDYzMiA2MzIgNjMyIDYzMgoyOTUgMjk1IDI5NSAyOTUgNzc1IDc0OCA3ODcgNzg3IDc4NyA3ODcgNzg3IDgzOCA3ODcgNzMyIDczMiA3MzIgNzMyIDYxMSA2MDgKNjMwIDYxMyA2MTMgNjEzIDYxMyA2MTMgNjEzIDk5NSA1NTAgNjE1IDYxNSA2MTUgNjE1IDI3OCAyNzggMjc4IDI3OCA2MTIgNjM0CjYxMiA2MTIgNjEyIDYxMiA2MTIgODM4IDYxMiA2MzQgNjM0IDYzNCA2MzQgNTkyIDYzNSA1OTIgXQplbmRvYmoKMTUgMCBvYmoKPDwgL0ggMTYgMCBSIC9kIDE3IDAgUiAvZSAxOCAwIFIgL2YgMTkgMCBSIC9qIDIwIDAgUiA+PgplbmRvYmoKMjYgMCBvYmoKPDwgL0ZpbHRlciAvRmxhdGVEZWNvZGUgL0xlbmd0aCAyNTkgPj4Kc3RyZWFtCnicPVJJcsMwDLv7FXwCd0nvSacn5//XAvTUlxBjigAIpneL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ZG9iagoyMyAwIG9iago8PCAvQXNjZW50IDkyOSAvQ2FwSGVpZ2h0IDAgL0Rlc2NlbnQgLTIzNiAvRmxhZ3MgMzIKL0ZvbnRCQm94IFsgLTEwMjEgLTQ2MyAxNzk0IDEyMzMgXSAvRm9udE5hbWUgL0RlamFWdVNhbnMgL0l0YWxpY0FuZ2xlIDAKL01heFdpZHRoIDEzNDIgL1N0ZW1WIDAgL1R5cGUgL0ZvbnREZXNjcmlwdG9yIC9YSGVpZ2h0IDAgPj4KZW5kb2JqCjIyIDAgb2JqClsgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAKNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCAzMTggNDAxIDQ2MCA4MzggNjM2Cjk1MCA3ODAgMjc1IDM5MCAzOTAgNTAwIDgzOCAzMTggMzYxIDMxOCAzMzcgNjM2IDYzNiA2MzYgNjM2IDYzNiA2MzYgNjM2IDYzNgo2MzYgNjM2IDMzNyAzMzcgODM4IDgzOCA4MzggNTMxIDEwMDAgNjg0IDY4NiA2OTggNzcwIDYzMiA1NzUgNzc1IDc1MiAyOTUKMjk1IDY1NiA1NTcgODYzIDc0OCA3ODcgNjAzIDc4NyA2OTUgNjM1IDYxMSA3MzIgNjg0IDk4OSA2ODUgNjExIDY4NSAzOTAgMzM3CjM5MCA4MzggNTAwIDUwMCA2MTMgNjM1IDU1MCA2MzUgNjE1IDM1MiA2MzUgNjM0IDI3OCAyNzggNTc5IDI3OCA5NzQgNjM0IDYxMgo2MzUgNjM1IDQxMSA1MjEgMzkyIDYzNCA1OTIgODE4IDU5MiA1OTIgNTI1IDYzNiAzMzcgNjM2IDgzOCA2MDAgNjM2IDYwMCAzMTgKMzUyIDUxOCAxMDAwIDUwMCA1MDAgNTAwIDEzNDIgNjM1IDQwMCAxMDcwIDYwMCA2ODUgNjAwIDYwMCAzMTggMzE4IDUxOCA1MTgKNTkwIDUwMCAxMDAwIDUwMCAxMDAwIDUyMSA0MDAgMTAyMyA2MDAgNTI1IDYxMSAzMTggNDAxIDYzNiA2MzYgNjM2IDYzNiAzMzcKNTAwIDUwMCAxMDAwIDQ3MSA2MTIgODM4IDM2MSAxMDAwIDUwMCA1MDAgODM4IDQwMSA0MDEgNTAwIDYzNiA2MzYgMzE4IDUwMAo0MDEgNDcxIDYxMiA5NjkgOTY5IDk2OSA1MzEgNjg0IDY4NCA2ODQgNjg0IDY4NCA2ODQgOTc0IDY5OCA2MzIgNjMyIDYzMiA2MzIKMjk1IDI5NSAyOTUgMjk1IDc3NSA3NDggNzg3IDc4NyA3ODcgNzg3IDc4NyA4MzggNzg3IDczMiA3MzIgNzMyIDczMiA2MTEgNjA1CjYzMCA2MTMgNjEzIDYxMyA2MTMgNjEzIDYxMyA5ODIgNTUwIDYxNSA2MTUgNjE1IDYxNSAyNzggMjc4IDI3OCAyNzggNjEyIDYzNAo2MTIgNjEyIDYxMiA2MTIgNjEyIDgzOCA2MTIgNjM0IDYzNCA2MzQgNjM0IDU5MiA2MzUgNTkyIF0KZW5kb2JqCjI1IDAgb2JqCjw8IC9CIDI2IDAgUiAvSCAyNyAwIFIgL2EgMjkgMCBSIC9iYXIgMzAgMCBSIC9kIDMxIDAgUiAvZSAzMiAwIFIgL2YgMzMgMCBSCi9maXZlIDM0IDAgUiAvZm91ciAzNSAwIFIgL2cgMzYgMCBSIC9pIDM3IDAgUiAvbCAzOCAwIFIgL24gNDAgMCBSIC9vIDQxIDAgUgovb25lIDQyIDAgUiAvcGFyZW5sZWZ0IDQzIDAgUiAvcGFyZW5yaWdodCA0NCAwIFIgL3IgNDUgMCBSIC9zZXZlbiA0NiAwIFIKL3NpeCA0NyAwIFIgL3NwYWNlIDQ4IDAgUiAvdCA0OSAwIFIgL3RocmVlIDUwIDAgUiAvdHdvIDUxIDAgUiAveiA1MiAwIFIKL3plcm8gNTMgMCBSID4+CmVuZG9iagozIDAgb2JqCjw8IC9GMSAyNCAwIFIgL0YyIDE0IDAgUiA+PgplbmRvYmoKNCAwIG9iago8PCAvQTEgPDwgL0NBIDAgL1R5cGUgL0V4dEdTdGF0ZSAvY2EgMSA+PgovQTIgPDwgL0NBIDEgL1R5cGUgL0V4dEdTdGF0ZSAvY2EgMSA+PgovQTMgPDwgL0NBIDAuOCAvVHlwZSAvRXh0R1N0YXRlIC9jYSAwLjggPj4gPj4KZW5kb2JqCjUgMCBvYmoKPDwgPj4KZW5kb2JqCjYgMCBvYmoKPDwgPj4KZW5kb2JqCjcgMCBvYmoKPDwgL0RlamFWdVNhbnMtT2JsaXF1ZS1vbWVnYSAyMSAwIFIgL0RlamFWdVNhbnMtT21lZ2EgMjggMCBSCi9EZWphVnVTYW5zLW1pbnVzIDM5IDAgUiA+PgplbmRvYmoKMiAwIG9iago8PCAvQ291bnQgMSAvS2lkcyBbIDEwIDAgUiBdIC9UeXBlIC9QYWdlcyA+PgplbmRvYmoKNTQgMCBvYmoKPDwgL0NyZWF0aW9uRGF0ZSAoRDoyMDIwMDEyMTA5NTYxMiswMicwMCcpCi9DcmVhdG9yIChtYXRwbG90bGliIDMuMS4xLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcpCi9Qcm9kdWNlciAobWF0cGxvdGxpYiBwZGYgYmFja2VuZCAzLjEuMSkgPj4KZW5kb2JqCnhyZWYKMCA1NQowMDAwMDAwMDAwIDY1NTM1IGYgCjAwMDAwMDAwMTYgMDAwMDAgbiAKMDAwMDAxNTQxNyAwMDAwMCBuIAowMDAwMDE1MDg2IDAwMDAwIG4gCjAwMDAwMTUxMjkgMDAwMDAgbiAKMDAwMDAxNTI3MSAwMDAwMCBuIAowMDAwMDE1MjkyIDAwMDAwIG4gCjAwMDAwMTUzMTMgMDAwMDAgbiAKMDAwMDAwMDA2NSAwMDAwMCBuIAowMDAwMDAwMzk5IDAwMDAwIG4gCjAwMDAwMDAyMDggMDAwMDAgbiAKMDAwMDAwMjgwNiAwMDAwMCBuIAowMDAwMDA1MDg1IDAwMDAwIG4gCjAwMDAwMDQ4NzcgMDAwMDAgbiAKMDAwMDAwNDU0MiAwMDAwMCBuIAowMDAwMDA2MTM4IDAwMDAwIG4gCjAwMDAwMDI4MjcgMDAwMDAgbiAKMDAwMDAwMjk4NyAwMDAwMCBuIAowMDAwMDAzMzg1IDAwMDAwIG4gCjAwMDAwMDM3ODUgMDAwMDAgbiAKMDAwMDAwNDAwMiAwMDAwMCBuIAowMDAwMDA0MjI3IDAwMDAwIG4gCjAwMDAwMTM3MDUgMDAwMDAgbiAKMDAwMDAxMzUwNSAwMDAwMCBuIAowMDAwMDEzMDM4IDAwMDAwIG4gCjAwMDAwMTQ3NTggMDAwMDAgbiAKMDAwMDAwNjIxMCAwMDAwMCBuIAowMDAwMDA2NTQyIDAwMDAwIG4gCjAwMDAwMDY2OTEgMDAwMDAgbiAKMDAwMDAwNzA2MiAwMDAwMCBuIAowMDAwMDA3NDM5IDAwMDAwIG4gCjAwMDAwMDc1NjUgMDAwMDAgbiAKMDAwMDAwNzg2NSAwMDAwMCBuIAowMDAwMDA4MTgzIDAwMDAwIG4gCjAwMDAwMDgzODkgMDAwMDAgbiAKMDAwMDAwODcwOSAwMDAwMCBuIAowMDAwMDA4ODcxIDAwMDAwIG4gCjAwMDAwMDkyODIgMDAwMDAgbiAKMDAwMDAwOTQyMiAwMDAwMCBuIAowMDAwMDA5NTM5IDAwMDAwIG4gCjAwMDAwMDk3MDkgMDAwMDAgbiAKMDAwMDAwOTk0MyAwMDAwMCBuIAowMDAwMDEwMjMwIDAwMDAwIG4gCjAwMDAwMTAzODIgMDAwMDAgbiAKMDAwMDAxMDYwMiAwMDAwMCBuIAowMDAwMDEwODI0IDAwMDAwIG4gCjAwMDAwMTEwNTQgMDAwMDAgbiAKMDAwMDAxMTE5NCAwMDAwMCBuIAowMDAwMDExNTg0IDAwMDAwIG4gCjAwMDAwMTE2NzMgMDAwMDAgbiAKMDAwMDAxMTg3NyAwMDAwMCBuIAowMDAwMDEyMjg4IDAwMDAwIG4gCjAwMDAwMTI2MDkgMDAwMDAgbiAKMDAwMDAxMjc1NSAwMDAwMCBuIAowMDAwMDE1NDc3IDAwMDAwIG4gCnRyYWlsZXIKPDwgL0luZm8gNTQgMCBSIC9Sb290IDEgMCBSIC9TaXplIDU1ID4+CnN0YXJ0eHJlZgoxNTYzMQolJUVPRgo=\n", "image/svg+xml": [ "\n", "\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "\n" ], "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import scipy.signal as sig\n", "\n", "\n", "fs = 44100 # sampling frequency\n", "fc = 1000 # corner frequency of the lowpass\n", "\n", "# coefficients of analog lowpass filter\n", "Qinf = 0.8\n", "sinf = 2 * np.pi * fc\n", "C = 1e-6\n", "L = 1 / (sinf**2 * C)\n", "R = sinf * L / Qinf\n", "\n", "B = [0, 0, 1]\n", "A = [L * C, R * C, 1]\n", "\n", "# cofficients of digital filter\n", "T = 1 / fs\n", "b = [T**2, 2 * T**2, T**2]\n", "a = [\n", " (4 * L * C + 2 * T * R * C + T**2),\n", " (-8 * L * C + 2 * T**2),\n", " (4 * L * C - 2 * T * R * C + T**2),\n", "]\n", "\n", "# compute frequency responses\n", "Om, Hd = sig.freqz(b, a, worN=1024)\n", "tmp, H = sig.freqs(B, A, worN=fs * Om)\n", "\n", "# plot results\n", "f = Om * fs / (2 * np.pi)\n", "plt.figure(figsize=(10, 4))\n", "plt.semilogx(f, 20 * np.log10(np.abs(H)), label=r\"$|H(j \\omega)|$ of analog filter\")\n", "plt.semilogx(\n", " f, 20 * np.log10(np.abs(Hd)), label=r\"$|H_d(e^{j \\Omega})|$ of digital filter\"\n", ")\n", "plt.xlabel(r\"$f$ in Hz\")\n", "plt.ylabel(r\"dB\")\n", "plt.axis([100, fs / 2, -70, 3])\n", "plt.legend()\n", "plt.grid()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Exercise**\n", "\n", "* Increase the corner frequency `fc` of the analog filter. What effect does this have on the deviations between the analog filter and its digital representation?\n", "\n", "Solution: Increasing the corner frequency leads to larger deviations for the higher frequencies as the width of the stop-band of the filter decreases. These deviations may even lead to a different corner/[cut-off frequency](https://en.wikipedia.org/wiki/Cutoff_frequency) as the attenuation in the transition region between the pass- and the stop-band changes." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Design of digital filters from analog prototypes\n", "\n", "The design of analog filters is a topic with a long lasting history. Consequently, many analog filter designs are known. For instance\n", "\n", "* [Butterworth filters](https://en.wikipedia.org/wiki/Butterworth_filter)\n", "* [Chebyshev_filters](https://en.wikipedia.org/wiki/Chebyshev_filter)\n", "* [Cauer filters](https://en.wikipedia.org/wiki/Elliptic_filter)\n", "* [Bessel filters](https://en.wikipedia.org/wiki/Bessel_filter)\n", "\n", "The properties of these designs are well documented and therefore digital realizations are of interest. These can be achieved by the bilinear transform. In Python, the [`scipy.signal`](http://docs.scipy.org/doc/scipy/reference/signal.html) package provides implementations of various analog filter design techniques, as well as an implementation of the bilinear transform. \n", "\n", "The design of a Butterworth bandpass using pre-warping is illustrated in the following." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "application/pdf": "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c2NyaXB0b3IgMTMgMCBSCi9Gb250TWF0cml4IFsgMC4wMDEgMCAwIDAuMDAxIDAgMCBdIC9MYXN0Q2hhciAyNTUgL05hbWUgL0RlamFWdVNhbnMtT2JsaXF1ZQovU3VidHlwZSAvVHlwZTMgL1R5cGUgL0ZvbnQgL1dpZHRocyAxMiAwIFIgPj4KZW5kb2JqCjEzIDAgb2JqCjw8IC9Bc2NlbnQgOTI5IC9DYXBIZWlnaHQgMCAvRGVzY2VudCAtMjM2IC9GbGFncyA5NgovRm9udEJCb3ggWyAtMTAxNiAtMzUxIDE2NjAgMTA2OCBdIC9Gb250TmFtZSAvRGVqYVZ1U2Fucy1PYmxpcXVlCi9JdGFsaWNBbmdsZSAwIC9NYXhXaWR0aCAxMzUwIC9TdGVtViAwIC9UeXBlIC9Gb250RGVzY3JpcHRvciAvWEhlaWdodCAwID4+CmVuZG9iagoxMiAwIG9iagpbIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwCjYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgMzE4IDQwMSA0NjAgODM4IDYzNgo5NTAgNzgwIDI3NSAzOTAgMzkwIDUwMCA4MzggMzE4IDM2MSAzMTggMzM3IDYzNiA2MzYgNjM2IDYzNiA2MzYgNjM2IDYzNiA2MzYKNjM2IDYzNiAzMzcgMzM3IDgzOCA4MzggODM4IDUzMSAxMDAwIDY4NCA2ODYgNjk4IDc3MCA2MzIgNTc1IDc3NSA3NTIgMjk1CjI5NSA2NTYgNTU3IDg2MyA3NDggNzg3IDYwMyA3ODcgNjk1IDYzNSA2MTEgNzMyIDY4NCA5ODkgNjg1IDYxMSA2ODUgMzkwIDMzNwozOTAgODM4IDUwMCA1MDAgNjEzIDYzNSA1NTAgNjM1IDYxNSAzNTIgNjM1IDYzNCAyNzggMjc4IDU3OSAyNzggOTc0IDYzNCA2MTIKNjM1IDYzNSA0MTEgNTIxIDM5MiA2MzQgNTkyIDgxOCA1OTIgNTkyIDUyNSA2MzYgMzM3IDYzNiA4MzggNjAwIDYzNiA2MDAgMzE4CjM1MiA1MTggMTAw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ciAwIC9Gb250QkJveCBbIC0xMDIxIC00NjMgMTc5NCAxMjMzIF0gL0ZvbnREZXNjcmlwdG9yIDIzIDAgUgovRm9udE1hdHJpeCBbIDAuMDAxIDAgMCAwLjAwMSAwIDAgXSAvTGFzdENoYXIgMjU1IC9OYW1lIC9EZWphVnVTYW5zCi9TdWJ0eXBlIC9UeXBlMyAvVHlwZSAvRm9udCAvV2lkdGhzIDIyIDAgUiA+PgplbmRvYmoKMjMgMCBvYmoKPDwgL0FzY2VudCA5MjkgL0NhcEhlaWdodCAwIC9EZXNjZW50IC0yMzYgL0ZsYWdzIDMyCi9Gb250QkJveCBbIC0xMDIxIC00NjMgMTc5NCAxMjMzIF0gL0ZvbnROYW1lIC9EZWphVnVTYW5zIC9JdGFsaWNBbmdsZSAwCi9NYXhXaWR0aCAxMzQyIC9TdGVtViAwIC9UeXBlIC9Gb250RGVzY3JpcHRvciAvWEhlaWdodCAwID4+CmVuZG9iagoyMiAwIG9iagpbIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwCjYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgMzE4IDQwMSA0NjAgODM4IDYzNgo5NTAgNzgwIDI3NSAzOTAgMzkwIDUwMCA4MzggMzE4IDM2MSAzMTggMzM3IDYzNiA2MzYgNjM2IDYzNiA2MzYgNjM2IDYzNiA2MzYKNjM2IDYzNiAzMzcgMzM3IDgzOCA4MzggODM4IDUzMSAxMDAwIDY4NCA2ODYgNjk4IDc3MCA2MzIgNTc1IDc3NSA3NTIgMjk1CjI5NSA2NTYgNTU3IDg2MyA3NDggNzg3IDYwMyA3ODcgNjk1IDYzNSA2MTEgNzMyIDY4NCA5ODkgNjg1IDYxMSA2ODUgMzkwIDMzNwozOTAgODM4IDUwMCA1MDAgNjEzIDYzNSA1NTAgNjM1IDYxNSAzNTIgNjM1IDYzNCAyNzggMjc4IDU3OSAyNzggOTc0IDYzNCA2MTIKNjM1IDYzNSA0MTEgNTIxIDM5MiA2MzQgNTkyIDgxOCA1OTIgNTkyIDUyNSA2MzYgMzM3IDYzNiA4MzggNjAwIDYzNiA2MDAgMzE4CjM1MiA1MTggMTAwMCA1MDAgNTAwIDUwMCAxMzQyIDYzNSA0MDAgMTA3MCA2MDAgNjg1IDYwMCA2MDAgMzE4IDMxOCA1MTggNTE4CjU5MCA1MDAgMTAwMCA1MDAgMTAwMCA1MjEgNDAwIDEwMjMgNjAwIDUyNSA2MTEgMzE4IDQwMSA2MzYgNjM2IDYzNiA2MzYgMzM3CjUwMCA1MDAgMTAwMCA0NzEgNjEyIDgzOCAzNjEgMTAwMCA1MDAgNTAwIDgzOCA0MDEgNDAxIDUwMCA2MzYgNjM2IDMxOCA1MDAKNDAxIDQ3MSA2MTIgOTY5IDk2OSA5NjkgNTMxIDY4NCA2ODQgNjg0IDY4NCA2ODQgNjg0IDk3NCA2OTggNjMyIDYzMiA2MzIgNjMyCjI5NSAyOTUgMjk1IDI5NSA3NzUgNzQ4IDc4NyA3ODcgNzg3IDc4NyA3ODcgODM4IDc4NyA3MzIgNzMyIDczMiA3MzIgNjExIDYwNQo2MzAgNjEzIDYxMyA2MTMgNjEzIDYxMyA2MTMgOTgyIDU1MCA2MTUgNjE1IDYxNSA2MTUgMjc4IDI3OCAyNzggMjc4IDYxMiA2MzQKNjEyIDYxMiA2MTIgNjEyIDYxMiA4MzggNjEyIDYzNCA2MzQgNjM0IDYzNCA1OTIgNjM1IDU5MiBdCmVuZG9iagoyNSAwIG9iago8PCAvQiAyNiAwIFIgL0ggMjcgMCBSIC9hIDI5IDAgUiAvYmFyIDMwIDAgUiAvZCAzMSAwIFIgL2UgMzIgMCBSIC9mIDMzIDAgUgovZml2ZSAzNCAwIFIgL2ZvdXIgMzUgMCBSIC9nIDM2IDAgUiAvaCAzNyAwIFIgL2h5cGhlbiAzOCAwIFIgL2kgMzkgMCBSCi9sIDQwIDAgUiAvbiA0MiAwIFIgL28gNDMgMCBSIC9vbmUgNDQgMCBSIC9wIDQ1IDAgUiAvcGFyZW5sZWZ0IDQ2IDAgUgovcGFyZW5yaWdodCA0NyAwIFIgL3IgNDggMCBSIC9zZXZlbiA0OSAwIFIgL3NpeCA1MCAwIFIgL3NwYWNlIDUxIDAgUgovdCA1MiAwIFIgL3RocmVlIDUzIDAgUiAvdHdvIDU0IDAgUiAvdSA1NSAwIFIgL3cgNTYgMCBSIC95IDU3IDAgUiAveiA1OCAwIFIKL3plcm8gNTkgMCBSID4+CmVuZG9iagozIDAgb2JqCjw8IC9GMSAyNCAwIFIgL0YyIDE0IDAgUiA+PgplbmRvYmoKNCAwIG9iago8PCAvQTEgPDwgL0NBIDAgL1R5cGUgL0V4dEdTdGF0ZSAvY2EgMSA+PgovQTIgPDwgL0NBIDEgL1R5cGUgL0V4dEdTdGF0ZSAvY2EgMSA+PgovQTMgPDwgL0NBIDAuOCAvVHlwZSAvRXh0R1N0YXRlIC9jYSAwLjggPj4gPj4KZW5kb2JqCjUgMCBvYmoKPDwgPj4KZW5kb2JqCjYgMCBvYmoKPDwgPj4KZW5kb2JqCjcgMCBvYmoKPDwgL0RlamFWdVNhbnMtT2JsaXF1ZS1vbWVnYSAyMSAwIFIgL0RlamFWdVNhbnMtT21lZ2EgMjggMCBSCi9EZWphVnVTYW5zLW1pbnVzIDQxIDAgUiA+PgplbmRvYmoKMiAwIG9iago8PCAvQ291bnQgMSAvS2lkcyBbIDEwIDAgUiBdIC9UeXBlIC9QYWdlcyA+PgplbmRvYmoKNjAgMCBvYmoKPDwgL0NyZWF0aW9uRGF0ZSAoRDoyMDIwMDEyMTA5NTYxMiswMicwMCcpCi9DcmVhdG9yIChtYXRwbG90bGliIDMuMS4xLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcpCi9Qcm9kdWNlciAobWF0cGxvdGxpYiBwZGYgYmFja2VuZCAzLjEuMSkgPj4KZW5kb2JqCnhyZWYKMCA2MQowMDAwMDAwMDAwIDY1NTM1IGYgCjAwMDAwMDAwMTYgMDAwMDAgbiAKMDAwMDAxOTI2MCAwMDAwMCBuIAowMDAwMDE4OTI5IDAwMDAwIG4gCjAwMDAwMTg5NzIgMDAwMDAgbiAKMDAwMDAxOTExNCAwMDAwMCBuIAowMDAwMDE5MTM1IDAwMDAwIG4gCjAwMDAwMTkxNTYgMDAwMDAgbiAKMDAwMDAwMDA2NSAwMDAwMCBuIAowMDAwMDAwMzk5IDAwMDAwIG4gCjAwMDAwMDAyMDggMDAwMDAgbiAKMDAwMDAwNTI3NCAwMDAwMCBuIAowMDAwMDA3NTUzIDAwMDAwIG4gCjAwMDAwMDczNDUgMDAwMDAgbiAKMDAwMDAwNzAxMCAwMDAwMCBuIAowMDAwMDA4NjA2IDAwMDAwIG4gCjAwMDAwMDUyOTUgMDAwMDAgbiAKMDAwMDAwNTQ1NSAwMDAwMCBuIAowMDAwMDA1ODUzIDAwMDAwIG4gCjAwMDAwMDYyNTMgMDAwMDAgbiAKMDAwMDAwNjQ3MCAwMDAwMCBuIAowMDAwMDA2Njk1IDAwMDAwIG4gCjAwMDAwMTc0ODMgMDAwMDAgbiAKMDAwMDAxNzI4MyAwMDAwMCBuIAowMDAwMDE2NzkwIDAwMDAwIG4gCjAwMDAwMTg1MzYgMDAwMDAgbiAKMDAwMDAwODY3OCAwMDAwMCBuIAowMDAwMDA5MDEwIDAwMDAwIG4gCjAwMDAwMDkxNTkgMDAwMDAgbiAKMDAwMDAwOTUzMCAwMDAwMCBuIAowMDAwMDA5OTA3IDAwMDAwIG4gCjAwMDAwMTAwMzMgMDAwMDAgbiAKMDAwMDAxMDMzMyAwMDAwMCBuIAowMDAwMDEwNjUxIDAwMDAwIG4gCjAwMDAwMTA4NTcgMDAwMDAgbiAKMDAwMDAxMTE3NyAwMDAwMCBuIAowMDAwMDExMzM5IDAwMDAwIG4gCjAwMDAwMTE3NTAgMDAwMDAgbiAKMDAwMDAxMTk4NiAwMDAwMCBuIAowMDAwMDEyMTEwIDAwMDAwIG4gCjAwMDAwMTIyNTAgMDAwMDAgbiAKMDAwMDAxMjM2NyAwMDAwMCBuIAowMDAwMDEyNTM3IDAwMDAwIG4gCjAwMDAwMTI3NzEgMDAwMDAgbiAKMDAwMDAxMzA1OCAwMDAwMCBuIAowMDAwMDEzMjEwIDAwMDAwIG4gCjAwMDAwMTM1MTkgMDAwMDAgbiAKMDAwMDAxMzczOSAwMDAwMCBuIAowMDAwMDEzOTYxIDAwMDAwIG4gCjAwMDAwMTQxOTEgMDAwMDAgbiAKMDAwMDAxNDMzMSAwMDAwMCBuIAowMDAwMDE0NzIxIDAwMDAwIG4gCjAwMDAwMTQ4MTAgMDAwMDAgbiAKMDAwMDAxNTAxNCAwMDAwMCBuIAowMDAwMDE1NDI1IDAwMDAwIG4gCjAwMDAwMTU3NDYgMDAwMDAgbiAKMDAwMDAxNTk5MCAwMDAwMCBuIAowMDAwMDE2MTUwIDAwMDAwIG4gCjAwMDAwMTYzNjEgMDAwMDAgbiAKMDAwMDAxNjUwNyAwMDAwMCBuIAowMDAwMDE5MzIwIDAwMDAwIG4gCnRyYWlsZXIKPDwgL0luZm8gNjAgMCBSIC9Sb290IDEgMCBSIC9TaXplIDYxID4+CnN0YXJ0eHJlZgoxOTQ3NAolJUVPRgo=\n", "image/svg+xml": [ "\n", "\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "\n" ], "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "omc = 2 * np.pi * np.array([5000, 6000]) # corner frequencies of bandpass\n", "N = 2 # order of filter\n", "\n", "# pre-warping of corner frequencies\n", "omcp = 2 * fs * np.tan(omc / (2 * fs))\n", "\n", "# design of analog filters with and without pre-warping\n", "B, A = sig.butter(N, omc, btype=\"bandpass\", analog=True)\n", "Bp, Ap = sig.butter(N, omcp, btype=\"bandpass\", analog=True)\n", "\n", "# bilinear transform of analog prototypes\n", "b, a = sig.bilinear(B, A, fs)\n", "bp, ap = sig.bilinear(Bp, Ap, fs)\n", "\n", "# compute frequency responses\n", "Om, Hdp = sig.freqz(bp, ap, worN=1024)\n", "Om, Hd = sig.freqz(b, a, worN=1024)\n", "tmp, H = sig.freqs(B, A, worN=fs * Om)\n", "\n", "# plot results\n", "np.seterr(divide=\"ignore\")\n", "f = Om * fs / (2 * np.pi)\n", "plt.figure(figsize=(12, 8))\n", "plt.semilogx(f, 20 * np.log10(np.abs(H)), label=r\"$|H(j \\omega)|$ of analog prototype\")\n", "plt.semilogx(\n", " f,\n", " 20 * np.log10(np.abs(Hd)),\n", " label=r\"$|H_d(e^{j \\Omega})|$ of digital filter without pre-warping\",\n", ")\n", "plt.semilogx(\n", " f,\n", " 20 * np.log10(np.abs(Hdp)),\n", " label=r\"$|H_d(e^{j \\Omega})|$ of digital filter with pre-warping\",\n", ")\n", "plt.xlabel(r\"$f$ in Hz\")\n", "plt.ylabel(r\"dB\")\n", "plt.axis([100, fs / 2, -70, 3])\n", "plt.legend()\n", "plt.grid()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Exercise**\n", "\n", "* What is improved by pre-warping?\n", "* Change the corner frequencies `omc` of the analog prototype and examine the deviations from the analog prototype. When is pre-warping beneficial and when not?\n", "\n", "Solution: The location and width of the pass-band of the digital filter is closer to the desired pass-band when pre-warping is used in the design process. Pre-warping is especially beneficial if the desired pass-band is located at higher frequencies, as the deviations caused by the bilinear transformation are less prominent for lower frequencies." ] }, { "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*." ] } ], "metadata": { "anaconda-cloud": {}, "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.7.5" } }, "nbformat": 4, "nbformat_minor": 1 }