La cuantización vectorial piramidal ( PVQ ) es un método utilizado en códecs de audio y vídeo para cuantizar y transmitir vectores unitarios , es decir, vectores cuyas magnitudes son conocidas por el decodificador, pero cuyas direcciones son desconocidas. La PVQ también puede utilizarse como parte de un esquema de cuantización de ganancia/forma , en el que la magnitud y la dirección de un vector se cuantizan por separado. La PVQ fue descrita inicialmente en 1986 en el artículo "A Pyramid Vector Quantizer" de Thomas R. Fischer. [ 1 ]

Una advertencia de PVQ es que opera bajo la distancia de taxi (norma L1). La conversión a/desde la distancia euclidiana más familiar (norma L2) es posible mediante proyección vectorial , aunque resulta en una distribución menos uniforme de los puntos de cuantización (los polos de la n- esfera euclidiana se vuelven más densos que los no polos). [ 3 ] No se conoce ningún algoritmo eficiente para la cuantización vectorial ideal (es decir, uniforme) de la n- esfera euclidiana hasta 2010. [ 4 ] Esta falta de uniformidad puede reducirse aplicando una deformación como potencia por coordenadas antes de la proyección, reduciendo el error cuadrático medio de cuantización en ~10%. [ 2 ]
PVQ se utiliza en el códec de audio CELT (heredado en Opus ) y en el códec de vídeo Daala .
Descripción general
Como una forma de cuantización vectorial , PVQ define un libro de códigos de M puntos de cuantización, a cada uno de los cuales se le asigna una palabra clave entera del 0 al M − 1. El objetivo del codificador es encontrar la palabra clave del vector más cercano, que el decodificador debe decodificar de nuevo en un vector.
El libro de códigos PVQ consta de todos los puntos N -dimensionales.con coordenadas enteras cuyos valores absolutos suman una constante K (es decir, cuya norma L1 es igual a K ). En notación de construcción de conjuntos :
dóndedenota la norma L1 de.
Tal como está, el conjunto S tesela la superficie de una pirámide N- dimensional. Si se desea, podemos transformarlo en una esfera "proyectando" los puntos sobre ella, es decir, normalizándolos :
dóndedenota la norma L2 de.
Al aumentar el parámetro K se obtienen más puntos de cuantización y, por lo tanto, generalmente se consigue una aproximación más "precisa" del vector unitario original.a costa de utilizar palabras clave enteras más largas que requieren más bits para su transmisión.
Ejemplo
Supongamos que deseamos cuantificar vectores unitarios tridimensionales utilizando el parámetro K = 2. Nuestro libro de códigos queda así:
(0,707 =redondeado a 3 decimales.)
Ahora bien, supongamos que deseamos transmitir el vector unitario <0,592, −0,720 , 0,362> (redondeado aquí a 3 decimales para mayor claridad). Según nuestro libro de códigos, el punto más cercano que podemos elegir es la palabra clave 13 (<0,707, −0,707 , 0,000>), ubicada aproximadamente a 0,381 unidades de nuestro punto original.
Al aumentar el parámetro K, se obtiene un diccionario de códigos más grande, lo que generalmente incrementa la precisión de la reconstrucción. Por ejemplo, según el código Python que se muestra a continuación, K = 5 (tamaño del diccionario de códigos: 102) produce un error de solo 0,097 unidades, y K = 20 (tamaño del diccionario de códigos: 1602) produce un error de solo 0,042 unidades.
Código Python
import itertools import math from typing import NamedTupleclase PVQEntry ( NamedTuple ): codeword : int point : tuple [ int , ... ] normalizedPoint : tuple [ float , ... ]def create_pvq_codebook ( n : int , k : int ) -> list [ PVQEntry ]: """ Algoritmo ingenuo para generar un libro de códigos PVQ n-dimensional con k pulsos. Complejidad de tiempo de ejecución: O(k**n) """ ret = [] for p in itertools . product ( range ( - k , k + 1 ), repeat = n ): if sum ( abs ( x ) for x in p ) == k : norm = math . sqrt ( sum ( x ** 2 for x in p )) q = tuple ( x / norm for x in p ) ret . append ( PVQEntry ( len ( ret ), p , q ))regresardef search_pvq_codebook ( codebook : list [ PVQEntry ], p : tuple [ float , ... ] ) -> tuple [ PVQEntry , float ]: """ Algoritmo ingenuo para buscar en el libro de códigos PVQ. Devuelve el punto en el libro de códigos que está "más cerca" de p, según la distancia euclidiana.) """ ret = None min_dist = None for entry in codebook : q = entry . normalizedPoint dist = math . sqrt ( sum (( q [ j ] - p [ j ]) ** 2 for j in range ( len ( p )))) if min_dist is None or dist < min_dist : ret = entry min_dist = distdevolver ret , min_distdef example ( p : tuple [ float , ... ], k : int ) -> None : n = len ( p ) codebook = create_pvq_codebook ( n , k ) print ( "Número de entradas del libro de códigos: " + str ( len ( codebook ))) entry , dist = search_pvq_codebook ( codebook , p ) print ( "Mejor entrada: " + str ( entry )) print ( "Distancia: " + str ( dist ))phi = 1.2 theta = 5.4 x = math.sin ( phi ) * math.cos ( theta ) y = math.sin ( phi ) * math.sin ( theta ) z = math.cos ( phi ) p = ( x , y , z ) example ( p , 2 ) example ( p , 5 ) example ( p , 20 )Complejidad
El libro de códigos PVQ se puede buscar en. [ 4 ] La codificación y decodificación también se pueden realizar enusandomemoria. [ 5 ]
El tamaño del libro de códigos obedece la recurrencia [ 4 ]
cona pesar deya pesar de.
Una solución en forma cerrada viene dada por [ 6 ].
dóndees la función hipergeométrica .
Véase también
Referencias
- ↑ Fischer, Thomas R. (julio de 1986). "Un cuantificador vectorial piramidal". IEEE Transactions on Information Theory . 32 (4): 568– 583. doi : 10.1109/TIT.1986.1057198 .
- 1 2 Duda, Jarek (2017). "Mejora del cuantificador vectorial piramidal con proyección de potencia". arXiv : 1705.05285 [ math.OC ].
- ↑ Valin, Jean-Marc (septiembre de 2013). "Cuantización vectorial piramidal para codificación de vídeo" (PDF) . Fundación Xiph.Org . Consultado el 4 de abril de 2021 .
- 1 2 3 Valin, Jean-Marc; Terriberry, Timothy B.; Montgomery, Christopher; Maxwell, Gregory (enero de 2010). "Un códec de voz y audio de alta calidad con menos de 10 ms de retardo". IEEE Transactions on Audio, Speech, and Language Processing . 18 (1): 58– 67. arXiv : 1602.05526 . doi : 10.1109/TASL.2009.2023186 . S2CID 11516136 .
- ↑ Terriberry, Timothy B. (2009). "cwrs.c" . Opus . Fundación Xiph.Org . Recuperado el 6 de abril de 2021 .
- ↑ Terriberry, Timothy B. (diciembre de 2007). "Codificación vectorial de pulsos" . Fundación Xiph.Org . Archivado del original el 30 de septiembre de 2019. Recuperado el 4 de abril de 2021 .
- Algoritmos de compresión con pérdida