Source code for deltasigma._ds_quantize
# -*- coding: utf-8 -*-
# _ds_quantize.py
# This module provides the ds_quantize function.
# Copyright 2013 Giuseppe Venturini
# This file is part of python-deltasigma.
#
# python-deltasigma is a 1:1 Python replacement of Richard Schreier's
# MATLAB delta sigma toolbox (aka "delsigma"), upon which it is heavily based.
# The delta sigma toolbox is (c) 2009, Richard Schreier.
#
# python-deltasigma is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# LICENSE file for the licensing terms.
"""This module provides the ds_quantize() function, used to quantize signals
according to a user-specified quantizer characteristic.
"""
import numpy as np
[docs]def ds_quantize(y, n=2):
"""Quantize ``y``
Quantize a vector :math:`y` to:
* an odd integer in :math:`[-n+1, n-1]`, if :math:`n` is even, or
* an even integer in :math:`[-n+1, n-1]`, if :math:`n` is odd.
The quantizer implementation details are repeated here from its
documentation for the user's convenience:
The quantizer is ideal, producing integer outputs centered
about zero. Quantizers with an even number of levels are of
the mid-rise type and produce outputs which are odd integers.
Quantizers with an odd number of levels are of the mid-tread
type and produce outputs which are even integers.
This definition gives the same step height for both mid-rise
and mid-tread quantizers.
.. image:: ../doc/_static/quantizer_model.png
:align: center
:alt: Quantizer model
**Parameters:**
n : int or ndarray, optional
The number of levels in the quantizer. If ``n`` is an integer,
then all rows of y are fed to the same quantizer.
If ``n`` is a column vector, each of its elements specifies
how to quantize the rows of ``y``.
**Returns:**
v : ndarray
The quantized vector.
.. seealso::
:func:`bquantize`, :func:`bunquantize`
"""
assert (np.round(n, 0) == n).all() # did we get an int or an array of int?
if not isinstance(n, np.ndarray):
n = n * np.ones(y.shape) # we got an int
else:
assert len(n.shape) == 1 or 1 in n.shape
n = (np.ones((max(n.shape), y.shape[1])).T * n).T
i = (n % 2 == 0)
v = np.zeros(y.shape)
v[i] = 2 * np.floor(0.5 * y[i]) + 1 # mid-rise quantizer
v[~i] = 2 * np.floor(0.5 * (y[~i] + 1)) # mid-tread quantizer
# Limit the output
L = n - 1
for m in (-1, 1):
i = (m * v > L)
if i.any():
v[i] = m * L[i]
return v