Пирамидальное векторное квантование
Пирамидально-векторное квантование ( PVQ ) — это метод, используемый в аудио- и видеокодеках для квантования и передачи единичных векторов , то есть векторов, величины которых известны декодеру, но направления которых неизвестны. PVQ также может использоваться как часть схемы квантования усиления/формы , при которой величина и направление вектора квантоваются отдельно друг от друга. Первоначально PVQ был описан в 1986 году в статье Томаса Р. Фишера «Пирамидальный векторный квантователь». [1]

Единственное предостережение PVQ заключается в том, что он работает на расстоянии, соответствующем такси (норма L1). Преобразование в/из более знакомого евклидова расстояния (L2-норма) возможно посредством векторной проекции , хотя это приводит к менее равномерному распределению точек квантования (полюса евклидовой n -сферы становятся более плотными, чем неполюсы). [3] эффективный алгоритм идеального (то есть равномерного) векторного квантования евклидовой n -сферы неизвестен. По состоянию на 2010 год [4] Эту неравномерность можно уменьшить, применяя перед проецированием деформацию, такую как мощность по координатам, что снижает среднеквадратическую ошибку квантования на ~ 10%. [2]
PVQ используется в аудиокодеке CELT (унаследованном от Opus ) и Daala видеокодеке .
Обзор
[ редактировать ]В качестве формы векторного квантования PVQ определяет кодовую книгу из M точек квантования, каждой из которых присваивается целочисленное кодовое слово от 0 до M -1. Цель кодера — найти кодовое слово ближайшего вектора, которое декодер должен декодировать обратно в вектор.
Кодовая книга PVQ состоит из всех N -мерных точек. с целочисленными координатами, сумма абсолютных значений которых равна константе K (т. е. чья L1-норма равна K ). В обозначениях построителя множеств :
где обозначает L1-норму .
В нынешнем виде множество S замощает поверхность N -мерной пирамиды. При желании мы можем преобразовать его в сферу, «проецируя» точки на сферу, то есть нормализовав их :
где обозначает L2- норму .
Увеличение параметра K приводит к увеличению количества точек квантования и, следовательно, обычно дает более «точное» приближение исходного единичного вектора. за счет более крупных целочисленных кодовых слов, для передачи которых требуется больше битов.
Пример
[ редактировать ]Предположим, мы хотим квантовать трехмерные единичные векторы, используя параметр K =2. Наша кодовая книга становится:
|
|
(0.707 = округляется до трех десятичных знаков.)
Теперь предположим, что мы хотим передать единичный вектор <0,592, -0,720, 0,362> (округленный здесь до 3 десятичных знаков, для ясности). Согласно нашей кодовой книге, ближайшей точкой, которую мы можем выбрать, является кодовое слово 13 (<0,707, -0,707, 0,000>), расположенное примерно на 0,381 единицы дальше от нашей исходной точки.
Увеличение параметра K приводит к увеличению кодовой книги, что обычно увеличивает точность реконструкции. Например, на основе приведенного ниже кода Python K =5 (размер кодовой книги: 102) дает ошибку всего 0,097 единиц, а K =20 (размер кодовой книги: 1602) дает ошибку всего 0,042 единицы.
Код Python
[ редактировать ]import itertools
import math
from typing import List, NamedTuple, Tuple
class PVQEntry(NamedTuple):
codeword: int
point: Tuple[int, ...]
normalizedPoint: Tuple[float, ...]
def create_pvq_codebook(n: int, k: int) -> List[PVQEntry]:
"""
Naive algorithm to generate an n-dimensional PVQ codebook
with k pulses.
Runtime complexity: 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))
return ret
def search_pvq_codebook(
codebook: List[PVQEntry], p: Tuple[float, ...]
) -> Tuple[PVQEntry, float]:
"""
Naive algorithm to search the PVQ codebook. Returns the point in the
codebook that's "closest" to p, according to the Euclidean distance.)
"""
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 = dist
return ret, min_dist
def example(p: Tuple[float, ...], k: int) -> None:
n = len(p)
codebook = create_pvq_codebook(n, k)
print("Number of codebook entries: " + str(len(codebook)))
entry, dist = search_pvq_codebook(codebook, p)
print("Best entry: " + str(entry))
print("Distance: " + 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)
Сложность
[ редактировать ]Кодовую книгу PVQ можно найти в . [4] Кодирование и декодирование также могут выполняться в с использованием память. [5]
Размер кодовой книги подчиняется повторяемости [4]
с для всех и для всех .
Решение в замкнутой форме имеет вид [6]
где — гипергеометрическая функция .
См. также
[ редактировать ]Ссылки
[ редактировать ]- ^ Фишер, Томас Р. (июль 1986 г.). «Пирамидальный векторный квантователь». Транзакции IEEE по теории информации . 32 (4): 568–583. дои : 10.1109/TIT.1986.1057198 .
- ^ Перейти обратно: а б Дуда, Ярек (2017). «Улучшение пирамидального векторного квантователя с помощью проекции мощности». arXiv : 1705.05285 [ math.OC ].
- ^ Вален, Жан-Марк (сентябрь 2013 г.). «Пирамидное векторное квантование для кодирования видео» (PDF) . Фонд Xiph.Org . Проверено 4 апреля 2021 г.
- ^ Перейти обратно: а б с Вален, Жан-Марк; Терриберри, Тимоти Б.; Монтгомери, Кристофер; Максвелл, Грегори (январь 2010 г.). «Высококачественный речевой и аудиокодек с задержкой менее 10 мс». Транзакции IEEE по обработке звука, речи и языка . 18 (1): 58–67. arXiv : 1602.05526 . дои : 10.1109/TASL.2009.2023186 . S2CID 11516136 .
- ^ Терриберри, Тимоти Б. (2009). "cwrs.c" . Опус . Фонд Xiph.Org . Проверено 6 апреля 2021 г.
- ^ Терриберри, Тимоти Б. (декабрь 2007 г.). «Импульсно-векторное кодирование» . Фонд Xiph.Org . Архивировано из оригинала 30 сентября 2019 года . Проверено 4 апреля 2021 г.