離散コサイン変換

DCT

偶関数を位相をずらさない振幅の異なるcosの足し合わせで再現しちゃおうの変換

実用を考えると離散フーリエ変換は複素数を含んでいてとてもめんどくさいので実数だけで済む変換作っちゃいますかの流れ
代わりに出来上がる周波数スペクトルはcosの振幅と二値化された位相(0 or π)の情報しかない
ちなみに定義域のマイナス方面に情報を含まない関数も偶関数と見なしちゃえば、周波数スペクトルに変換できる

DFTは周期拡張で端に不連続が出るがDCTは偶対称拡張なので端が繋がるのでデータ圧縮用途的に都合よいらしい

色々形式があるがメジャーなのはDCT-II
Xk=∑n=0N−1xncos{πN(n+12)k}X_k = \sum_{n=0}^{N-1}x_n cos \{ \frac{\pi}{N}(n+ \frac{1}{2})k \}

逆変換
xn=1NX0+2N∑k=1N−1Xkcos{πN(n+12)k}x_n = \frac{1}{N}X_0+\frac{2}{N}\sum_{k=1}^{N-1}X_k cos \{ \frac{\pi}{N}(n+ \frac{1}{2})k \}
X0X_0の時だけある事情で特別扱い ← ToDo

当然O(n2)O(n^2)なので色んな高速化の手段が考えられてる
ANN で DCT を解く

JPEGのDCTを使ったデータ圧縮
https://www.shadertoy.com/view/sfK3zz#
シェーダでDCT解くとき、GPGPUが使えるなら共有メモリを使っていい感じに解けるが、使えないならマルチパスで解く
周波数インデックスkkを自身のピクセル位置から算出する感じになる
横成分のdct → 縦成分のdct → 縦成分のidct → 横成分のidct
また、 ブロックサイズが 8x8 で固定の場合 cos の項は与えられるデータに依らないので事前計算で用意したテーブルを用いて計算する方が軽く済む
n,kn, kでどれを参照するか決める
DCTで得たスペクトルを量子化することでエントロピーが下がり後の操作でのデータ圧縮に繋がる
この時の量子化もいい感じになるようなテーブルがあるそうな