DCT6回目 考えてみましたが、まぁ、結果はあんまりです。

時間が出来たので、前回の続きを考えてみました。

結論を先に言ってしまうと、
・DCTとは、与えられた値を波に分解して、各々の波がどの程度含まれているか?を表す値に変換する
・逆DCTとは、各々の波がどの程度含まれているのか?という値から、元の値を復元する

という、至極当たり前の事しか分かりませんでした。
その中の過程が、具体的に見えた感じでしょうか。

ただ、DCTの理論(なぜ波に分解出来て、元に戻せるのか?)という所は、
"これなら、なんとなく元に戻せそう"という感覚以外はありません。
それを理解しようと思ったら、私がやっているようなアプローチの仕方ではなく、
DCTの公式の証明を理解しないとダメそうです。


以下に、私が理解した事を、書いておきます。


DCT〜逆DCTの流れ

前程:
入力値は、8個の1次元配列とみなす。(例:5,8,-1,5,4,2,8,-1)

〜DCT〜
1.与えられた値を、波とみなす。
2.公式が示す波と照らし合わせ、以下を8回行う。
3.波が、どの程度含まれているかを計算する。

〜逆DCT〜
4.以下を8回行う
5.DCTの時に使用した波と、DCTの結果(どの程度含まれているか?という値)から、元の値を計算する。


----------------------------
もう少し詳しく。

ここでは、例として、入力値を
"5, 8, -1, 5, 4, 2, 8, -1" とします。

DCTした結果の、どの程度含まれるか?という値は、
"10, 2, 0, 3, -1, 1, -7, -1" となります。(小数点以下切捨て)

元に戻すと
"4, 7, 0, 4, 4 , 1, 6, 0" となります。(小数点以下切捨て)

※小数点以下切捨てを2回やっている為、値が完全には戻っていませんが、それはご愛嬌


図1 入力値のグラフ

図2 波に分解するイメージ
青線:DCTの公式で使用する波
緑線:入力値を、青線の波の要素に分解した波


1.与えられた値を、波とみなす。

入力値を波とみなしてグラフにしてみます。
"5 , 8, -1, 5, 4 , 2, 8, -1"

図1を参照


2.公式が示す波と照らし合わせ、以下を8回行う。

ここで、波について考えます。

波といっても、所詮、関数です。
関数といのは、2つの値のペアの間に存在する関係を示したものです。

2つの値のペアとは、(5 ,6) (10, 11) (100, 101) のようなもので、
2つの値のペアの間に存在する関係とは、この場合、"右の値は、左の値+1" という事です。

波も同様で、DCTで使用する波も、
x=0,1,2,・・・・ と進むにつれて、 y の値が増えたり減ったりというのを繰り返すというだけのものです。

図2の青線を見てもらえれば、DCTで使用する波は、規則的に、ウネウネします

3.波が、どの程度含まれているかを計算する。

ここでやっているのは、
入力値の波と、公式の波を見比べる事です。
(図1と、図2の青線を見比べて下さい)

入力値の波の x=0 の値と、 公式の波の x=0 の値、 2つの値の間の関係を調べます。
それを、x=1,2,・・・・,7 と続けてやっていくと、
個別の値ではなく、波と波との関係性が出てくるみたいです。

一つの波に対する関係性で表せるのは、大雑把な関係性でしかありません。

これを、8個の公式の波それぞれに対して行う事で。
おそらく、全てのパターンに対応する事が出来るのでしょう。
(最後に1/2するのは謎)


ここで、波がどの程度含まれるのか?という値が意味する事について。

値が0の時、 その波は含まれていない(よって、常に 0 の直線)

緑線:値が0以上1未満の時、公式の波と比べて、波が上下する間隔は同じだが、上下に起伏する高さが穏やかな波を表す。
青線:値が1の時、公式の波と同じ波
赤線:値が1以上の時、公式の波と比べて、波が上下する間隔は同じだが、上下に起伏する高さが激しい波を表す。
ピンク線:値が負の数の時、公式の波を反転した波を表す


4.以下を8回行う
これは説明不要ですね

5.DCTの時に使用した波と、DCTの結果(どの程度含まれているか?という値)から、元の値を計算する。

公式で使った波と、どの程度含まれるか?という値で、8つの波が出来ますね。
(図2の緑線を見てください)

で、入力値(5, 8, -1, 5, 4, 2, 8, -1)を求めるわけですが、
入力値の1番目の値(5) は、
1番目の波の x=0の値と、 2番目の波のx=0の値、・・・・、8番目の波のx=0の値 を合成すれば良いのです。
(図2の緑線のグラフから"目分量"で計算すると、7 + 2 + 0 + 2.5 + -1 + 1 + -2.5 + 0 = 9 (1/2したら 4.5 ≒ 5))
(最後に1/2するのは謎)

同様に、2番目の値も(8)、それぞれの波のx=1の時の値を合成すれば良いのです。

こうして、元の値が取り出されるわけです。


どうでしょうか?
何となくイメージが伝わると良いのですが・・・・

感想お待ちしております