简要介绍离散余弦变换(DCT)

前言

参考知乎@DBinary 的文章

离散余弦变换(DCT)

介绍

首先回顾DFT的公式
::: align-center
\begin{aligned} &\hat{x}_k=\sum_{j=0}^{N-1}x_jw_N^{jk}\\ &=\sum_{j=0}^{N-1}x_j(\cos\frac{2\pi jk}{N}-i\sin\frac{2\pi jk}{N})\\ &=\sum_{j=0}^{N-1}x_j\cos\frac{2\pi jk}{N}-i\sum_{j=0}^{N-1}x_j\sin\frac{2\pi jk}{N} \end{aligned}

:::
可以看到,DFT变换结果的实部只有余弦函数,虚部只有正弦函数
不妨令
::: align-center
\begin{aligned} &Re[k]=\sum_{j=0}^{N-1}x_j\cos\frac{2\pi jk}{N}\\ &Im[k]=\sum_{j=0}^{N-1}x_j\sin\frac{2\pi jk}{N} \end{aligned}

:::

在信号x_j为全实数信号时,容易得到
::: align-center
\begin{aligned} &Re[-k]=Re[k]\\ &Im[-k]=-Im[k] \end{aligned}

:::
x_j是一个偶信号,那么变换后的虚部会相互抵消
::: align-center
但是对于一般信号该怎么办呢?

:::
这里我们就需要用到与计算余弦级数时相同的思想,即进行偶延拓

将原来离散的位于[0,N-1]内的N点实信号进行偶延拓至[-N,N-1]内的2N点信号
周期延拓后的信号.jpg
但是因为信号是离散的,可以看到此时的信号还并不为“偶函数”,所以为了让信号关于原点对称,我们考虑将整个延拓后的信号修正右移\frac{1}{2}单位
修正后的信号.jpg
此时信号变为对称形式,它的DFT为
::: align-center
\hat{x}_k=\sum_{j=-N+\frac{1}{2}}^{N-\frac{1}{2}}x_{j-\frac{1}{2}}w_{2N}^{jk}

:::
将其展开后,容易得知虚数部分已经为零,故得
::: align-center
\hat{x}_k=\sum_{j=-N+\frac{1}{2}}^{N-\frac{1}{2}}x_{j-\frac{1}{2}}\cos(\frac{2\pi jk}{2N})=2\sum_{j=\frac{1}{2}}^{N-\frac{1}{2}}x_{j-\frac{1}{2}}\cos(\frac{\pi jk}{N})

:::
之后换元求和索引,令n=j-\frac{1}{2}
::: align-center
\hat{x}_k=2\sum_{n=0}^{N-1}x_n\cos(\frac{(n+\frac{1}{2})\pi k}{N})

:::
这就是DCT的变换公式(DCT-II型,非归一化形式)

而它的逆变换公式为
::: align-center
x_n=\frac{1}{N}(\frac{1}{2}\hat{x}_0+\sum_{k=1}^{N-1}\hat{x}_k\cos(\frac{(n+\frac{1}{2})\pi k}{N}))

:::

有一些教材也会省略DCT正向变换公式前面的2,但在逆变换时,前面乘2修正,效果是相同的
::: align-center
\begin{aligned} &\hat{x}_k=\sum_{n=0}^{N-1}x_n\cos(\frac{(n+\frac{1}{2})\pi k}{N})\\ &x_n=\frac{2}{N}(\frac{1}{2}\hat{x}_0+\sum_{k=1}^{N-1}\hat{x}_k\cos(\frac{(k+\frac{1}{2})\pi n}{N}))\\ \end{aligned}

:::

DCT相较于DFT具有更好的频域能量聚集度,对于不重要的品与信息可以直接过滤掉,因此DCT变换被广泛用于图像压缩算法,比如JPEG算法

游客

全部评论 (0)

暂无评论,快来抢沙发吧~