Main Content

compand

μ 則または A 則圧縮器/伸張器による情報源符号化

説明

out = compand(in,param,v) は、入力データ シーケンスで μ 則圧縮を実行します。param 入力は μ 則圧縮の値を指定し、μ 則圧縮器計算の mu 値に設定しなければなりません (実際には 255 の μ 則値が使用されます)。v は、入力データ シーケンスのピーク振幅を指定します。

out = compand(in,param,v,method) は、入力データ シーケンスで μ 則または A 則圧縮や伸張を実行します。param は、μ 則圧伸器または A 則圧伸器の値 (実際には 255 の μ 則値と 87.6 の A 則値が使用されます)。method は、入力データ シーケンスで実行する関数の圧縮器または伸張器のタイプを指定します。

すべて折りたたむ

データ シーケンスを生成します。

data = 2:2:12
data = 1×6

     2     4     6     8    10    12

μ 則圧縮器を使用してデータ シーケンスを圧縮します。mu の値を 255 に設定します。圧縮されたデータ シーケンスの範囲は 8.1 ~ 12 です。

compressed = compand(data,255,max(data),'mu/compressor')
compressed = 1×6

    8.1644    9.6394   10.5084   11.1268   11.6071   12.0000

μ 則伸張器を使用して圧縮されたデータ シーケンスを伸張します。伸張したデータ シーケンスは元のデータ シーケンスとほぼ同一になります。

expanded = compand(compressed,255,max(data),'mu/expander')
expanded = 1×6

    2.0000    4.0000    6.0000    8.0000   10.0000   12.0000

元のデータ シーケンスと伸張されたデータ シーケンスの差を計算します。

diffvalue = expanded - data
diffvalue = 1×6
10-14 ×

   -0.0444    0.1776    0.0888    0.1776    0.1776   -0.3553

データ シーケンスを生成します。

data = 1:5;

A 則圧縮器を使用してデータ シーケンスを圧縮します。A の値を 87.6 に設定します。圧縮されたデータ シーケンスの範囲は 3.5 ~ 5 です。

compressed = compand(data,87.6,max(data),'A/compressor')
compressed = 1×5

    3.5296    4.1629    4.5333    4.7961    5.0000

A 則伸張器を使用して圧縮されたデータ シーケンスを伸張します。伸張したデータ シーケンスは元のデータ シーケンスとほぼ同一になります。

expanded = compand(compressed,87.6,max(data),'A/expander')
expanded = 1×5

    1.0000    2.0000    3.0000    4.0000    5.0000

元のデータ シーケンスと伸張されたデータ シーケンスの差を計算します。

diffvalue = expanded - data
diffvalue = 1×5
10-14 ×

         0         0    0.1332    0.0888    0.0888

ハイ ダイナミック レンジで信号を送信すると、長さの等しい区間を使用する量子化で桁落ちと信号の歪みが生じる可能性があります。圧伸は、送信側で量子化の前に対数演算を適用して信号を圧縮し、受信側で逆の操作を適用して信号を拡張してフル スケールに戻す操作です。圧伸により、多くの量子化レベルを指定せずに信号の歪みを回避できます。指数信号に 6 ビット量子化を使用したときの歪みを、圧伸を行う場合と行わない場合について比較します。元の指数信号、量子化信号、拡張信号をプロットします。

指数信号を作成してその最大値を計算します。

sig = exp(-4:0.1:4);
V = max(sig);

同じ長さの間隔を使用して信号を量子化します。partition 値と codebook 値を設定し、6 ビットの量子化と仮定します。平均二乗歪みを計算します。

partition = 0:2^6 - 1;
codebook = 0:2^6;
[~,qsig,distortion] = quantiz(sig,partition,codebook);

μ 則方式を適用するように構成した関数 compand を使用して信号を圧縮します。量子化を適用し、量子化した信号を展開します。圧伸した信号の平均二乗歪みを計算します。

mu = 255; % mu-law parameter
csig_compressed = compand(sig,mu,V,'mu/compressor');
[~,quants] = quantiz(csig_compressed,partition,codebook);
csig_expanded = compand(quants,mu,max(quants),'mu/expander');
distortion2 = sum((csig_expanded - sig).^2)/length(sig);

量子化の平均二乗歪みを、圧伸と量子化を組み合わせた場合の平均二乗歪みと比較します。圧伸して量子化した信号の歪みは、量子化した信号の歪みより 1 桁少なくなっています。長さの等しい区間は指数信号の対数に適していますが、指数信号そのものには適していません。

[distortion, distortion2]
ans = 1×2

    0.5348    0.0397

元の指数信号、量子化信号、拡張信号をプロットします。低い信号レベルでの量子化信号エラーを強調表示するため、軸にズームインします。

plot([sig' qsig' csig_expanded']);
title('Comparison Between Original, Quantized, and Expanded Signals');
xlabel('Interval');
ylabel('Apmlitude');
legend('Original','Quantized','Expanded','location','nw');
axis([0 70 0 20])

Figure contains an axes object. The axes object with title Comparison Between Original, Quantized, and Expanded Signals contains 3 objects of type line. These objects represent Original, Quantized, Expanded.

入力引数

すべて折りたたむ

入力データ シーケンス。行ベクトルとして指定します。この入力で、関数で圧縮または伸張を実行するデータ シーケンスを指定します。

データ型: double

圧伸器の μ 値または A 値。正のスカラーとして指定します。実際に利用されている一般的な値は µ = 255 および A = 87.6 です。

データ型: double

入力データ シーケンスで実行する関数の圧縮器または伸張器計算のタイプ。

  • mu/compressor

  • mu/expander

  • A/compressor

  • A/expander

データ型: char | string

入力データ シーケンスのピーク振幅。正のスカラーとして指定します。

データ型: double

出力引数

すべて折りたたむ

圧縮または伸張された信号。正の行ベクトルとして返されます。out のサイズは、入力引数 in のサイズと一致します。

アルゴリズム

音声処理などの用途では、量子化の前に (圧縮器と呼ばれる) 対数演算を使用するのが一般的です。圧縮器の逆演算は、"伸張器" と呼ばれます。圧縮器と伸張器を組み合わせて、"圧伸器" と呼ばれます。

与えられた信号 x に対して、(µ 則) 圧縮器の出力は、以下のようになります。

y=log(1+μ|x|)log(1+μ)sgn(x).

µ は圧伸器の µ 則パラメーター、log は自然対数、sgn は符号関数 (MATLAB® では sign) です。

入力信号 x の µ 則の伸張は、逆関数 y-1 で求められます。

y1=sgn(y)(1μ)((1+μ)|y|1)         for -1y1

与えられた信号 x に対して、(A 則) 圧縮器の出力は、以下のようになります。

y={A|x|1+logAsgn(x)(1+log(A|x|))1+logAsgn(x)for 0|x|1Afor 1A<|x|1

A は圧伸器の A 則パラメーター、log は自然対数、sgn は符号関数 (MATLAB では sign) です。

入力信号 x の A 則の伸張は、逆関数 y-1 で求められます。

y1=sgn(y){|y|(1+log(A))Aexp(|y|(1+log(A))1)Afor 0|y|<11+log(A)for 11+log(A)|y|<1

参照

[1] Sklar, Bernard. Digital Communications: Fundamentals and Applications. Englewood Cliffs, NJ: Prentice-Hall, 1988.

バージョン履歴

R2006a より前に導入