演算法學習筆記(46): 離散餘弦變換(DCT)

jeefy發表於2024-03-16

前置知識:離散傅立葉變換

傅立葉變換在上文中更多的是 OI 中的理解以及應用。但是傅立葉變換奧秘還很多。

回顧 \(\omega_n\) 在傅立葉變換中的定義:\(e^{i \frac {2\pi} n}\),存在 \(\omega_n^n = 1\) 的性質。意味著離散傅立葉變換實際上是週期性的,這也變相的解釋了為什麼存在迴圈卷積的性質。

傅立葉級數

我們回顧什麼是傅立葉級數。傅立葉斷言,對於任何週期訊號 \(x(t)\) 都可以表示為成諧波關係的虛指數訊號的線性組合,即:

\[x(t) = \sum_{k = - \infty}^{\infty} a_k e^{jk \omega_0 t} \]

雖然後來證明當 \(x(t)\) 滿足狄裡赫利條件時才成立……

週期訊號 \(x(t)\) 滿足存在一個正值 \(T\) 滿足:

\[\forall t, x(t) = x(t + T) \]

最小的 \(T\) 稱為基波週期,\(w_0 = \frac {2\pi} T\) 稱為基波頻率。

如果我們知道了一個 \(x(t)\) 該如何求 \(a_k\) 呢?

利用積分:

\[\int_0^T x(t) e^{-jn \omega_0 t} dt = \int_0^T \sum_{k = - \infty}^{\infty} a_k e^{jk\omega_0 t} e^{-jn \omega_0 t} dt \]

將後面變形:

\[\int_0^T \sum_{k = - \infty}^{\infty} a_k e^{jk\omega_0 t} e^{-jn \omega_0 t} dt = \sum_k a_k \left[ \int_0^T e^{j(k - n)\omega_0 t} dt \right] \]

注意到:

\[\int_0^T e^{j(k - n)\omega_0 t} dt = \int_0^T \cos[(k - n)\omega_0 t] dt + i \int_0^T \sin[(k - n) \omega_0 t] dt \]

中,存在:

\[\int_0^T \sin[(k - n) \omega_0 t] dt = \begin{cases} T & k = n \\ 0 & k \ne n \end{cases} \]

所以:

\[a_k = \frac 1 T \int_0^T x(t) e^{-jk\omega_0 t} dt \]

DCT 變換與 DFT 的聯絡

DCT 實際上就是 DFT 的一種特殊形式。

在傅立葉級數的推導中:

\[\int_0^T \sin[(k - n) \omega_0 t] dt = \begin{cases} T & k = n \\ 0 & k \ne n \end{cases} \]

是非常有趣的。

這反映出瞭如果對一個週期為 \(T\),並且週期內是個奇函式的函式 \(\int_0^T\),結果一定 \(= 0\),反之不為 \(0\)

那麼我們考慮將一個一般的週期訊號變成一個週期內的偶函式,這樣和 \(\sin\) 這個奇函式相乘後還是奇函式,積分出來也就沒了,從而使得 DFT 的虛部沒了。

上面所說的連續的情況,但是實際上離散的情況也是一樣。

考察 DFT 的式子:

\[b_k = \sum_{i = 0}^{n - 1} \omega_n^{ik}a_i \]

\(m = 2n\),使得 \(a_k = a_{m - k - 1}\),那麼其 DFT:

\[b_k = \sum_{i = 0}^{m - 1} \omega_m^{ik} a_i = \sum_{i = 0}^{n - 1} a_i \left(\omega^{ik} + \omega^{(2n-k-1)k}\right) \]

發現並不優美,考慮將冪平移 \(\frac k 2\)

\[\begin{aligned} b_k &= \sum_{i = 0}^{m - 1} a_j \omega^{kj + \frac k 2} \\ &= \sum_{i = 0}^{n - 1} a_j \left[ \left(\cos \frac {\pi k (n + \frac 12)} n + \cos \frac {- \pi k (n + \frac 12)} n \right) + i\left(\sin \frac {\pi k (n + \frac 12)} n + \sin \frac {- \pi k (n + \frac 12)} n \right) \right] \\ &= 2 \sum_{i = 0}^{n - 1} a_j \cos \frac {\pi k(n + \frac 12)} n \end{aligned} \]

中間是利用 \(e^{ix} = \cos x + i \sin x\) 展開推導而來。

發現虛部直接沒了,這符合前面得出的結論。

然後我們成功的學會了 DCT。

IDCT

由於 DCT 本質上就是 DFT,所以 IDCT 本質上就是 IDFT。所以理解是簡單的了。

相關文章