Main Content

離散コサイン変換

離散コサイン変換 (DCT) は離散フーリエ変換 (DFT) と密接に関連しています。実のところ、DFT はシーケンスに対する DCT 計算の 1 ステップです。しかし、DCT は DFT より "エネルギー集中" が優れており、ほんの数個の変換係数のみでシーケンス内のエネルギーの大部分を表現します。DCT のこの特性は、データ通信や信号符号化などのアプリケーションに役立ちます。

DCT バリアント

DCT には 4 つの標準バリアントがあります。長さ N の信号 x およびクロネッカー デルタ δk を使うと、変換は以下のように定義されます。

  • DCT-1:

y(k)=2N-1n=1Nx(n)11+δn1+δnN11+δk1+δkNcos(πN-1(n-1)(k-1))

  • DCT-2:

y(k)=2Nn=1Nx(n)11+δk1cos(π2N(2n-1)(k-1))

  • DCT-3:

y(k)=2Nn=1Nx(n)11+δn1cos(π2N(n-1)(2k-1))

  • DCT-4:

y(k)=2Nn=1Nx(n)cos(π4N(2n-1)(2k-1))

Signal Processing Toolbox の関数 dct は入力配列の単項 DCT を計算します。

逆 DCT バリアント

DCT のすべてのバリアントは "単項" (または、"直交" と同等) です。その逆変換を求めるには、各定義で kn を切り替えます。DCT-1 と DCT-4 はそれ自体の逆変換です。DCT-2 と DCT-3 は互いの逆変換です。

  • DCT-1 の逆変換:

x(n)=2N-1k=1Ny(k)11+δk1+δkN11+δn1+δnNcos(πN-1(k-1)(n-1))

  • DCT-2 の逆変換:

x(n)=2Nk=1Ny(k)11+δk1cos(π2N(k-1)(2n-1))

  • DCT-3 の逆変換:

x(n)=2Nk=1Ny(k)11+δn1cos(π2N(2k-1)(n-1))

  • DCT-4 の逆変換:

x(n)=2Nk=1Ny(k)cos(π4N(2k-1)(2n-1))

関数 idct は入力シーケンスに対する逆 DCT を計算し、DCT 係数の全体または一部分から信号を再構成します。

DCT を使用する信号の再構成

DCT のエネルギー集中特性により、DCT 係数の一部分のみから信号を再構成できます。たとえば、1000 Hz でサンプリングした 25 Hz の正弦波シーケンスを作成します。

t = 0:1/1000:1;
x = sin(2*pi*25*t);

このシーケンスの DCT を計算し、0.1 より大きい値をもつ成分のみを使用して信号を再構成します。元の 1000 個の係数のうちの何個がこの要件を満たすかを特定します。

y = dct(x);
y2 = find(abs(y) < 0.1);
y(y2) = zeros(size(y2));
z = idct(y);

howmany = length(find(y))
howmany = 64

元のシーケンスと再構成したシーケンスをプロットします。

subplot(2,1,1)
plot(t,x)
ax = axis;
title('Original Signal')

subplot(2,1,2)
plot(t,z)
axis(ax)
title('Reconstructed Signal')

Figure contains 2 axes objects. Axes object 1 with title Original Signal contains an object of type line. Axes object 2 with title Reconstructed Signal contains an object of type line.

再構成の精度の 1 つの尺度として、元の信号と再構成した信号との差のノルムを元の信号のノルムで除算します。この推定を計算し、パーセンテージで表します。

norm(x-z)/norm(x)*100
ans = 1.9437

再構成された信号は、元の信号のエネルギーの約 98% を保持しています。

参考

|

関連するトピック