实验4 DPCM编码

来源:互联网 发布:淘宝上开网店步骤 编辑:程序博客网 时间:2024/05/16 12:12

一、DPCM实验原理


DPCM是差分预测编码调制的缩写,是比较典型的预测编码系统。在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