DPCM编解码原理
预测编码指根据某一模型利用旧的样本值对新样本值进行预测,然后将样本的实际值与其预测值相减得到误差值,对于这一误差值进行编码。如果模型足够好且样本序列在时间上相关性较强,那么误差信号的幅度将远远小于原始信号,从而得到较大的数据压缩结果。
预测编码方法分线性预测和非线性预测编码方法。线性预测编码方法也称差值脉冲编码调制法,简称DPCM。
DPCM编解码过程如下图:
编码器(Encoder)中Q是量化器,P是预测器。输入信号Xn是某一像素点的实际灰度值,Pn是对该像素点的预测值,dn 是预测误差,^(dn)是量化预测误差,^(Xn)=量化预测误差^(dn)+预测灰度值Pn,得到当前像素点的重建值,作为下一个像素点的预测值。
需要注意,预测器的输入是已经解码以后的样本,因为在解码端无法得到原始样本,只能得到存在误差的样本。因此,DPCM编码器中内嵌了一个解码器。
编程实现DPCM
实验过程
- 读取一个256级的灰度图像YUV,提取Y的数据
- 对该灰度图像进行预测,计算预测误差
- 对预测误差进行8bit、4bit、2bit、1bit均匀量化
- 对量化后的预测误差进行反量化,求重建值
- 将预测误差图像写入文件并输入Huffman编码器,得到输出码流、给出概率分布图并计算压缩比。
- 将原始图像文件输入Huffman编码器,得到输出码流、给出概率分布图并计算压缩比。
- 比较两种系统(1.DPCM+熵编码和2.仅进行熵编码)之间的编码效率(压缩比和图像质量)。压缩质量以PSNR进行计算。
核心代码
DPCM编解码器 DPCM.cpp
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <math.h>
#define u_int8_t unsigned __int8 //1个字节
#define u_int unsigned __int32 //4个字节
#define u_int32_t unsigned __int32
#define FALSE false
#define TRUE true
/**********定义bcpm变量及缓存***************/
FILE* qFile = NULL; //输出的预测误差图
FILE* dFile = NULL; //输出的重建图
char* qFileName = NULL; //预测误差图文件名
char* dFileName = NULL; //重建图文件名
float qn; //差值
u_int8