一:實驗原理
1.DCPM編碼原理
DPCM是差分預測編碼調製的縮寫,是比較典型的預測編碼系統。DCPM編碼是對模擬信號幅度抽樣的差值進行量化編碼的調製方式,這種方式是用已經過去的抽樣值來預測當前的抽樣值,對它們的差值進行編碼。在DPCM系統中,需要注意的是預測器的輸入是已經解碼以後的樣本。之所以不用原始樣本來做預測,是因爲在解碼端無法得到原始樣本,只能得到存在誤差的樣本。因此,在DPCM編碼器中實際內嵌了一個解碼器,下面分別是編碼器系統框圖和解碼器系統框圖,可以看出,虛線框中框出的即爲編碼器中內嵌的解碼器。
在一個DPCM系統中,有兩個因素需要設計:預測器和量化器。理想情況下,預測器和量化器應進行聯合優化。實際中,採用一種次優的設計方法: 分別進行線性預測器和量化器的優化設計。本次實驗中,採用固定預測器和均勻量化器。,預測器採用左側預測,量化器採用8比特均勻量化,通過對一個256級的灰度圖像(或者彩色圖像的亮度部分)進行DPCM編碼,驗證DCPM編碼的編碼效率。
二:實驗流程及代碼分析
實驗流程框圖:
關鍵代碼分析:
本實驗工程目錄如下:
Huffman編碼器工程目錄如下:(Huffman編碼上一實驗已給出,這裏不再贅述)
該DCPM編碼實驗主要包括一個主文件和一個rgb2yuv函數文件,是在實驗2的基礎上經添加相關代碼,添加的代碼下面將一一給出,rgb2yuv函數在之前實驗2中已給出,這裏不再贅述。
main.cpp文件中:
/*初始化變量*/
//定義變量
char* bmpFileName = NULL;
char* yuvFileName = NULL;
/*add by yangyulan*/
char* yuv1FileName = NULL;//用於存儲重建圖像的文件
char* qFileName = NULL;//用於存儲量化誤差圖像的文件
/*end by yangyulan*/
bmpFileName = argv[1];
yuvFileName = argv[2];
/*add by yangyulan*/
yuv1FileName = argv[3];
qFileName = argv[4];
u_int8_t* q = NULL;//指向量化誤差buffer的指針
/*end by yangyulan*/
u_int8_t* rgbBuf = NULL;
u_int8_t* yBuf = NULL;
u_int8_t* uBuf = NULL;
u_int8_t* vBuf = NULL;
/*打開文件*/ /*add by yangyulan */
FILE *yuv1File= fopen(yuv1FileName, "ab");
if (yuv1File == NULL)
{
printf("can not find yuv file\n");
exit(1);
}
FILE *qFile= fopen(qFileName, "ab");
if (qFile == NULL)
{
printf("can not find q file\n");
exit(1);
}
/*end by yangyulan*/
/*開闢緩衝區*/ /*add by yangyulan*/
q = (u_int8_t*)malloc(width*height);
/*end by yangyulan*/
/*將原圖像進行rgb2yuv處理並輸出灰度文件後,進行如下DPCM編碼處理*//*add by yangyulan*/
for ( int i = 0; i < height; i++)
{
float yp=128;//yp爲預測值
for (int j = 0; j < width; j++)
{
float m=(float)*(yBuf+i*width+j)-yp;//差值
m/=2;//量化
*(q+i*width+j)=(u_int8_t)(m+128);//量化誤差
//m*=2;//反量化
*(yBuf+i*width+j)=(u_int8_t)(m+yp);//重建後的樣本
yp=(float)*(yBuf+i*width+j);//更新預測值
}
}
//將重建後的值寫入文件
fwrite(yBuf, 1, width*height, yuv1File);
++videoFramesWritten;
//將量化誤差寫入文件
fwrite(q,1,width*height,qFile);
/*end by yangyulan*/
三:實驗結果
本實驗經DCPM編碼後共生成三個yuv文件:原圖像文件,經DPCM編碼後重建圖像文件和量化誤差文件。
原圖像 | 預測誤差圖像 | 重建圖像 |
從上圖可以看出,經過DPCM編碼之後的重建圖像比未經編碼的原圖像質量有所下降,原因在於在對預測誤差的8比特量化引起了量化誤差。
圖像文件(包括原圖像和DPCM編碼後的預測誤差圖像)經Huffman編碼後的概率分佈圖和壓縮比:
原圖像 | 預測誤差圖像 | 原圖像概率分佈 | 預測誤差圖像概率分佈 | 原圖像壓縮比 | 預測誤差圖像壓縮比 |
2.220 | 1.107 | ||||
1.103 | 1.524 | ||||
1.156 | 2.681 | ||||
1.121 | 2.500 | ||||
從上表可以看出,將經過DPCM編碼的預測誤差圖像送入Huffman編碼器,相對於未經DPCM編碼的圖像,其符號的概率分佈更加集中,這表示可以用更加少的碼字來進行編碼,降低了平均碼長,從而提高了壓縮效率。
四:實驗結論
1、經過DPCM編碼,可以提高數據所佔的比特數,降低所佔內存,從而提高傳輸效率。但因爲DPCM編碼爲有損編碼,在進行量化的過程中會引入量化誤差,因此相較於原圖像,其圖像質量會有所下降。
2、將圖像進行DPCM有損編碼後,送入到Huffman無損編碼器,可以很大程度上降低平均碼長,提高壓縮效率。