資料壓縮實驗報告3 LZW編譯碼

2021-10-05 10:49:41 字數 4509 閱讀 9341

寫在前面:本次實驗由老師寫好了lzw編碼的**,先理解了已有**之後,自己再寫解碼**時比較容易。下面給出完整的**以及實驗結果

bitio.h(全部由老師給出,自己寫了一些注釋)

/*

* declaration for bitwise io

* * vim: ts=4 sw=4 cindent

*/#ifndef __bitio__

#define __bitio__

#include

typedef

struct

bitfile;

bitfile *

openbitfileinput

(char

*filename)

;bitfile *

openbitfileoutput

(char

*filename)

;void

closebitfileinput

( bitfile *bf)

;void

closebitfileoutput

( bitfile *bf)

;int

bitinput

( bitfile *bf)

;unsigned

long

bitsinput

( bitfile *bf,

int count)

;void

bitoutput

( bitfile *bf,

int bit)

;void

bitsoutput

( bitfile *bf,

unsigned

long code,

int count)

;#endif

// __bitio__

bitio.cpp(全部由老師給出)

/*

* definitions for bitwise io

* * vim: ts=4 sw=4 cindent

*/#define _crt_secure_no_warnings

#include

#include

#include

"bitio.h"

bitfile *

openbitfileinput

(char

*filename)

bitfile *

openbitfileoutput

(char

*filename)

void

closebitfileinput

( bitfile *bf)

void

closebitfileoutput

( bitfile *bf)

intbitinput

( bitfile *bf)

} value = bf-

>mask & bf-

>rack;

bf->mask >>=1;

if(0==bf-

>mask) bf-

>mask =

0x80

;return((

0==value)?0

:1);

}unsigned

long

bitsinput

( bitfile *bf,

int count)

return value;

}void

bitoutput

( bitfile *bf,

int bit)

}void

bitsoutput

( bitfile *bf,

unsigned

long code,

int count)

}#if 0

intmain

(int argc,

char

**ar**)

}else}if

(2}else

}while(1

)return0;

}#endif

lzw_e.cpp(解碼部分由自己編寫,其他部分由老師給出,自己寫了一部分注釋)

/*

* definition for lzw coding

* * vim: ts=4 sw=4 cindent nowrap

*/#define _crt_secure_no_warnings

#include

#include

#include

"bitio.h"

#define max_code 65535

struct

dictionary[max_code+1]

;//陣列下標為編碼

int next_code;

int d_stack[max_code]

;// stack for decoding a phrase

#define input(f) ((int)bitsinput( f, 16))

#define output(f, x) bitsoutput( f, (unsigned long)(x), 16)

intdecodestring

(int start,

int code)

;void

initdictionary

(void);

void

printdictionary

(void)}

intdecodestring

(int start,

int code)

return count;

}void

initdictionary

(void

) dictionary[

255]

.nextsibling =-1

;//最後乙個根節點沒有下乙個兄弟

next_code =

256;}/*

* input: string represented by string_code in dictionary,

* output: the index of character+string in the dictionary

* index = -1 if not found

*/int

indictionary

(int character,

int string_code)

return-1

;}void

addtodictionary

(int character,

int string_code)

else

next_code ++;}

void

lzwencode

( file *fp, bitfile *bf)

else

string_code = character;

//將新字元做為字首}}

output

( bf, string_code)

;//輸入檔案掃瞄完成,將最後未輸出的字首輸出

}void

lzwdecode

( bitfile *bf, file *fp)

else

phrase_length =

decodestring(0

, new_code)

; character = d_stack[phrase_length -1]

;while

(phrase_length >0)

if(max_code > next_code)

addtodictionary

(character, last_code)

; last_code = new_code;

//新編碼變為舊編碼}}

intmain

(int argc,

char

**ar**)if(

'e'== ar**[1]

[0])

}elseif(

'd'== ar**[1]

[0])

}else

return0;

}

測試**:先寫乙個a.dat,將abbababac寫入其中。經過lzw編碼後生成b.dat,解碼後生成c.dat,可見編碼再解碼後的檔案與原檔案一致。

選擇10種不同格式的檔案進行lzw編碼並比較壓縮效率:

除了bdf(quartus ii原理**件)和vwf(quartus ii**波形檔案)之外,其他檔案在進行lzw編碼後大小反而增加了。

資料壓縮原理實驗4 實驗報告

一 實驗原理 1 編碼 利用信源相鄰符合之間的相關性 根據某一模型利用以往的樣本值對新樣本進行 然後將樣本的實際值與其 值相減得 到乙個誤差值,最後對這一誤差值進行編碼。如果模型足夠好,且樣本序列在時間上相關性 較強,則誤差訊號的幅度將遠遠小於原始訊號 從而得到較大的資料壓縮。2 dpcm編譯碼原理...

資料壓縮實驗一 yuv轉rgb格式實驗報告

一 實驗基本原理 yuv轉 rgb格式轉換公式 r y 1.4020 v 128 g y 0.3441 u 128 0.7141 v 128 b y 1.7720 u 128 分析 由rgb到 yuv格式的轉換公式 y 0.2990r 0.5870g 0.1140b r y 0.7010r 0.58...

資料壓縮實驗報告2 bmp轉yuv

1 bmp檔案格式 bmp bitmap 是windows作業系統中的標準影象檔案格式,可分為裝置相關位圖 ddb 和裝置無關位圖 dib 使用十分廣泛。它採用位對映存貯格式,除了影象深度可選外,絕大多數無壓縮,因此所佔空間很大。bmp檔案的影象深度可選1bit,4bit,8bit,16bit及24...