Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

量子化

パーティションの表現

スカラー量子化は、指定した範囲内のすべての入力を共通の値に割り当てるプロセスです。このプロセスは、値の範囲が異なる入力を、別の共通の値に割り当てます。実質的に、スカラー量子化はアナログ信号をデジタル化します。量子化を決定するものは、次の 2 つのパラメーター、分割コードブックです。

量子化の分割は、実数値の集合において、オーバーラップしないで隣接する値の範囲を定義します。分割を MATLAB® 環境で指定するには、異なる範囲の明確な端点をベクトルでリストします。

たとえば、分割が実数線を次の 4 つに分割する場合を考えてみます。

  • {x: x ≤ 0}

  • {x:0< x ≤ 1}

  • {x:1 < x ≤ 3}

  • {x:3 < x}

この場合、分割を 3 要素のベクトルとして表すことができます。

partition = [0,1,3];

分割ベクトルの長さは、分割区間数よりも 1 小さくなります。

コードブックの表現

コードブックは、分割の各範囲に分けられる入力に割り当てる共通の値を量子化器に指定します。コードブックは、長さが分割の区間の数と同じベクトルとして表されます。たとえば、次のベクトルを例に説明します。

codebook = [-1, 0.5, 2, 3];

このベクトルは、分割 [0,1,3] に対して考えられるコードブックの 1 つです。

各入力の区間の決定

関数 quantiz は、各入力がどの区間に当てはまるかを示すベクトルも返します。たとえば、以下の出力は、各入力エントリが 0、6、および 5 というラベルが付けられた区間に当てはまることを意味します。ここでは、0 番目の区間は 3 以下の実数で構成され、6 番目の区間は 8 より大きく 9 以下の実数で構成され、5 番目の区間は 7 より大きく 8 以下の実数で構成されます。

partition = [3,4,5,6,7,8,9];
index = quantiz([2 9 8],partition)

出力は以下のようになります。

index =

     0
     6
     5

以下のようなコードブック ベクトルを定義して、この例を続行した場合を考えてみます。

codebook = [3,3,4,5,6,7,8,9];

ここで、以下の式はベクトル index を量子化信号 quants に関連付けます。

quants = codebook(index+1);

この quants の式は、この例を次のようにより簡潔に表現した場合に関数 quantiz が使用する式です。

partition = [3,4,5,6,7,8,9];
codebook = [3,3,4,5,6,7,8,9];
[index,quants] = quantiz([2 9 8],partition,codebook);

量子化パラメーターの最適化

この節の概要

量子化を行うと信号が変形します。適切な分割パラメーターとコードブック パラメーターを選択することによって歪みを減少させることができます。しかし、大きな信号の集合に対し、微細な量子化方式を使用してパラメーターのテストや選択を行うのは手間のかかる作業です。分割およびコードブック パラメーターを簡単に生成する方法の 1 つは、いわゆる一連の "学習データ" に従ってそれらを最適化することです。

メモ

使用する学習データは、実際に量子化する典型的な種類の信号であるべきです。

例:量子化パラメーターの最適化

関数 lloyds は、Lloyd アルゴリズムに従って分割およびコードブックを最適化します。以下のコードは、おおまかな初期推定から開始して、正弦波信号の 1 区間の分割とコードブックを最適化します。その後、これらのパラメーターを使用し、初期推定パラメーターと最適化パラメーターを使用して元の信号を量子化します。出力は、量子化後の平均二乗歪みが最適化パラメーターに対して非常に小さいことを示します。関数 quantiz は、平均二乗歪みを自動的に計算して 3 番目の出力パラメーターとして出力します。

% Start with the setup from 2nd example in "Quantizing a Signal."
t = [0:.1:2*pi];
sig = sin(t);
partition = [-1:.2:1];
codebook = [-1.2:.2:1];
% Now optimize, using codebook as an initial guess.
[partition2,codebook2] = lloyds(sig,codebook);
[index,quants,distor] = quantiz(sig,partition,codebook);
[index2,quant2,distor2] = quantiz(sig,partition2,codebook2);
% Compare mean square distortions from initial and optimized
[distor, distor2] % parameters.

出力は以下のようになります。

ans =

    0.0148    0.0024

信号の量子化

スカラー量子化の例 1

以下のコードは、関数 quantizpartitioncodebook を使用して、どのように実数ベクトル samp を新規ベクトル quantized (エントリは -1、0.5、2、または 3 のいずれか) に割り当てるかを示します。

partition = [0,1,3];
codebook = [-1, 0.5, 2, 3];
samp = [-2.4, -1, -.2, 0, .2, 1, 1.2, 1.9, 2, 2.9, 3, 3.5, 5];
[index,quantized] = quantiz(samp,partition,codebook);
quantized

出力は以下のようになります。

quantized =

  Columns 1 through 6

   -1.0000   -1.0000   -1.0000   -1.0000    0.5000    0.5000

  Columns 7 through 12

    2.0000    2.0000    2.0000    2.0000    2.0000    3.0000

  Column 13

    3.0000

スカラー量子化の例 2

この例では、スカラー量子化の性質をより明確に説明します。サンプリングされた正弦波を量子化した後、元の信号と量子化信号をプロットします。プロットは、正弦波を表す x と量子化信号を表すドットを対比しています。各ドットの垂直座標は、ベクトル codebook の値です。

t = [0:.1:2*pi]; % Times at which to sample the sine function
sig = sin(t); % Original signal, a sine wave
partition = [-1:.2:1]; % Length 11, to represent 12 intervals
codebook = [-1.2:.2:1]; % Length 12, one entry for each interval
[index,quants] = quantiz(sig,partition,codebook); % Quantize.
plot(t,sig,'x',t,quants,'.')
legend('Original signal','Quantized signal');
axis([-.2 7 -1.2 1.2])

参考

関数