{ "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": [ "## Non-Linear Requantization of a Speech Signal\n", "\n", "Speech signals have a [non-uniform amplitude distribution](../random_signals/important_distributions.ipynb#Example) which is often modeled by the Laplace distribution. Linear uniform quantization is not optimal for speech signals, since small signal amplitudes are more likely than higher ones. This motivates a non-linear quantization scheme, where the signal is companded before linear quantization and expanded afterwards. \n", "\n", "The following example illustrates the [A-law quantization scheme](https://en.wikipedia.org/wiki/A-law_algorithm) used in European telephone networks. In this scheme the signal is first companded by the non-linear A-law characteristic before a linear uniform quantizer is used. This results overall in a non-linear quantization characteristic. First some functions for A-law companding/expanding, quantization and evaluation are defined." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import matplotlib.pyplot as plt\n", "import soundfile as sf\n", "\n", "\n", "def A_law_compander(x):\n", " \"\"\"Compand signal according to the A-law charateristic.\"\"\"\n", " A = 87.6\n", " y = np.zeros_like(x)\n", " idx = np.where(np.abs(x) < 1 / A)\n", " y[idx] = A * np.abs(x[idx]) / (1 + np.log(A))\n", " idx = np.where(np.abs(x) >= 1 / A)\n", " y[idx] = (1 + np.log(A * np.abs(x[idx]))) / (1 + np.log(A))\n", "\n", " return np.sign(x) * y\n", "\n", "\n", "def A_law_expander(y):\n", " \"\"\"Expand signal according to the A-law charateristic.\"\"\"\n", " A = 87.6\n", " x = np.zeros_like(y)\n", " idx = np.where(np.abs(y) < 1 / (1 + np.log(A)))\n", " x[idx] = np.abs(y[idx]) * (1 + np.log(A)) / A\n", " idx = np.where(np.abs(y) >= 1 / (1 + np.log(A)))\n", " x[idx] = np.exp(np.abs(y[idx]) * (1 + np.log(A)) - 1) / A\n", "\n", " return np.sign(y) * x\n", "\n", "\n", "def uniform_midtread_quantizer(x, w):\n", " \"\"\"Uniform mid-tread quantizer with limiter.\"\"\"\n", " # quantization step\n", " Q = 1 / (2 ** (w - 1))\n", " # limiter\n", " x = np.copy(x)\n", " idx = np.where(x <= -1)\n", " x[idx] = -1\n", " idx = np.where(x > 1 - Q)\n", " x[idx] = 1 - Q\n", " # linear uniform quantization\n", " xQ = Q * np.floor(x / Q + 1 / 2)\n", "\n", " return xQ\n", "\n", "\n", "def evaluate_requantization(x, xQ):\n", " \"\"\"Compute error and SNR of requantization.\"\"\"\n", " e = xQ - x\n", " # SNR\n", " SNR = 10 * np.log10(np.var(x) / np.var(e))\n", " print(\"SNR: {:2.1f} dB\".format(SNR))\n", " # normalize error\n", " e = 0.2 * e / np.max(np.abs(e))\n", " return e" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Quantization Characteristic\n", "\n", "Lets first take a look at the non-linear characteristic of the A-law requantizer. The left plot shows the characteristic of the A-law companding and linear-quantization. The right plot shows the overall characteristic for companding, linear quantization and expansion. " ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "application/pdf": "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NjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgMzE4IDQwMSA0NjAgODM4IDYzNgo5NTAgNzgwIDI3NSAzOTAgMzkwIDUwMCA4MzggMzE4IDM2MSAzMTggMzM3IDYzNiA2MzYgNjM2IDYzNiA2MzYgNjM2IDYzNiA2MzYKNjM2IDYzNiAzMzcgMzM3IDgzOCA4MzggODM4IDUzMSAxMDAwIDY4NCA2ODYgNjk4IDc3MCA2MzIgNTc1IDc3NSA3NTIgMjk1CjI5NSA2NTYgNTU3IDg2MyA3NDggNzg3IDYwMyA3ODcgNjk1IDYzNSA2MTEgNzMyIDY4NCA5ODkgNjg1IDYxMSA2ODUgMzkwIDMzNwozOTAgODM4IDUwMCA1MDAgNjEzIDYzNSA1NTAgNjM1IDYxNSAzNTIgNjM1IDYzNCAyNzggMjc4IDU3OSAyNzggOTc0IDYzNCA2MTIKNjM1IDYzNSA0MTEgNTIxIDM5MiA2MzQgNTkyIDgxOCA1OTIgNTkyIDUyNSA2MzYgMzM3IDYzNiA4MzggNjAwIDYzNiA2MDAgMzE4CjM1MiA1MTggMTAwMCA1MDAgNTAwIDUwMCAxMzUwIDYzNSA0MDAgMTA3MCA2MDAgNjg1IDYwMCA2MDAgMzE4IDMxOCA1MTggNTE4CjU5MCA1MDAgMTAwMCA1MDAgMTAwMCA1MjEgNDAwIDEwMjggNjAwIDUyNSA2MTEgMzE4IDQwMSA2MzYgNjM2IDYzNiA2MzYgMzM3CjUwMCA1MDAgMTAwMCA0NzEgNjE3IDgzOCAzNjEgMTAwMCA1MDAgNTAwIDgzOCA0MDEgNDAxIDUwMCA2MzYgNjM2IDMxOCA1MDAKNDAxIDQ3MSA2MTcgOTY5IDk2OSA5NjkgNTMxIDY4NCA2ODQgNjg0IDY4NCA2ODQgNjg0IDk3NCA2OTggNjMyIDYzMiA2MzIgNjMyCjI5NSAyOTUgMjk1IDI5NSA3NzUgNzQ4IDc4NyA3ODcgNzg3IDc4NyA3ODcgODM4IDc4NyA3MzIgNzMyIDczMiA3MzIgNjExIDYwOAo2MzAgNjEzIDYxMyA2MTMgNjEzIDYxMyA2MTMgOTk1IDU1MCA2MTUgNjE1IDYxNSA2MTUgMjc4IDI3OCAyNzggMjc4IDYxMiA2MzQKNjEyIDYxMiA2MTIgNjEyIDYxMiA4MzggNjEy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bmRvYmoKMTkgMCBvYmoKWyA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMAo2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDMxOCA0MDEgNDYwIDgzOCA2MzYKOTUwIDc4MCAyNzUgMzkwIDM5MCA1MDAgODM4IDMxOCAzNjEgMzE4IDMzNyA2MzYgNjM2IDYzNiA2MzYgNjM2IDYzNiA2MzYgNjM2CjYzNiA2MzYgMzM3IDMzNyA4MzggODM4IDgzOCA1MzEgMTAwMCA2ODQgNjg2IDY5OCA3NzAgNjMyIDU3NSA3NzUgNzUyIDI5NQoyOTUgNjU2IDU1NyA4NjMgNzQ4IDc4NyA2MDMgNzg3IDY5NSA2MzUgNjExIDczMiA2ODQgOTg5IDY4NSA2MTEgNjg1IDM5MCAzMzcKMzkwIDgzOCA1MDAgNTAwIDYxMyA2MzUgNTUwIDYzNSA2MTUgMzUyIDYzNSA2MzQgMjc4IDI3OCA1NzkgMjc4IDk3NCA2MzQgNjEyCjYzNSA2MzUgNDExIDUyMSAzOTIgNjM0IDU5MiA4MTggNTkyIDU5MiA1MjUgNjM2IDMzNyA2MzYgODM4IDYwMCA2MzYgNjAwIDMxOAozNTIgNTE4IDEwMDAgNTAwIDUwMCA1MDAgMTM0MiA2MzUgNDAwIDEwNzAgNjAwIDY4NSA2MDAgNjAwIDMxOCAzMTggNTE4IDUxOAo1OTAgNTAwIDEwMDAgNTAwIDEwMDAgNTIxIDQwMCAxMDIzIDYwMCA1MjUgNjExIDMxOCA0MDEgNjM2IDYzNiA2MzYgNjM2IDMzNwo1MDAgNTAwIDEwMDAgNDcxIDYxMiA4MzggMzYxIDEwMDAgNTAwIDUwMCA4MzggNDAxIDQwMSA1MDAgNjM2IDYzNiAzMTggNTAwCjQwMSA0NzEgNjEyIDk2OSA5NjkgOTY5IDUzMSA2ODQgNjg0IDY4NCA2ODQgNjg0IDY4NCA5NzQgNjk4IDYzMiA2MzIgNjMyIDYzMgoyOTUgMjk1IDI5NSAyOTUgNzc1IDc0OCA3ODcgNzg3IDc4NyA3ODcgNzg3IDgzOCA3ODcgNzMyIDczMiA3MzIgNzMyIDYxMSA2MDUKNjMwIDYxMyA2MTMgNjEzIDYxMyA2MTMgNjEzIDk4MiA1NTAgNjE1IDYxNSA2MTUgNjE1IDI3OCAyNzggMjc4IDI3OCA2MTIgNjM0CjYxMiA2MTIgNjEyIDYxMiA2MTIgODM4IDYxMiA2MzQgNjM0IDYzNCA2MzQgNTkyIDYzNSA1OTIgXQplbmRvYmoKMjIgMCBvYmoKPDwgL0MgMjMgMCBSIC9PIDI0IDAgUiAvYSAyNSAwIFIgL2IgMjYgMCBSIC9kIDI3IDAgUiAvZSAyOCAwIFIKL2VpZ2h0IDI5IDAgUiAvZXF1YWwgMzAgMCBSIC9maXZlIDMxIDAgUiAvZm91ciAzMiAwIFIgL2kgMzMgMCBSIC9sIDM0IDAgUgovbSAzNSAwIFIgL24gMzcgMCBSIC9vIDM4IDAgUiAvb25lIDM5IDAgUiAvcCA0MCAwIFIgL3BlcmlvZCA0MSAwIFIKL3EgNDIgMCBSIC9yIDQzIDAgUiAvcyA0NCAwIFIgL3NldmVuIDQ1IDAgUiAvc3BhY2UgNDYgMCBSIC90IDQ3IDAgUgovdHdvIDQ4IDAgUiAvdSA0OSAwIFIgL3YgNTAgMCBSIC96IDUxIDAgUiAvemVybyA1MiAwIFIgPj4KZW5kb2JqCjMgMCBvYmoKPDwgL0YxIDIxIDAgUiAvRjIgMTQgMCBSID4+CmVuZG9iago0IDAgb2JqCjw8IC9BMSA8PCAvQ0EgMCAvVHlwZSAvRXh0R1N0YXRlIC9jYSAxID4+Ci9BMiA8PCAvQ0EgMSAvVHlwZSAvRXh0R1N0YXRlIC9jYSAxID4+Ci9BMyA8PCAvQ0EgMC44IC9UeXBlIC9FeHRHU3RhdGUgL2NhIDAuOCA+PiA+PgplbmRvYmoKNSAwIG9iago8PCA+PgplbmRvYmoKNiAwIG9iago8PCA+PgplbmRvYmoKNyAwIG9iago8PCAvRjEtRGVqYVZ1U2Fucy1taW51cyAzNiAwIFIgPj4KZW5kb2JqCjIgMCBvYmoKPDwgL0NvdW50IDEgL0tpZHMgWyAxMCAwIFIgXSAvVHlwZSAvUGFnZXMgPj4KZW5kb2JqCjUzIDAgb2JqCjw8IC9DcmVhdGlvbkRhdGUgKEQ6MjAyMTAxMTgxMjMwNDcrMDInMDAnKQovQ3JlYXRvciAoTWF0cGxvdGxpYiB2My4zLjIsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcpCi9Qcm9kdWNlciAoTWF0cGxvdGxpYiBwZGYgYmFja2VuZCB2My4zLjIpID4+CmVuZG9iagp4cmVmCjAgNTQKMDAwMDAwMDAwMCA2NTUzNSBmIAowMDAwMDAwMDE2IDAwMDAwIG4gCjAwMDAwMjE0ODEgMDAwMDAgbiAKMDAwMDAyMTIwNSAwMDAwMCBuIAowMDAwMDIxMjQ4IDAwMDAwIG4gCjAwMDAwMjEzOTAgMDAwMDAgbiAKMDAwMDAyMTQxMSAwMDAwMCBuIAowMDAwMDIxNDMyIDAwMDAwIG4gCjAwMDAwMDAwNjUgMDAwMDAgbiAKMDAwMDAwMDM5NiAwMDAwMCBuIAowMDAwMDAwMjA4IDAwMDAwIG4gCjAwMDAwMDk0MDAgMDAwMDAgbiAKMDAwMDAxMDY4NSAwMDAwMCBuIAowMDAwMDEwNDc3IDAwMDAwIG4gCjAwMDAwMTAxNTIgMDAwMDAgbiAKMDAwMDAxMTczOCAwMDAwMCBuIAowMDAwMDA5NDIxIDAwMDAwIG4gCjAwMDAwMDk4MjcgMDAwMDAgbiAKMDAwMDAwOTk4OCAwMDAwMCBuIAowMDAwMDE5ODA2IDAwMDAwIG4gCjAwMDAwMTk2MDYgMDAwMDAgbiAKMDAwMDAxOTE0OSAwMDAwMCBuIAowMDAwMDIwODU5IDAwMDAwIG4gCjAwMDAwMTE3OTAgMDAwMDAgbiAKMDAwMDAxMjA5NSAwMDAwMCBuIAowMDAwMDEyMzgwIDAwMDAwIG4gCjAwMDAwMTI3NTcgMDAwMDAgbiAKMDAwMDAxMzA2NyAwMDAwMCBuIAowMDAwMDEzMzY3IDAwMDAwIG4gCjAwMDAwMTM2ODUgMDAwMDAgbiAKMDAwMDAxNDE1MCAwMDAwMCBuIAowMDAwMDE0MjkzIDAwMDAwIG4gCjAwMDAwMTQ2MTMgMDAwMDAgbiAKMDAwMDAxNDc3NSAwMDAwMCBuIAowMDAwMDE0OTE1IDAwMDAwIG4gCjAwMDAwMTUwMzIgMDAwMDAgbiAKMDAwMDAxNTM2MCAwMDAwMCBuIAowMDAwMDE1NTMwIDAwMDAwIG4gCjAwMDAwMTU3NjQgMDAwMDAgbiAKMDAwMDAxNjA1MSAwMDAwMCBuIAowMDAwMDE2MjAzIDAwMDAwIG4gCjAwMDAwMTY1MTIgMDAwMDAgbiAKMDAwMDAxNjYzMyAwMDAwMCBuIAowMDAwMDE2OTQzIDAwMDAwIG4gCjAwMDAwMTcxNzMgMDAwMDAgbiAKMDAwMDAxNzU3OCAwMDAwMCBuIAowMDAwMDE3NzE4IDAwMDAwIG4gCjAwMDAwMTc4MDcgMDAwMDAgbiAKMDAwMDAxODAxMSAwMDAwMCBuIAowMDAwMDE4MzMyIDAwMDAwIG4gCjAwMDAwMTg1NzYgMDAwMDAgbiAKMDAwMDAxODcyMCAwMDAwMCBuIAowMDAwMDE4ODY2IDAwMDAwIG4gCjAwMDAwMjE1NDEgMDAwMDAgbiAKdHJhaWxlcgo8PCAvSW5mbyA1MyAwIFIgL1Jvb3QgMSAwIFIgL1NpemUgNTQgPj4Kc3RhcnR4cmVmCjIxNjk4CiUlRU9GCg==\n", "image/svg+xml": [ "\n", "\n", "\n", "\n", " \n", " \n", " \n", " \n", " 2021-01-18T12:30:46.816009\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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \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": [ "x = np.linspace(-1, 1, 2**16)\n", "y = A_law_compander(x)\n", "yQ4 = uniform_midtread_quantizer(y, 4)\n", "yQ8 = uniform_midtread_quantizer(y, 8)\n", "xQ4 = A_law_expander(yQ4)\n", "xQ8 = A_law_expander(yQ8)\n", "\n", "plt.figure(figsize=(10, 4))\n", "\n", "plt.subplot(121)\n", "plt.plot(x, yQ4, label=r\"$w=4$ bit\")\n", "plt.plot(x, yQ8, label=r\"$w=8$ bit\")\n", "plt.title(\"Compansion and linear quantization\")\n", "plt.xlabel(r\"$x$\")\n", "plt.ylabel(r\"$x_Q$\")\n", "plt.legend(loc=2)\n", "plt.axis([-1.1, 1.1, -1.1, 1.1])\n", "plt.grid()\n", "\n", "plt.subplot(122)\n", "plt.plot(x, xQ4, label=r\"$w=4$ bit\")\n", "plt.plot(x, xQ8, label=r\"$w=8$ bit\")\n", "plt.title(\"Overall\")\n", "plt.xlabel(r\"$x$\")\n", "plt.ylabel(r\"$x_Q$\")\n", "plt.legend(loc=2)\n", "plt.axis([-1.1, 1.1, -1.1, 1.1])\n", "plt.grid()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Signal-to-Noise Ratio\n", "\n", "Now the signal-to-noise ratio (SNR) is computed for a Laplace distributed signal for various RMS levels $\\sigma_x / x_\\mathrm{min}$. The results show that the non-linear quantization scheme provides a constant SNR over a wide range of levels. The SNR is additional higher as for [linear quantization](../quantization/linear_uniform_quantization_error.ipynb#Example) of a Laplace distributed signal." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "application/pdf": "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dCA5MjkgL0NhcEhlaWdodCAwIC9EZXNjZW50IC0yMzYgL0ZsYWdzIDk2Ci9Gb250QkJveCBbIC0xMDE2IC0zNTEgMTY2MCAxMDY4IF0gL0ZvbnROYW1lIC9EZWphVnVTYW5zLU9ibGlxdWUKL0l0YWxpY0FuZ2xlIDAgL01heFdpZHRoIDEzNTAgL1N0ZW1WIDAgL1R5cGUgL0ZvbnREZXNjcmlwdG9yIC9YSGVpZ2h0IDAgPj4KZW5kb2JqCjEyIDAgb2JqClsgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAKNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCAzMTggNDAxIDQ2MCA4MzggNjM2Cjk1MCA3ODAgMjc1IDM5MCAzOTAgNTAwIDgzOCAzMTggMzYxIDMxOCAzMzcgNjM2IDYzNiA2MzYgNjM2IDYzNiA2MzYgNjM2IDYzNgo2MzYgNjM2IDMzNyAzMzcgODM4IDgzOCA4MzggNTMxIDEwMDAgNjg0IDY4NiA2OTggNzcwIDYzMiA1NzUgNzc1IDc1MiAyOTUKMjk1IDY1NiA1NTcgODYzIDc0OCA3ODcgNjAzIDc4NyA2OTUgNjM1IDYxMSA3MzIgNjg0IDk4OSA2ODUgNjExIDY4NSAzOTAgMzM3CjM5MCA4MzggNTAwIDUwMCA2MTMgNjM1IDU1MCA2MzUgNjE1IDM1MiA2MzUgNjM0IDI3OCAyNzggNTc5IDI3OCA5NzQgNjM0IDYxMgo2MzUgNjM1IDQxMSA1MjEgMzkyIDYzNCA1OTIgODE4IDU5MiA1OTIgNTI1IDYzNiAzMzcgNjM2IDgzOCA2MDAgNjM2IDYwMCAzMTgKMzUyIDUxOCAxMDAwIDUwMCA1MDAgNTAwIDEzNTAgNjM1IDQwMCAxMDcwIDYwMCA2ODUgNjAwIDYwMCAzMTggMzE4IDUxOCA1MTgKNTkwIDUwMCAxMDAwIDUwMCAxMDAwIDUyMSA0MDAgMTAyOCA2MDAgNTI1IDYxMSAzMTggNDAxIDYzNiA2MzYgNjM2IDYzNiAzMzcKNTAwIDUwMCAxMDAwIDQ3MSA2MTcgODM4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NjAwIDYwMAo2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDMxOCA0MDEgNDYwIDgzOCA2MzYKOTUwIDc4MCAyNzUgMzkwIDM5MCA1MDAgODM4IDMxOCAzNjEgMzE4IDMzNyA2MzYgNjM2IDYzNiA2MzYgNjM2IDYzNiA2MzYgNjM2CjYzNiA2MzYgMzM3IDMzNyA4MzggODM4IDgzOCA1MzEgMTAwMCA2ODQgNjg2IDY5OCA3NzAgNjMyIDU3NSA3NzUgNzUyIDI5NQoyOTUgNjU2IDU1NyA4NjMgNzQ4IDc4NyA2MDMgNzg3IDY5NSA2MzUgNjExIDczMiA2ODQgOTg5IDY4NSA2MTEgNjg1IDM5MCAzMzcKMzkwIDgzOCA1MDAgNTAwIDYxMyA2MzUgNTUwIDYzNSA2MTUgMzUyIDYzNSA2MzQgMjc4IDI3OCA1NzkgMjc4IDk3NCA2MzQgNjEyCjYzNSA2MzUgNDExIDUyMSAzOTIgNjM0IDU5MiA4MTggNTkyIDU5MiA1MjUgNjM2IDMzNyA2MzYgODM4IDYwMCA2MzYgNjAwIDMxOAozNTIgNTE4IDEwMDAgNTAwIDUwMCA1MDAgMTM0MiA2MzUgNDAwIDEwNzAgNjAwIDY4NSA2MDAgNjAwIDMxOCAzMTggNTE4IDUxOAo1OTAgNTAwIDEwMDAgNTAwIDEwMDAgNTIxIDQwMCAxMDIzIDYwMCA1MjUgNjExIDMxOCA0MDEgNjM2IDYzNiA2MzYgNjM2IDMzNwo1MDAgNTAwIDEwMDAgNDcxIDYxMiA4MzggMzYxIDEwMDAgNTAwIDUwMCA4MzggNDAxIDQwMSA1MDAgNjM2IDYzNiAzMTggNTAwCjQwMSA0NzEgNjEyIDk2OSA5NjkgOTY5IDUzMSA2ODQgNjg0IDY4NCA2ODQgNjg0IDY4NCA5NzQgNjk4IDYzMiA2MzIgNjMyIDYzMgoyOTUgMjk1IDI5NSAyOTUgNzc1IDc0OCA3ODcgNzg3IDc4NyA3ODcgNzg3IDgzOCA3ODcgNzMyIDczMiA3MzIgNzMyIDYxMSA2MDUKNjMwIDYxMyA2MTMgNjEzIDYxMyA2MTMgNjEzIDk4MiA1NTAgNjE1IDYxNSA2MTUgNjE1IDI3OCAyNzggMjc4IDI3OCA2MTIgNjM0CjYxMiA2MTIgNjEyIDYxMiA2MTIgODM4IDYxMiA2MzQgNjM0IDYzNCA2MzQgNTkyIDYzNSA1OTIgXQplbmRvYmoKMjEgMCBvYmoKPDwgL0IgMjIgMCBSIC9NIDIzIDAgUiAvTiAyNCAwIFIgL1IgMjUgMCBSIC9TIDI2IDAgUiAvZCAyNyAwIFIgL2UgMjggMCBSCi9maXZlIDI5IDAgUiAvZm91ciAzMCAwIFIgL2kgMzEgMCBSIC9sIDMyIDAgUiAvbSAzMyAwIFIgL24gMzUgMCBSCi9vbmUgMzYgMCBSIC9wZXJpb2QgMzcgMCBSIC9zZXZlbiAzOCAwIFIgL3NsYXNoIDM5IDAgUiAvc3BhY2UgNDAgMCBSCi90aHJlZSA0MSAwIFIgL3R3byA0MiAwIFIgL3YgNDMgMCBSIC96ZXJvIDQ0IDAgUiA+PgplbmRvYmoKMyAwIG9iago8PCAvRjEgMjAgMCBSIC9GMiAxNCAwIFIgPj4KZW5kb2JqCjQgMCBvYmoKPDwgL0ExIDw8IC9DQSAwIC9UeXBlIC9FeHRHU3RhdGUgL2NhIDEgPj4KL0EyIDw8IC9DQSAxIC9UeXBlIC9FeHRHU3RhdGUgL2NhIDEgPj4gPj4KZW5kb2JqCjUgMCBvYmoKPDwgPj4KZW5kb2JqCjYgMCBvYmoKPDwgPj4KZW5kb2JqCjcgMCBvYmoKPDwgL0YxLURlamFWdVNhbnMtbWludXMgMzQgMCBSIC9GMi1EZWphVnVTYW5zLU9ibGlxdWUtc2lnbWEgMTYgMCBSID4+CmVuZG9iagoyIDAgb2JqCjw8IC9Db3VudCAxIC9LaWRzIFsgMTAgMCBSIF0gL1R5cGUgL1BhZ2VzID4+CmVuZG9iago0NSAwIG9iago8PCAvQ3JlYXRpb25EYXRlIChEOjIwMjEwMTE4MTIzMTI5KzAyJzAwJykKL0NyZWF0b3IgKE1hdHBsb3RsaWIgdjMuMy4yLCBodHRwczovL21hdHBsb3RsaWIub3JnKQovUHJvZHVjZXIgKE1hdHBsb3RsaWIgcGRmIGJhY2tlbmQgdjMuMy4yKSA+PgplbmRvYmoKeHJlZgowIDQ2CjAwMDAwMDAwMDAgNjU1MzUgZiAKMDAwMDAwMDAxNiAwMDAwMCBuIAowMDAwMDE1MDIzIDAwMDAwIG4gCjAwMDAwMTQ3NTQgMDAwMDAgbiAKMDAwMDAxNDc5NyAwMDAwMCBuIAowMDAwMDE0ODk2IDAwMDAwIG4gCjAwMDAwMTQ5MTcgMDAwMDAgbiAKMDAwMDAxNDkzOCAwMDAwMCBuIAowMDAwMDAwMDY1IDAwMDAwIG4gCjAwMDAwMDAzOTcgMDAwMDAgbiAKMDAwMDAwMDIwOCAwMDAwMCBuIAowMDAwMDA1NDI5IDAwMDAwIG4gCjAwMDAwMDY0OTAgMDAwMDAgbiAKMDAwMDAwNjI4MiAwMDAwMCBuIAowMDAwMDA1OTY2IDAwMDAwIG4gCjAwMDAwMDc1NDMgMDAwMDAgbiAKMDAwMDAwNTQ1MCAwMDAwMCBuIAowMDAwMDA1ODAyIDAwMDAwIG4gCjAwMDAwMTM0MjUgMDAwMDAgbiAKMDAwMDAxMzIyNSAwMDAwMCBuIAowMDAwMDEyNzk4IDAwMDAwIG4gCjAwMDAwMTQ0NzggMDAwMDAgbiAKMDAwMDAwNzU3NSAwMDAwMCBuIAowMDAwMDA3OTA3IDAwMDAwIG4gCjAwMDAwMDgwNjYgMDAwMDAgbiAKMDAwMDAwODIxMyAwMDAwMCBuIAowMDAwMDA4NTEzIDAwMDAwIG4gCjAwMDAwMDg5MjQgMDAwMDAgbiAKMDAwMDAwOTIyNCAwMDAwMCBuIAowMDAwMDA5NTQyIDAwMDAwIG4gCjAwMDAwMDk4NjIgMDAwMDAgbiAKMDAwMDAxMDAyNCAwMDAwMCBuIAowMDAwMDEwMTY0IDAwMDAwIG4gCjAwMDAwMTAyODEgMDAwMDAgbiAKMDAwMDAxMDYwOSAwMDAwMCBuIAowMDAwMDEwNzc5IDAwMDAwIG4gCjAwMDAwMTEwMTMgMDAwMDAgbiAKMDAwMDAxMTE2NSAwMDAwMCBuIAowMDAwMDExMjg2IDAwMDAwIG4gCjAwMDAwMTE0MjYgMDAwMDAgbiAKMDAwMDAxMTU1MCAwMDAwMCBuIAowMDAwMDExNjM5IDAwMDAwIG4gCjAwMDAwMTIwNTAgMDAwMDAgbiAKMDAwMDAxMjM3MSAwMDAwMCBuIAowMDAwMDEyNTE1IDAwMDAwIG4gCjAwMDAwMTUwODMgMDAwMDAgbiAKdHJhaWxlcgo8PCAvSW5mbyA0NSAwIFIgL1Jvb3QgMSAwIFIgL1NpemUgNDYgPj4Kc3RhcnR4cmVmCjE1MjQwCiUlRU9GCg==\n", "image/svg+xml": [ "\n", "\n", "\n", "\n", " \n", " \n", " \n", " \n", " 2021-01-18T12:31:29.015387\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" ], "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "w = 8 # wordlength of the quantizer\n", "A = np.logspace(-50 / 20, -10 / 20, num=500) # relative RMS levels\n", "N = int(1e6) # number of samples\n", "np.random.seed(1)\n", "\n", "\n", "def compute_SNR(a):\n", " # compute input signal\n", " x = np.random.laplace(size=N, scale=a / np.sqrt(2))\n", " # quantize signal\n", " y = A_law_compander(x)\n", " yQ = uniform_midtread_quantizer(y, 8)\n", " xQ = A_law_expander(yQ)\n", " e = xQ - x\n", " # compute SNR\n", " SNR = 10 * np.log10((np.var(x) / np.var(e)))\n", "\n", " return SNR\n", "\n", "\n", "# quantization step\n", "Q = 1 / (2 ** (w - 1))\n", "# compute SNR for given RMS levels\n", "SNR = [compute_SNR(a) for a in A]\n", "\n", "# plot results\n", "plt.figure(figsize=(8, 4))\n", "plt.plot(20 * np.log10(A), SNR)\n", "plt.xlabel(r\"RMS level $\\sigma_x / x_\\mathrm{min}$ in dB\")\n", "plt.ylabel(\"SNR in dB\")\n", "plt.grid()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Requantization of a Speech Sample\n", "\n", "Finally we requantize a speech sample with a linear and the A-law quantization scheme. The speech signal was originally recorded with a wordlength of $w=16$ bits using linear uniform quantization. First the A-law compansion is applied, then quantization by a linear uniform quantizer with a wordlength of $w=8$ bits. This scheme is used in the backbone of many telephone networks resulting in a total bit-rate of 64 kbits/s. Listen to the samples! Note, the quantization error has been normalized." ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "SNR: 35.7 dB\n", "SNR: 38.2 dB\n" ] } ], "source": [ "# load speech sample\n", "x, fs = sf.read(\"../data/speech_8k.wav\")\n", "x = x / np.max(np.abs(x))\n", "\n", "# linear quantization\n", "xQ = uniform_midtread_quantizer(x, 8)\n", "e = evaluate_requantization(x, xQ)\n", "sf.write(\"speech_8k_8bit.wav\", xQ, fs)\n", "sf.write(\"speech_8k_8bit_error.wav\", e, fs)\n", "\n", "# A-law quantization\n", "y = A_law_compander(x)\n", "yQ = uniform_midtread_quantizer(y, 8)\n", "xQ = A_law_expander(yQ)\n", "e = evaluate_requantization(x, xQ)\n", "sf.write(\"speech_Alaw_8k_8bit.wav\", xQ, fs)\n", "sf.write(\"speech_Alaw_8k_8bit_error.wav\", e, fs)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Original Signal**\n", "\n", "\n", "[../data/speech_8k.wav](../data/speech.wav)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Linear Requantization to $w=8$ bit** \n", "\n", "Signal\n", "\n", "\n", "[speech_8k_8bit.wav](speech_8k_8bit.wav)\n", "\n", "Error\n", "\n", "\n", "[speech_8k_8bit_error.wav](speech_8k_8bit_error.wav)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**A-law Requantization to $w=8$ bit**\n", "\n", "Signal\n", "\n", "\n", "[speech_Alaw_8k_8bit.wav](speech_Alaw_8k_8bit.wav)\n", "\n", "Error\n", "\n", "\n", "[speech_Alaw_8k_8bit_error.wav](speech_Alaw_8k_8bit_error.wav)" ] }, { "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 }