ピラミッドベクトル量子化(PVQ)は、オーディオおよびビデオコーデックで単位ベクトル(デコーダーには大きさはわかっているが方向は不明なベクトル)を量子化して送信するために使用される方法です。PVQは、ベクトルの大きさと方向が互いに別々に量子化されるゲイン/シェイプ量子化スキームの一部としても使用できます。PVQは、1986年にThomas R. Fischerの論文「ピラミッドベクトル量子化器」で最初に説明されました。[1]

PVQ の注意点の 1 つは、タクシー距離(L1 ノルム)で動作することです。より一般的なユークリッド距離(L2 ノルム) との変換はベクトル投影によって可能ですが、量子化ポイントの分布が均一ではなくなります (ユークリッドn球面の極は非極よりも密になります)。[3]ユークリッドn球面の理想的な (つまり均一な) ベクトル量子化のための効率的なアルゴリズムは、2010 年時点では知られていません。[4] この不均一性は、投影前に座標ごとの累乗などの変形を適用することで軽減でき、平均二乗量子化誤差を約 10% 削減できます。[2]
PVQ は、 CELTオーディオ コーデック ( Opusに継承) およびDaalaビデオ コーデックで使用されます。
概要
ベクトル量子化の形式として、PVQ はM 個の量子化ポイントのコードブックを定義します。各量子化ポイントには0 からM −1 までの整数コードワードが割り当てられます。エンコーダの目的は最も近いベクトルのコードワードを見つけることであり、デコーダはそれをベクトルにデコードする必要があります。
PVQコードブックは、絶対値の合計が定数K(つまり、L1ノルムがKに等しい)になる整数のみの座標を持つN次元のすべての点から構成されます。セットビルダー表記では、次のようになります。
ここで はの L1 ノルムを表します。
現状では、集合S はN次元ピラミッドの表面をモザイク状に並べます。必要に応じて、点を球面に「投影」する、つまり正規化することで、球面に再形成できます。
ここで はのL2 ノルムを表します。
パラメータK を増やすと量子化ポイントが増え、通常は、送信に必要なビット数が増える整数コードワードが大きくなるという犠牲を払って、元の単位ベクトル のより「正確な」近似値が得られます。
例
パラメータK =2 を使用して 3 次元単位ベクトルを量子化したいとします。コードブックは次のようになります。
(0.707 =小数点以下3桁に丸められます。)
ここで、単位ベクトル <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コード
itertools
をインポートします。math をtypeからインポートします。List 、NamedTuple 、Tuple をインポートします。
クラス PVQEntry ( NamedTuple ):
codeword : int
point : Tuple [ int , ... ]
normalizedPoint : Tuple [ float , ... ]
def create_pvq_codebook ( n : int , k : int ) -> List [ PVQEntry ]:
""" k パルスを持つ n 次元 PVQ コードブックを生成する単純なアルゴリズム。 実行時の複雑さ: 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 ))
リターン ret
def search_pvq_codebook (
codebook : List [ PVQEntry ], p : Tuple [ float , ... ]
) -> Tuple [ PVQEntry , float ]:
""" PVQ コードブックを検索するための単純なアルゴリズムです。 ユークリッド距離に従って、コードブック内で p に「最も近い」点を返します。) """ 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
ret 、 min_distを返す
def example ( p : Tuple [ float , ... ], k : int ) -> None :
n = len ( p )
codebook = create_pvq_codebook ( n , k )
print ( "コードブックエントリの数: " + str ( len ( codebook )))
entry , dist = search_pvq_codebook ( codebook , p )
print ( "最適なエントリ: " + str ( entry ))
print ( "距離: " + str ( dist ))
φ = 1.2
θ = 5.4
x = math.sin ( φ ) * math.cos ( θ ) y = math.sin ( φ ) * math.sin ( θ ) z = math.cos ( φ ) p = ( x , y , z )例( p , 2 )例( p , 5 )例( p , 20 )
複雑
PVQコードブックはで検索できます。[4]エンコードとデコードはメモリを使用して同様に実行できます。[5]
コードブックのサイズは再帰性に従う[4]
みんなのために、みんなのために。
閉形式の解は[6]で与えられる。
ここで は超幾何関数です。
参照
参考文献
- ^ Fischer, Thomas R. (1986 年 7 月). 「ピラミッド ベクトル量子化器」. IEEE Transactions on Information Theory . 32 (4): 568–583. doi :10.1109/TIT.1986.1057198.
- ^ ab Duda, Jarek (2017). 「パワープロジェクションによるピラミッドベクトル量子化器の改良」. arXiv : 1705.05285 [math.OC].
- ^ Valin, Jean-Marc (2013 年 9 月). 「ビデオ コーディングのためのピラミッド ベクトル量子化」(PDF) . Xiph.Org Foundation . 2021 年4 月 4 日閲覧。
- ^ abc Valin, Jean-Marc; Terriberry, Timothy B.; Montgomery, Christopher; Maxwell, Gregory (2010 年 1 月)。「遅延が 10 ミリ秒未満の高品質音声およびオーディオ コーデック」。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 . Xiph.Org Foundation . 2021年4月6日閲覧。
- ^ Terriberry, Timothy B. (2007年12月). 「Pulse Vector Coding」. Xiph.Org Foundation . 2019年9月30日時点のオリジナルよりアーカイブ。 2021年4月4日閲覧。
