All-About調査室 Annex

ふと湧いた疑問や巷を漂うウワサを全部アバウト~に調査・検証
<OCNから漂着 流浪の調査室>

JPEGの悪評は風評被害か? ~ JPEGってなんだ?:16(続 1次元DCTのExcel実験)

2014-08-10 13:12:30 | JPEGの悪評は風評被害か?

前回は1次元DCT変換を行い、量子化するまでだったので
今回は逆変換で戻して、DCT処理と量子化でどの程度データが変化するかをExcelグラフで見てみる。

・・・が、その前に
前回、AS3~AV10セルにて「=mmult(Trans_M,Inp)」で求めたDCTの結果について

実はワタシはこれらの数値の意味合いがわからない!!
調べてみると、通常これらの数値を「スペクトル強度」と紹介しているものを良く見かける。
「スペクトル強度」と言われると、シロート頭では「スペクトル周波数の波の振幅値」のイメージを持つが
これらの数値は振幅にはなっていないのだから・・・・・意味わかんねぇ!

前々回、要素数N個の1次元の離散コサイン変換の逆変換の定義式



というものを掲載した。
この式の意味合いを確認するため、要素数N=8としてcos関数部分を以下にように書き改めて・・・



最後の(u/16)π はコサインの初期位相としてコサイン波を横にオフセットさせている量を表し、
2π(u/2)(x/8)部分は x 範囲を一旦0~8で考えた時に、この範囲にコサイン波が u/2 周期入ることを表している。
(u=0の時はcosゼロで、その値は1になり波ではなくなる。最終的にはu=0では単なる平均値でDC成分と呼ばれる)
uは0~7の整数だからコサインの波の数を 1/2 個(半周期)単位で指定する形で波の周波数を決めている。
(実際のDCT変換は x = 0,1,・・・,7 だから、上記の波の中から x:0~7 の整数値に対応するcos値だけを使う)
具体例として u=5 の場合についてcos関数部分をグラフ表示すると


・・・というものであるとわかる。

・・・となると、cosに掛かる α(u)・G(u) は、あるuに対応する周波数のコサイン波の「振幅」量に他ならないとわかり、
コレをcos関数に掛けることで、各 x の位置での波による変位を求めているとわかる。
(α(u)・G(u) がマイナス値の場合はコサイン波の上下が反転する)

Σ(つまり、逆変換定義式)はある位置 x での、0~7の各uに対応する周波数の波の変位を合計することだが、
注目すべきなのは、「振幅」はDCT変換結果のG(u)ではなく、それにα(u)を掛けた「α(u)・G(u)」だということ!!
なぜ離散コサイン変換の結果データ列が、各周波数成分ごとの振幅と言う物理的にわかりやすい意味のものでなく
そのような物理的な意味を持つには逆変換処理を1歩進めなければならないのかは・・・わからない。。。

さて、前回は量子化係数で割った「商」を求める形で量子化処理を行って変換を終えたので、
逆変換はこの「商」に量子化係数を掛けて、”量子化を受けたDCT係数”を得る所から始める。

AZ3~BC10セルに量子化係数で割った「商」がQ_G名で格納されているので、
コレにQ_tを掛けることでBG3~BJ10セルに量子化を受けたDCT係数を算出する。
BG3~BJ10セルをセレクトしておき、「=AZ3*Q_t」と入力して
Ctrl + Shift + Enter で関数入力する。



前々回の逆変換の行列式に示したように、逆変換の結果を数値で求めるのは
上記の結果をTRANSPOSE()関数で転置した上で、MMULT()関数で右からTrans_Mを掛ければ良い。
・・・・のだが、それではあんまりオモシロくないので、以下では先の議論を踏まえて
α(u)だけを適用して各コサイン関数をグラフ表示しつつ、値を合計して逆変換を求めることとする。
・・・で、とりあえず上記のBG3~BJ10セル範囲に名前を付ける。
(ここでは「QGQ」とした)

α(u)の適用はBN3~BQ10セルをセレクトしておき、「=mmult(Alfa,QGQ)」と記入して
Ctrl + Shift + Enter で関数入力する。



(「QGQを転置して、右からAlfaを掛けるのがスジではないか?」という議論もあろうが
・・・まぁ結果同じなんで・・・)
やはり、このセル範囲にも名前を付ける。(ここでは「AQGQ」とした)

次に、グラフ化のためのデータ表を作る準備処理のため、C13~J16セル範囲にAQGQを転置した。
(いい加減に折り返さないと、かなり横に細長くなったので・・・)
C13~J16セル範囲をセレクトして「=transpose(AQGQ)」と記入してCtrl + Shift + Enter で関数入力。



この範囲をC12~J12、C13~J13、C14~J14、C15~J15の行ごとに名前を付ける。
(上記の順にT_AQGQ_a、T_AQGQ_b、T_AQGQ_c、T_AQGQ_dとした)



・・・で、本格的にデータ表作り開始・・・

まず、C18~J18に u 値(0~7)を記入。
B19~B145に x 値を0.25ステップ(0~31.5)で記入。
(グラフ上、コサイン波を「らしく」表現するため今回は0.25ステップとした)
C19セルに「=T_AQGQ_a*COS(((2*MOD($B19,8)+1)*C$18*PI())/16)」を入力し、
C19~J49セル範囲にコピー。
同様にC51セルに「=T_AQGQ_b*COS(((2*MOD($B51,8)+1)*C$18*PI())/16)」を入力し、
C51~J81セル範囲にコピー。
C83セルに「=T_AQGQ_c*COS(((2*MOD($B83,8)+1)*C$18*PI())/16)」を入力し、
C83~J113セル範囲にコピー。
C115セルに「=T_AQGQ_d*COS(((2*MOD($B115,8)+1)*C$18*PI())/16)」を入力し、
C115~J145セル範囲にコピー。
K列にはC列~J列までの合計を出すようにSum()関数を入力。



ブロック間でグラフ曲線が不連続につながるのは見にくいので、50行・82行・114行はあえてブランクにする。
(この行ではK列のSum()関数も削除)

このデータ表を「散布図」でグラフ化すれば、各スペクトルのコサイン波とその合計の曲線が得られる。
・・・・が、このままではDCT変換(&量子化)前後で値がどれほど変化したのかわからないので
さらに一工夫する。

元の入力値を表示するには、データ表のL列に
「=IF(MOD(B19,1)=0,OFFSET($C$3,MOD(B19,8),QUOTIENT(B19,8),1,1),1000)」
の式を入力し、
条件付書式の設定で、例えばセル値が300以上の時に文字色を白に設定すると表が見た目すっきりする。
グラフ上では、このデータ系列の表示書式を「線なし」&「マーカ指定」にし、
縦軸の書式設定で「最大値を300」に固定してしまえば入力値だけがマーカ表示される。



同様にM列に「=IF(MOD(B19,1)=0,K19,1000)」を入力して
「線なし」&「マーカ指定」に書式設定すれば変換・再現値が明確に表示される。

出来上がりはこんなカンジ
(量子化係数がALL 1 だと入力値と再現値にほとんど差が出ない)



最新の画像もっと見る

コメントを投稿

ブログ作成者から承認されるまでコメントは反映されません。