離散コサイン変換
離散コサイン変換 (DCT) は離散フーリエ変換 (DFT) と密接に関連しています。実のところ、DFT はシーケンスに対する DCT 計算の 1 ステップです。しかし、DCT は DFT より "エネルギー集中" が優れており、ほんの数個の変換係数のみでシーケンス内のエネルギーの大部分を表現します。DCT のこの特性は、データ通信や信号符号化などのアプリケーションに役立ちます。
DCT バリアント
DCT には 4 つの標準バリアントがあります。長さ N の信号 x およびクロネッカー デルタ を使うと、変換は以下のように定義されます。
DCT-1:
DCT-2:
DCT-3:
DCT-4:
Signal Processing Toolbox の関数 dct
は入力配列の単項 DCT を計算します。
逆 DCT バリアント
DCT のすべてのバリアントは "単項" (または、"直交" と同等) です。その逆変換を求めるには、各定義で k と n を切り替えます。DCT-1 と DCT-4 はそれ自体の逆変換です。DCT-2 と DCT-3 は互いの逆変換です。
DCT-1 の逆変換:
DCT-2 の逆変換:
DCT-3 の逆変換:
DCT-4 の逆変換:
関数 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')
再構成の精度の 1 つの尺度として、元の信号と再構成した信号との差のノルムを元の信号のノルムで除算します。この推定を計算し、パーセンテージで表します。
norm(x-z)/norm(x)*100
ans = 1.9437
再構成された信号は、元の信号のエネルギーの約 98% を保持しています。