數據壓縮實驗四:DPCM 壓縮系統的實現和分析

一:實驗原理

1.DCPM編碼原理
DPCM是差分預測編碼調製的縮寫,是比較典型的預測編碼系統。DCPM編碼是對模擬信號幅度抽樣的差值進行量化編碼的調製方式,這種方式是用已經過去的抽樣值來預測當前的抽樣值,對它們的差值進行編碼。在DPCM系統中,需要注意的是預測器的輸入是已經解碼以後的樣本。之所以不用原始樣本來做預測,是因爲在解碼端無法得到原始樣本,只能得到存在誤差的樣本。因此,在DPCM編碼器中實際內嵌了一個解碼器,下面分別是編碼器系統框圖和解碼器系統框圖,可以看出,虛線框中框出的即爲編碼器中內嵌的解碼器。


上圖中,xn爲輸入的信號,通過與預測值相減得到預測誤差dn,dn經量化後得到d^n。d^n一方便送到信道進行傳輸,另一方面用於更新預測值。
在一個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無損編碼器,可以很大程度上降低平均碼長,提高壓縮效率。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章