JPEG解码:反DCT变换(一)
DCT(Discrete Cosine Transform)离散余弦变换是一种经典谱分析方法,属于离散傅立叶变换的一种特殊情况,即在变换后的傅立叶级数中只包括余弦项,变化后的数据比较集中。经过DCT变换可以将图片从色彩域转换到频率域,将原始图像的信息块转化为代表不同频率分量的系数集。它是一种广泛使用的压缩方法,首先把每个单独的彩色图像分量分成8×8图像块,然后经过二维DCT变换,其低频分量都集中在左上角,高频分量分布在右下角。变换之后还是8×8的数据块,也就是说DCT变换本身并没有起到压缩数据的作用,但是它为以后的数据压缩奠定了必不可少的基础。
经过DCT变换的数据有2个优点:1,信号常将其能量的大部分集中于频率域的一个小范围内,这样一来,描述不重要的分量只需要很少的比特数;2,频率域分解映射了人类视觉系统的处理过程,并允许后继的量化过程满足其灵敏度的要求。对于变换之后的8×8的数据矩阵块,矩阵最左上角的直流 (DC)系数幅度最大,以DC 系数为出发点向下、向右的其它DCT 系数,离DC 分量越远,频率越高,幅度值越小,即图像信息的大部分集中于直流系数及其附近的低频频谱上,离DC 系数越来越远的高频频谱几乎不含图像信息,甚至于只含杂波。
压缩图像是经过DCT变换之后的图像,我们要对压缩图像进行解压就要对压缩数据进行“反DCT变换(DCT逆变换)”。DCT逆变换的方法有好几种,我们这里采用行列分解的方法。
DCT逆变换的公式为:
可改写为:
f=AτFA
其中A为矩阵:
对上面的公式进行变形的
Y =FA
f =AT Y
fT =(AT Y)T =YT A
其中F的数据块。
经分析可知,完成一次DCT逆变换需要4步:
1:压缩数据块(8×8)矩阵与矩阵A(8×8)相乘,得到矩阵Y(8×8)。
2:对矩阵Y进行转秩得到(8×8)。
3:Y的转秩再与矩阵A相乘得到8×8的矩阵ft。
4:对ft 进行转秩得到f。
所以整个设计中需要两个模块,一个用于矩阵的相乘,两个用于矩阵的转秩。
总体设计如下:
A矩阵乘法器的作用是实现输入矩阵和A矩阵的相乘。注意A矩阵在乘法的右边。
iDCT变换的对象是8 ×8的数据单元,既输入数据共64个,按行输入,每8个数据为一行。每输入一行数据就分别和A矩阵的每一列进行乘加运算,每完成一次这样的乘加运算就输出一次结果。由于输入在左边,所以输出的按矩阵的行的序列输出的。比如,输入第一行数据,分别和A矩阵的各列相乘,按顺序输出8个结果,这8个结果就是输出矩阵的第一行;当输入第二行数据时,同样输出8个结果,这8个结果是输出矩阵的第二行。所以经过第一次矩阵乘法之后得到的是Y矩阵。
转秩就是对64个数据进行重新排列的结果。
如下图:
左边为未转秩的数据顺序,右边为转秩之后的数据顺序。