上一篇博文提到了离散傅里叶变换,地址如下:
http://blog.sina.com.cn/s/blog_7445c2940102wcdj.html
其实,离散余弦变换(DCT)就是离散傅里叶变换(DFT)的一部分,那么既然已经有了DFT,为什么还需要DCT呢?因为,DCT只取了DFT中的实部,对于很多应用来说,既方便又简洁,没有复数域捣乱。不像DFT,画个图还要考虑实部虚部,幅值相位神马的。但是,也就意味着DCT相比DFT包含的信息要少。同之前一样,我们先给出DCT的变换公式:
公式1
同DFT变换一样,我们也要考虑到离散与连续的区别,具体我就不在赘述,可以查看前一篇博客。
我们将上式向量化,得到如下公式:
离散余弦变换矩阵
同理,可以得到IDCT变换矩阵:
离散余旋反变换矩阵
matlab程序如下:
1.正变换:
N=width;
dctmtx=zeros(N);
dctmtx(1,:)=ones(1,N)/sqrt(N);
�T第一行为常数
for k=1:N-1
dctmtx(k+1,:)=sqrt(2)*cos((2*(0:N-1)+1)*k*pi/(2*N))/sqrt(N);
%生成X(1)到X(N-1)一共N个
end
2.反变换:
N=width;
idctmtx=zeros(N);
idctmtx(:,1)=ones(N,1)/sqrt(N);
%idct矩阵第一列为常数与C(0)相乘
for n=0:width-1
idctmtx(n+1,2:N)=cos((2*n+1)*(1:N-1)*pi/(2*N))*sqrt(2)/sqrt(N);
end
总结一下,DCT是取DFT的实部,也就可以通过DFT得到DCT,只不过先要将信号延展到2N-1。那么DFT的虚部是否也可以组成一个变换基底呢?答案是可以得,也就是离散正弦变换(DST)。但是在应用中很少见到DST,这是为什么呢?