{ "cells": [ { "cell_type": "markdown", "metadata": { "nbsphinx": "hidden" }, "source": [ "# Quantization of 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": [ "## Introduction\n", "\n", "[Digital signal processors](https://en.wikipedia.org/wiki/Digital_signal_processor) and general purpose processors can only perform arithmetic operations within a limited number range. So far we considered discrete signals with continuous amplitude values. These cannot be handled by processors in a straightforward manner. [Quantization](https://en.wikipedia.org/wiki/Quantization_%28signal_processing%29) is the process of mapping a continuous amplitude to a countable set of amplitude values. This refers also to the *requantization* of a signal from a large set of countable amplitude values to a smaller set. Scalar quantization is an instantaneous and memoryless operation. It can be applied to the continuous amplitude signal, also referred to as *analog signal* or to the (time-)discrete signal. The quantized discrete signal is termed as *digital signal*. The connections between the different domains are illustrated in the following.\n", "\n", "![Interrelations between analog, discrete and digital signals](analog_discrete_digital.png)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Model of the Quantization Process\n", "\n", "In order to discuss the effects of quantizing a continuous amplitude signal, a mathematical model of the quantization process is required. We restrict our considerations to a discrete real-valued signal $x[k]$. The following mapping is used in order to quantize the continuous amplitude signal $x[k]$\n", "\n", "\\begin{equation}\n", "x_Q[k] = g( \\; \\lfloor \\, f(x[k]) \\, \\rfloor \\; )\n", "\\end{equation}\n", "\n", "where $g(\\cdot)$ and $f(\\cdot)$ denote real-valued mapping functions, and $\\lfloor \\cdot \\rfloor$ a rounding operation. The quantization process can be split into two stages\n", "\n", "1. **Forward quantization**\n", " The mapping $f(x[k])$ maps the signal $x[k]$ such that it is suitable for the rounding operation. This may be a scaling of the signal or a non-linear mapping. The result of the rounding operation is an integer number $\\lfloor \\, f(x[k]) \\, \\rfloor \\in \\mathbb{Z}$, which is termed as *quantization index*.\n", " \n", "2. **Inverse quantization**\n", " The mapping $g(\\cdot)$, maps the quantization index to the quantized value $x_Q[k]$ such that it constitutes an approximation of $x[k]$. This may be a simple scaling or non-linear operation.\n", "\n", "The quantization error (quantization noise) $e[k]$ is defined as\n", "\n", "\\begin{equation}\n", "e[k] = x_Q[k] - x[k]\n", "\\end{equation}\n", "\n", "Rearranging yields that the quantization process can be modeled by adding the quantization error to the discrete signal\n", "\n", "![Model of the quantization process](model_quantization.png)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Example - Quantization of a sine signal\n", "\n", "In order to illustrate the introduced model, the quantization of one period of a sine signal is considered\n", "\n", "\\begin{equation}\n", "x[k] = \\sin[\\Omega_0 k]\n", "\\end{equation}\n", "\n", "using \n", "\n", "\\begin{align}\n", "f(x[k]) &= 3 \\cdot x[k] \\\\\n", "i &= \\lfloor \\, f(x[k]) \\, \\rfloor \\\\\n", "g(i) &= \\frac{1}{3} \\cdot i\n", "\\end{align}\n", "\n", "where $\\lfloor \\cdot \\rfloor$ denotes the [nearest integer function](https://en.wikipedia.org/wiki/Nearest_integer_function) and $i$ the quantization index. The quantized signal is then given as\n", "\n", "\\begin{equation}\n", "x_Q[k] = \\frac{1}{3} \\cdot \\lfloor \\, 3 \\cdot \\sin[\\Omega_0 k] \\, \\rfloor\n", "\\end{equation}\n", "\n", "The discrete signals are not shown by stem plots for ease of illustration." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "data": { "application/pdf": "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ZG9iagoxMyAwIG9iago8PCAvQXNjZW50IDkyOSAvQ2FwSGVpZ2h0IDAgL0Rlc2NlbnQgLTIzNiAvRmxhZ3MgOTYKL0ZvbnRCQm94IFsgLTEwMTYgLTM1MSAxNjYwIDEwNjggXSAvRm9udE5hbWUgL0RlamFWdVNhbnMtT2JsaXF1ZQovSXRhbGljQW5nbGUgMCAvTWF4V2lkdGggMTM1MCAvU3RlbVYgMCAvVHlwZSAvRm9udERlc2NyaXB0b3IgL1hIZWlnaHQgMCA+PgplbmRvYmoKMTIgMCBvYmoKWyA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMAo2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDMxOCA0MDEgNDYwIDgzOCA2MzYKOTUwIDc4MCAyNzUgMzkwIDM5MCA1MDAgODM4IDMxOCAzNjEgMzE4IDMzNyA2MzYgNjM2IDYzNiA2MzYgNjM2IDYzNiA2MzYgNjM2CjYzNiA2MzYgMzM3IDMzNyA4MzggODM4IDgzOCA1MzEgMTAwMCA2ODQgNjg2IDY5OCA3NzAgNjMyIDU3NSA3NzUgNzUyIDI5NQoyOTUgNjU2IDU1NyA4NjMgNzQ4IDc4NyA2MDMgNzg3IDY5NSA2MzUgNjExIDczMiA2ODQgOTg5IDY4NSA2MTEgNjg1IDM5MCAzMzcKMzkwIDgzOCA1MDAgNTAwIDYxMyA2MzUgNTUwIDYzNSA2MTUgMzUyIDYzNSA2MzQgMjc4IDI3OCA1NzkgMjc4IDk3NCA2MzQgNjEyCjYzNSA2MzUgNDExIDUyMSAzOTIgNjM0IDU5MiA4MTggNTkyIDU5MiA1MjUgNjM2IDMzNyA2MzYgODM4IDYwMCA2MzYgNjAwIDMxOAozNTIgNTE4IDEwMDAgNTAwIDUwMCA1MDAgMTM1MCA2MzUgNDAwIDEwNzAgNjAwIDY4NSA2MDAgNjAwIDMxOCAzMTggNTE4IDUxOAo1OTAgNTAwIDEwMDAgNTAwIDEwMDAgNTIxIDQwMCAxMDI4IDYwMCA1MjUgNjExIDMxOCA0MDEgNjM2IDYzNiA2MzYgNjM2IDMzNwo1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NDYzIDE3OTQgMTIzMyBdIC9Gb250RGVzY3JpcHRvciAyMSAwIFIKL0ZvbnRNYXRyaXggWyAwLjAwMSAwIDAgMC4wMDEgMCAwIF0gL0xhc3RDaGFyIDI1NSAvTmFtZSAvRGVqYVZ1U2FucwovU3VidHlwZSAvVHlwZTMgL1R5cGUgL0ZvbnQgL1dpZHRocyAyMCAwIFIgPj4KZW5kb2JqCjIxIDAgb2JqCjw8IC9Bc2NlbnQgOTI5IC9DYXBIZWlnaHQgMCAvRGVzY2VudCAtMjM2IC9GbGFncyAzMgovRm9udEJCb3ggWyAtMTAyMSAtNDYzIDE3OTQgMTIzMyBdIC9Gb250TmFtZSAvRGVqYVZ1U2FucyAvSXRhbGljQW5nbGUgMAovTWF4V2lkdGggMTM0MiAvU3RlbVYgMCAvVHlwZSAvRm9udERlc2NyaXB0b3IgL1hIZWlnaHQgMCA+PgplbmRvYmoKMjAgMCBvYmoKWyA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMAo2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDMxOCA0MDEgNDYwIDgzOCA2MzYKOTUwIDc4MCAyNzUgMzkwIDM5MCA1MDAgODM4IDMxOCAzNjEgMzE4IDMzNyA2MzYgNjM2IDYzNiA2MzYgNjM2IDYzNiA2MzYgNjM2CjYzNiA2MzYgMzM3IDMzNyA4MzggODM4IDgzOCA1MzEgMTAwMCA2ODQgNjg2IDY5OCA3NzAgNjMyIDU3NSA3NzUgNzUyIDI5NQoyOTUgNjU2IDU1NyA4NjMgNzQ4IDc4NyA2MDMgNzg3IDY5NSA2MzUgNjExIDczMiA2ODQgOTg5IDY4NSA2MTEgNjg1IDM5MCAzMzcKMzkwIDgzOCA1MDAgNTAwIDYxMyA2MzUgNTUwIDYzNSA2MTUgMzUyIDYzNSA2MzQgMjc4IDI3OCA1NzkgMjc4IDk3NCA2MzQgNjEyCjYzNSA2MzUgNDExIDUyMSAzOTIgNjM0IDU5MiA4MTggNTkyIDU5MiA1MjUgNjM2IDMzNyA2MzYgODM4IDYwMCA2MzYgNjAwIDMxOAozNTIgNTE4IDEwMDAgNTAwIDUwMCA1MDAgMTM0MiA2MzUgNDAwIDEwNzAgNjAwIDY4NSA2MDAgNjAwIDMxOCAzMTggNTE4IDUxOAo1OTAgNTAwIDEwMDAgNTAwIDEwMDAgNTIxIDQwMCAxMDIzIDYwMCA1MjUgNjExIDMxOCA0MDEgNjM2IDYzNiA2MzYgNjM2IDMzNwo1MDAgNTAwIDEwMDAgNDcxIDYxMiA4MzggMzYxIDEwMDAgNTAwIDUwMCA4MzggNDAxIDQwMSA1MDAgNjM2IDYzNiAzMTggNTAwCjQwMSA0NzEgNjEyIDk2OSA5NjkgOTY5IDUzMSA2ODQgNjg0IDY4NCA2ODQgNjg0IDY4NCA5NzQgNjk4IDYzMiA2MzIgNjMyIDYzMgoyOTUgMjk1IDI5NSAyOTUgNzc1IDc0OCA3ODcgNzg3IDc4NyA3ODcgNzg3IDgzOCA3ODcgNzMyIDczMiA3MzIgNzMyIDYxMSA2MDUKNjMwIDYxMyA2MTMgNjEzIDYxMyA2MTMgNjEzIDk4MiA1NTAgNjE1IDYxNSA2MTUgNjE1IDI3OCAyNzggMjc4IDI3OCA2MTIgNjM0CjYxMiA2MTIgNjEyIDYxMiA2MTIgODM4IDYxMiA2MzQgNjM0IDYzNCA2MzQgNTkyIDYzNSA1OTIgXQplbmRvYmoKMjMgMCBvYmoKPDwgL2EgMjQgMCBSIC9icmFja2V0bGVmdCAyNSAwIFIgL2JyYWNrZXRyaWdodCAyNiAwIFIgL2NvbW1hIDI3IDAgUgovZCAyOCAwIFIgL2UgMjkgMCBSIC9laWdodCAzMCAwIFIgL2ZpdmUgMzEgMCBSIC9mb3VyIDMyIDAgUiAvZyAzMyAwIFIKL2kgMzQgMCBSIC9rIDM1IDAgUiAvbCAzNiAwIFIgL24gMzggMCBSIC9vIDM5IDAgUiAvb25lIDQwIDAgUgovcGVyaW9kIDQxIDAgUiAvcSA0MiAwIFIgL3IgNDMgMCBSIC9zIDQ0IDAgUiAvc2l4IDQ1IDAgUiAvc3BhY2UgNDYgMCBSCi90IDQ3IDAgUiAvdGhyZWUgNDggMCBSIC90d28gNDkgMCBSIC91IDUwIDAgUiAveCA1MSAwIFIgL3ogNTIgMCBSCi96ZXJvIDUzIDAgUiA+PgplbmRvYmoKMyAwIG9iago8PCAvRjEgMjIgMCBSIC9GMiAxNCAwIFIgPj4KZW5kb2JqCjQgMCBvYmoKPDwgL0ExIDw8IC9DQSAwIC9UeXBlIC9FeHRHU3RhdGUgL2NhIDEgPj4KL0EyIDw8IC9DQSAxIC9UeXBlIC9FeHRHU3RhdGUgL2NhIDEgPj4KL0EzIDw8IC9DQSAwLjggL1R5cGUgL0V4dEdTdGF0ZSAvY2EgMC44ID4+ID4+CmVuZG9iago1IDAgb2JqCjw8ID4+CmVuZG9iago2IDAgb2JqCjw8ID4+CmVuZG9iago3IDAgb2JqCjw8IC9GMS1EZWphVnVTYW5zLW1pbnVzIDM3IDAgUiA+PgplbmRvYmoKMiAwIG9iago8PCAvQ291bnQgMSAvS2lkcyBbIDEwIDAgUiBdIC9UeXBlIC9QYWdlcyA+PgplbmRvYmoKNTQgMCBvYmoKPDwgL0NyZWF0aW9uRGF0ZSAoRDoyMDIxMDExODEyMTEyMiswMicwMCcpCi9DcmVhdG9yIChNYXRwbG90bGliIHYzLjMuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZykKL1Byb2R1Y2VyIChNYXRwbG90bGliIHBkZiBiYWNrZW5kIHYzLjMuMikgPj4KZW5kb2JqCnhyZWYKMCA1NQowMDAwMDAwMDAwIDY1NTM1IGYgCjAwMDAwMDAwMTYgMDAwMDAgbiAKMDAwMDAxNjQ1OCAwMDAwMCBuIAowMDAwMDE2MTgyIDAwMDAwIG4gCjAwMDAwMTYyMjUgMDAwMDAgbiAKMDAwMDAxNjM2NyAwMDAwMCBuIAowMDAwMDE2Mzg4IDAwMDAwIG4gCjAwMDAwMTY0MDkgMDAwMDAgbiAKMDAwMDAwMDA2NSAwMDAwMCBuIAowMDAwMDAwMzk2IDAwMDAwIG4gCjAwMDAwMDAyMDggMDAwMDAgbiAKMDAwMDAwMzkxOSAwMDAwMCBuIAowMDAwMDA1NjEzIDAwMDAwIG4gCjAwMDAwMDU0MDUgMDAwMDAgbiAKMDAwMDAwNTA2OSAwMDAwMCBuIAowMDAwMDA2NjY2IDAwMDAwIG4gCjAwMDAwMDM5NDAgMDAwMDAgbiAKMDAwMDAwNDM0NiAwMDAwMCBuIAowMDAwMDA0NzQ2IDAwMDAwIG4gCjAwMDAwMDQ5MDUgMDAwMDAgbiAKMDAwMDAxNDc2MCAwMDAwMCBuIAowMDAwMDE0NTYwIDAwMDAwIG4gCjAwMDAwMTQwNjcgMDAwMDAgbiAKMDAwMDAxNTgxMyAwMDAwMCBuIAowMDAwMDA2NzI4IDAwMDAwIG4gCjAwMDAwMDcxMDUgMDAwMDAgbiAKMDAwMDAwNzI0OCAwMDAwMCBuIAowMDAwMDA3Mzg3IDAwMDAwIG4gCjAwMDAwMDc1MjUgMDAwMDAgbiAKMDAwMDAwNzgyNSAwMDAwMCBuIAowMDAwMDA4MTQzIDAwMDAwIG4gCjAwMDAwMDg2MDggMDAwMDAgbiAKMDAwMDAwODkyOCAwMDAwMCBuIAowMDAwMDA5MDkwIDAwMDAwIG4gCjAwMDAwMDk1MDEgMDAwMDAgbiAKMDAwMDAwOTY0MSAwMDAwMCBuIAowMDAwMDA5Nzk0IDAwMDAwIG4gCjAwMDAwMDk5MTEgMDAwMDAgbiAKMDAwMDAxMDA4MSAwMDAwMCBuIAowMDAwMDEwMzE1IDAwMDAwIG4gCjAwMDAwMTA2MDIgMDAwMDAgbiAKMDAwMDAxMDc1NCAwMDAwMCBuIAowMDAwMDEwODc1IDAwMDAwIG4gCjAwMDAwMTExODUgMDAwMDAgbiAKMDAwMDAxMTQxNSAwMDAwMCBuIAowMDAwMDExODIwIDAwMDAwIG4gCjAwMDAwMTIyMTAgMDAwMDAgbiAKMDAwMDAxMjI5OSAwMDAwMCBuIAowMDAwMDEyNTAzIDAwMDAwIG4gCjAwMDAwMTI5MTQgMDAwMDAgbiAKMDAwMDAxMzIzNSAwMDAwMCBuIAowMDAwMDEzNDc5IDAwMDAwIG4gCjAwMDAwMTM2MzggMDAwMDAgbiAKMDAwMDAxMzc4NCAwMDAwMCBuIAowMDAwMDE2NTE4IDAwMDAwIG4gCnRyYWlsZXIKPDwgL0luZm8gNTQgMCBSIC9Sb290IDEgMCBSIC9TaXplIDU1ID4+CnN0YXJ0eHJlZgoxNjY3NQolJUVPRgo=\n", "image/svg+xml": [ "\n", "\n", "\n", "\n", " \n", " \n", " \n", " \n", " 2021-01-18T12:11:22.214481\n", " image/svg+xml\n", " \n", " \n", " Matplotlib v3.3.2, https://matplotlib.org/\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \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", "N = 1024 # length of signal\n", "\n", "# generate signal\n", "x = np.sin(2 * np.pi / N * np.arange(N))\n", "# quantize signal\n", "xi = np.round(3 * x)\n", "xQ = 1 / 3 * xi\n", "e = xQ - x\n", "\n", "# plot (quantized) signals\n", "fig, ax1 = plt.subplots(figsize=(10, 4))\n", "ax2 = ax1.twinx()\n", "\n", "ax1.plot(x, \"r\", label=r\"signal $x[k]$\")\n", "ax1.plot(xQ, \"b\", label=r\"quantized signal $x_Q[k]$\")\n", "ax1.plot(e, \"g\", label=r\"quantization error $e[k]$\")\n", "ax1.set_xlabel(\"k\")\n", "ax1.set_ylabel(r\"$x[k]$, $x_Q[k]$, $e[k]$\")\n", "ax1.axis([0, N, -1.2, 1.2])\n", "ax1.legend()\n", "\n", "ax2.set_ylim([-3.6, 3.6])\n", "ax2.set_ylabel(\"quantization index\")\n", "ax2.grid()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Exercise**\n", "\n", "* Investigate the quantization error $e[k]$. Is its amplitude bounded?\n", "* If you would represent the quantization index (shown on the right side) by a binary number, how much bits would you need?\n", "* Try out other rounding operations like `np.floor()` and `np.ceil()` instead of `np.round()`. What changes?\n", "\n", "Solution: It can be concluded from the illustration that the quantization error is bounded as $|e[k]| < \\frac{1}{3}$. There are in total 7 quantization indexes needing 3 bits in a binary representation. The properties of the quantization error are different for different rounding operations." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Properties\n", "\n", "Without knowledge of the quantization error $e[k]$, the signal $x[k]$ cannot be reconstructed exactly from its quantization index or quantized representation $x_Q[k]$. The quantization error $e[k]$ itself depends on the signal $x[k]$. Therefore, quantization is in general an irreversible process. The mapping from $x[k]$ to $x_Q[k]$ is furthermore non-linear, since the superposition principle does not hold in general. Summarizing, quantization is an inherently irreversible and non-linear process. It potentially removes information from the signal." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Applications\n", "\n", "Quantization has widespread applications in Digital Signal Processing. For instance\n", "\n", "* [Analog-to-Digital conversion](https://en.wikipedia.org/wiki/Analog-to-digital_converter)\n", "* [Lossy compression](https://en.wikipedia.org/wiki/Lossy_compression) of signals (speech, music, video, ...)\n", "* Storage and transmission ([Pulse-Code Modulation](https://en.wikipedia.org/wiki/Pulse-code_modulation), ...)" ] }, { "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": { "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.9" } }, "nbformat": 4, "nbformat_minor": 1 }