算法学习笔记(46): 离散余弦变换(DCT)

前置知识:离散傅里叶变换

傅里叶变换在上文中更多的是 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_i \omega^{ki + \frac k 2} \\ &= \sum_{i = 0}^{n - 1} a_i \left[ \left(\cos \frac {\pi k (i + \frac 12)} n + \cos \frac {- \pi k (i + \frac 12)} n \right) + i\left(\sin \frac {\pi k (i + \frac 12)} n + \sin \frac {- \pi k (i + \frac 12)} n \right) \right] \\ &= 2 \sum_{i = 0}^{n - 1} a_i \cos \frac {\pi k(i + \frac 12)} n \end{aligned} \]

中间是利用 \(e^{ix} = \cos x + i \sin x\) 展开推导而来。

发现虚部直接没了,这符合前面得出的结论。

然后我们成功的学会了 DCT。

IDCT

由于 DCT 本质上就是 DFT,所以 IDCT 本质上就是 IDFT。所以理解是简单的了。

posted @ 2024-03-16 21:24  jeefy  阅读(75)  评论(0编辑  收藏  举报