メインコンテンツ

quantiz

量子化インデックスと量子化された出力値を作成

説明

index = quantiz(sig,partition) は、入力 partition で指定されたスカラー量子化の分割を使用して、入力信号 sig の量子化レベルを返します。

[index,quants] = quantiz(sig,partition,codebook) は、スカラー量子化における各分割の値を規定する codebook を指定します。codebook は、長さが partition の長さより 1 長くなければならないベクトルです。この関数は quants も返します。これは sig のスカラー量子化を含み、量子化レベルとコードブックで規定された値に依存します。

[index,quants,distor] = quantiz(sig,partition,codebook) は、量子化データの平均二乗歪みを返します。

すべて折りたたむ

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

サンプル データを生成し、partition ベクトルと codebook ベクトルを指定します。間隔が異なる個別のエンドポイントをベクトル要素の値として定義することにより、partition ベクトルを指定します。partition ベクトルで定義された各間隔の要素の値をもつ codebook ベクトルを指定します。codebook ベクトルは、partition ベクトルより 1 要素長くなければなりません。

samp = [-2.4, -1, 0, 0.2, 0.8, 1.2, 2,3, 3.5, 5];
partition = [0, 1, 3];
codebook = [-1, 0.5, 2, 3]; 

データ サンプルを量子化します。入力サンプル データ、量子化インデックス、および入力データに対応する量子化された出力値を表示します。

[index,quantized] = quantiz(samp,partition,codebook);
[samp; index; quantized]'
ans = 10×3

   -2.4000         0   -1.0000
   -1.0000         0   -1.0000
         0         0   -1.0000
    0.2000    1.0000    0.5000
    0.8000    1.0000    0.5000
    1.2000    2.0000    2.0000
    2.0000    2.0000    2.0000
    3.0000    2.0000    2.0000
    3.5000    3.0000    3.0000
    5.0000    3.0000    3.0000

スカラー量子化の性質を説明するために、この例では正弦波を量子化する方法を示します。元の信号と量子化された信号をプロットして、正弦曲線を構成する x 個のシンボルと、量子化された信号を構成するドットを対比させます。各ドットの垂直座標は、ベクトル コードブック内の値です。

t で定義された時間にサンプリングされた正弦波を生成します。間隔が異なる個別のエンドポイントをベクトル要素の値として定義することにより、partition 入力を指定します。partition ベクトルで定義された各間隔の要素の値をもつ codebook 入力を指定します。コードブック ベクトルは、分割ベクトルより 1 要素長くなければなりません。

t = [0:.1:2*pi];
sig = sin(t);
partition = [-1:.2:1];
codebook = [-1.2:.2:1];

サンプリング後の正弦波で量子化を実行します。

[index,quants] = quantiz(sig,partition,codebook);

量子化された正弦波とサンプリング後の正弦波をプロットします。

plot(t,sig,'x',t,quants,'.')
title('Quantization of Sine Wave')
xlabel('Time')
ylabel('Amplitude')
legend('Original sampled sine wave','Quantized sine wave');
axis([-.2 7 -1.2 1.2])

Figure contains an axes object. The axes object with title Quantization of Sine Wave, xlabel Time, ylabel Amplitude contains 2 objects of type line. One or more of the lines displays its values using only markers These objects represent Original sampled sine wave, Quantized sine wave.

大きな信号の集合に対し、微細な量子化方式を使用してパラメーターのテストや選択を行うのは手間のかかる作業です。分割パラメーターとコードブック パラメーターを簡単に生成する方法の 1 つは、一連の "学習データ" に従ってそれらを最適化することです。学習データは、量子化する典型的な種類の信号でなければなりません。

この例では、lloyds関数を使用して、Lloyd アルゴリズムに従って分割およびコードブックを最適化します。このコードは、おおまかな初期推定から開始して、正弦波信号の 1 区間の分割とコードブックを最適化します。この例では、次に、quantiz関数を 2 回実行し、最初の partition 入力および codebook 入力の値と、最適化された partitionOpt 入力および codebookOpt 入力の値を使用して、量子化されたデータを生成します。この例では、最初の量子化と最適化された量子化の歪みも比較します。

正弦波信号と初期量子化パラメーターの変数を定義します。lloyds 関数を使用して分割とコードブックを最適化します。

t = 0:.1:2*pi;
sig = sin(t);
partition = -1:.2:1;
codebook = -1.2:.2:1;
[partitionOpt,codebookOpt] = lloyds(sig,codebook);

初期および最適化後の分割ベクトルとコードブック ベクトルを使用して、量子化された信号を生成します。quantiz関数は、平均二乗歪みを自動的に計算して 3 番目の出力引数として出力します。量子化の平均二乗歪みを初期および最適化後の入力引数と比較して、最適化された量子化値を使用すると歪みがどの程度少なくなるかを確認します。

[index,quants,distor] = quantiz(sig,partition,codebook);
[indexOpt,quantOpt,distorOpt] = ...
    quantiz(sig,partitionOpt,codebookOpt);
[distor, distorOpt]
ans = 1×2

    0.0148    0.0022

サンプリングされた正弦波、量子化された正弦波、および最適化後の量子化された正弦波をプロットします。

plot(t,sig,'x',t,quants,'.',t,quantOpt,'s')
title('Quantization of Sine Wave')
xlabel('Time')
ylabel('Amplitude')
legend('Original sampled sine wave', ...
    'Quantized sine wave', ...
    'Optimized quantized sine wave');
axis([-.2 7 -1.2 1.2])

Figure contains an axes object. The axes object with title Quantization of Sine Wave, xlabel Time, ylabel Amplitude contains 3 objects of type line. One or more of the lines displays its values using only markers These objects represent Original sampled sine wave, Quantized sine wave, Optimized quantized sine wave.

入力引数

すべて折りたたむ

入力信号。ベクトルで指定します。この入力で、この関数で量子化を実行するためのサンプリング後の信号を指定します。

データ型: double

異なる範囲の明確な端点。行ベクトルとして指定します。この入力は、実数値の集合において、オーバーラップしないで隣接する値の範囲を定義します。この入力内にある値は厳密に昇順でなければなりません。このベクトルの長さは、分割区間数よりも 1 小さくなければなりません。

例: [0, 1, 3] は、入力行ベクトルを 4 つのセット {X: X0}、{X: 0 < X1}、{X: 1 < X3}、および {X: 3 < X} に分割します。

データ型: double

各分割の量子化値。行ベクトルとして指定します。この入力は、スカラー量子化における各分割の値を規定します。このベクトルの長さは分割間隔の数と等しくなければなりません。つまり、このベクトルの長さは、partition 入力の長さより 1 長くなければなりません。

データ型: double

出力引数

すべて折りたたむ

入力信号の量子化インデックス。非負の行ベクトルとして返されます。この出力によって、各入力値がマッピングされる分割区間が判断されます。index 内の各要素は、範囲 [0, N–1] 内にある N 整数のいずれかです。

partition が長さ N の場合、indexK 番目のエントリが以下のベクトルです。

  • sig(K) ≤ partition(1) の場合は 0

  • partition(M) < sig(K) ≤ partition(M+1) の場合は M

  • partition(N) ≤ sig(K) の場合は N

量子化器の出力。入力信号の量子化値を含み、行ベクトルとして返されます。quants のサイズは、入力引数 sig のサイズと一致します。codebook が入力引数として指定されていない場合は、長さが partition の長さより 1 長くなければならないベクトルとしてコードブック値を定義できます。

quants は、codebook および index の入力に基づいて計算され、quants(i) = codebook(index(i) + 1) で求められます。ここで、i は範囲 [1, length(sig)] の整数です。

量子化信号の平均二乗歪み。正のスカラーとして返されます。適切な分割値およびコードブック値を選択することによってこの歪みを減少させることができます。分割値とコードブック値の最適化の詳細については、関数 lloyds を参照してください。

バージョン履歴

R2006a より前に導入