Articulo de referencia

Cuantización vectorial piramidal

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 magnitude...

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 ]

Mejorar la uniformidad de la distribución de puntos PVQ mediantew{\displaystyle w}o1/w{\displaystyle 1/w}poder por coordenadaspagisgn(pagi)(|pagi|)w{\displaystyle p_{i}\to \operatorname {sgn}(p_{i})(|p_{i}|)^{w}}del vector antes de la proyección. [ 2 ] El diagrama presenta constelaciones paranorte=3{\displaystyle N=3}dimensiones y escritoK=11,16,23,32{\displaystyle K=11,16,23,32}norma L1 .

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.pag{\displaystyle {\vec {p}}}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 :

S(norte,K)={pagZnorte:pag1=K}{\displaystyle S(N,K)=\left\{{\vec {p}}\in \mathbb {Z} ^{N}:\left\|{\vec {p}}\right\|_{1}=K\right\}}

dóndepag1{\displaystyle \left\|{\vec {p}}\right\|_{1}}denota la norma L1 depag{\displaystyle {\vec {p}}}.

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 :

Sesfera(norte,K)={pagpag2:pagS(norte,K)}{\displaystyle S_{\text{sphere}}(N,K)=\left\{{\frac {\vec {p}}{\left\|{\vec {p}}\right\|_{2}}}:{\vec {p}}\in S(N,K)\right\}}

dóndepag2{\displaystyle \left\|{\vec {p}}\right\|_{2}}denota la norma L2 depag{\displaystyle {\vec {p}}}.

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.v{\displaystyle {\vec {v}}}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 =2/2{\displaystyle {\sqrt {2}}/2}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 enO(Knorte){\displaystyle O(KN)}. [ 4 ] La codificación y decodificación también se pueden realizar enO(Knorte){\displaystyle O(KN)}usandoO(K+norte){\displaystyle O(K+N)}memoria. [ 5 ]

El tamaño del libro de códigos obedece la recurrencia [ 4 ]

V(norte,K)=V(norte1,K)+V(norte,K1)+V(norte1,K1){\displaystyle V(N,K)=V(N-1,K)+V(N,K-1)+V(N-1,K-1)}

conV(norte,0)=1{\displaystyle V(N,0)=1}a pesar denorte0{\displaystyle N\geq 0}yV(0,K)=0{\displaystyle V(0,K)=0}a pesar deK0{\displaystyle K\neq 0}.

Una solución en forma cerrada viene dada por [ 6 ].

V(norte,K)=2norte2F1(1K,1norte;2;2).{\displaystyle V(N,K)=2N\cdot {}_{2}F_{1}(1-K,1-N;2;2).}

dónde2F1{\displaystyle {}_{2}F_{1}}es la función hipergeométrica .

Véase también

Referencias

  1. 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 .
  2. 1 2 Duda, Jarek (2017). "Mejora del cuantificador vectorial piramidal con proyección de potencia". arXiv : 1705.05285 [ math.OC ].
  3. 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 .
  4. 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 . 
  5. Terriberry, Timothy B. (2009). "cwrs.c" . Opus . Fundación Xiph.Org . Recuperado el 6 de abril de 2021 .
  6. 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 .