一.实验原理
1.预测编码的基本原理
由于信源的相邻符号通常是相关的,利用信源相邻之间的相关性。根据某一模型利用以往的样本值对新样本进行预测,然后将样本的实际值与其预测值相减得到一个误差值,最后对这个误差值进行编码。
如果这个模型足够好,且样本序列在时间上相关性较强,则误差信号的幅度将远远小于原始信号,从而得到较大的数据压缩。
2.DPCM
DPCM是差分预测编码调制的缩写,是比较典型的预测编码系统。在DPCM中,需要注意的是预测器输入的是预测器的输入是已经编码的样本。因为在解码端,同样无法得到原始样本,只能得到存在误差的样本。因此,在DPCM编码器中实际内嵌了一个解码器,如编码器中虚线框中所示。
在一个DPCM系统中,有两个因素需要设计:预测器与量化器。理想情况下,预测器和量化器应该联合设计。但在实际中,采用一种次优的设计方法:分别进行线性预测器和量化器的优化设计。下图则为DPCM编码端与解码端的图示:
在本次实验中,采用的是固定预测器和均匀量化器。预测器采用的是左侧量化,对于图像中处于最左侧的一列像素,前面没有像素可以预测,则用预测灰度值的平均值128进行量化。
二.代码分析
int limit(int x)
{
if(x>255) return 255;
if(x<0) return 0;
return x;
}
......
qn = (int *)malloc(Info_header.biWidth*Info_header.biHeight*sizeof(int));
q = (unsigned char *)malloc(Info_header.biWidth*Info_header.biHeight);
rebuild = (unsigned char *)malloc(Info_header.biWidth*Info_header.biHeight);
int scale = 512 / (1 << Qbits);
for (int i = 0; i < Info_header.biHeight; i++)
{
qn[i*Info_header.biWidth ] = y_buf[i*Info_header.biWidth ] - 128;
qn[i*Info_header.biWidth ] = qn[i*Info_header.biWidth ] +1/ scale;
rebuild[i*Info_header.biWidth + j] = limit(qn[i*Info_header.biWidth &#