前言
参考知乎@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点信号

但是因为信号是离散的,可以看到此时的信号还并不为“偶函数”,所以为了让信号关于原点对称,我们考虑将整个延拓后的信号修正右移\frac{1}{2}单位

此时信号变为对称形式,它的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)
暂无评论,快来抢沙发吧~