一、DPCM实验原理
需要注意的是预测器的输入是已经解码以后的样本。之所以不用原始样本来做预测,是
因为在解码端无法得到原始样本,只能得到存在误差的样本。因此,在DPCM编码器中实
际内嵌了一个解码器,如编码器中虚线框中所示。
二、实验代码分析
在实验2中的BMP2YUV的工程中添加以下函数即可,以下为添加代码:
//预测器为左侧预测
for (int j = 0; j<height; j++) //逐行遍历
{
for (i = 0; i<width; i++)
{
if (i==0) //每列第一个元素保持原来的样值不变,只是变换相应的数据类型
{
//量化
k = (*(yBuff + j*width + i) - 128) / 2 + 128; //k先是为量化后的预测误差,后用来存放反量化后的预测误差。
*(qBuff + j*width + i) = (unsigned char)k;
//反量化
k = ((*(qBuff + j*width + i )-128) * 2) + 128;
*(reBuff + j*width + i) = (unsigned char)k;
}
else
{ //当前差值信号为当前样值与上个预测样值的差值 并进行了量化
k = (*(yBuff + j*width + i) - *(reBuff + j*width + i - 1)) / 2 + 128;
*(qBuff + j*width + i) = (unsigned char)k;
//当前重建信号为 反量化后的差值信号与上一个重建信号的和
k = ((*(qBuff + j*width + i )-128) * 2) + *(reBuff + j*width + i - 1);
*(reBuff + j*width + i) = (unsigned char)k;
}
}
}
fwrite(reBuff,1,width*height,reBuff);
fwrite(yuv.U,1,width*height/4,reBuff);
fwrite(yuv.V,1,width*height/4,reBuff);
fwrite(qBuff,1,width*height,qBuf);
fwrite(yuv.U,1,width*height/4,qBuf);
fwrite(yuv.V,1,width*height/4,qBuf);//将预测误差图像和重建图像写入文件
三、实验结果
以下每幅图像按照不同文件名,顺序分别为原始bmp图、转换后的yuv图、差值图、重建后的yuv图、原始图的符号概率密度图、预测误差图的符号概率密度图
1、Birds.bmp
2、Camman256B.bmp
3、Clown256B.bmp