《資訊理論》的實驗,比較有意思,實驗原理如下:
對於乙個通訊系統來說,資訊傳輸的有效性、可靠性、安全性和認證性是人們的主要目標。其中,資訊傳輸的有效性指的是盡可能的使用較短的時間和較少的裝置等資源來傳送盡可能多的資訊,而這一目的主要是通過信源編碼這個環節來實現的。
雖然有許許多多不同的信源編碼方法,但總的說來,信源編碼主要是通過減少或消除信源的剩餘度來提高傳輸效率的。而且,有時人們為了追求更高的傳輸效率,在滿足實際需求的情況下,還允許在編譯碼過程中存在一定程度的失真,這就是所謂的有失真壓縮。當然,針對不同的應用要求,可以選擇不同的壓縮編碼辦法,為了方便理解和實現,針對一般的英文文字,可以設計一種半位元組壓縮編碼方法來實現資料的壓縮。
(一)有損處理
1) 所有的英文本母不區分大、小寫(如:將所有的大寫英文本母變成小寫字母);
2) 保留標點符號:「,」、「。」、「?」「:」和「 」;
3) 將「!」和「;」變為「。」,其他符號全部變成「 」。
這樣,原來的英文文字就變成了乙個新的文字,該文字全部由26個英文本母和「,」、「。」、「?」、「:」以及「 」這31種符號組成,而且,文章的大意並沒有發生大的變化。可以認為這種失真是在允許的失真範圍之內的。
(二)資料壓縮
在計算機中,文字檔案中的每個符號都是由8位的ascii碼所構成,共有256種取值的可能。既然經過上述有損處理後檔案中只存在31種不同的符號,所以在壓縮編碼過程中只需對31種符號進行編碼,就可以大大壓縮文字檔案的資料量。考慮到各字母以及符號出現的概率,並考慮碼字的可分離性,可以採取以下的編碼方法來進行資料的壓縮:
1) 對於概率最大的15個符號分別編以「0000」~「1110」的碼字:
符號碼字
符號碼字
符號碼字
符號碼字
空格0000
e0100
l1000
s1100
a0001
f0101
n1001
t1101
c0010
h0110
o1010
u1110
d0011
i0111
r1011
2) 對於其餘的16個符號分別編以「1111 0000」~「11111111」的碼字。
符號碼字
符號碼字
符號碼字
符號碼字
,1111 0000
b1111 0100
m1111 1000
w1111 1100
.1111 0001
g1111 0101
p1111 1001
x1111 1101
?1111 0010
j1111 0110
q1111 1010
y1111 1110
:1111 0011
k1111 0111
v1111 1011
z1111 1111
這樣,一些最經常出現的符號從原來的8bit變為4bit,達到了資料壓縮的目的。
(三)解碼
解碼過程是編碼的逆過程,解碼後得到由這31種符號所組成的文字檔案。
(四)半位元組操作
在計算機中,所有對資料的操作都是以位元組(8bit)為單位的,而我們的編碼與解碼都是以半個位元組(4bti)為單位的,因此需要運用位操作來進行資料的控制:
1)編碼過程中,若待編碼字元為前15個符號之一,則寫入其4bit碼字;若待編碼字元為後16個符號之一,則先寫入前4bit「1111」,再寫入後4bit相應的碼字。寫入過程中,由於每次向輸出檔案的寫入是以位元組(8bit)為單位的,故需每湊足8bit(1位元組)執行一次向輸出檔案的寫入操作。
2)解碼過程中,每次讀取4bit。若不為「1111」,則根據此次讀取的4bit譯為相應的前15個符號之一;若為「1111」,則再次讀取4bit,並根據後4bit譯為相應的後16個符號之一。讀取過程中,由於每次向輸入檔案的讀取是以位元組(8bit)為單位的,故需將每次讀取的8bit(1位元組)分為兩部分:前後各4bit。
**如下:
有失真壓縮:
#include #include void main()
if((lp = fopen("bbb.txt","w")) == null)
ch = fgetc(fp);
while(ch != eof)
fclose(fp);
fclose(lp);
}
編碼:
#include #include static unsigned int outbfr;
static file *outfile,*infile;
static int outcnt;
static int outbytecnt;
static int inbytecnt;
void init()
void putbits(int val)
}void alignbits()
void main()
if((outfile=fopen("ccc.txt","wb"))==null)
init();
ch=fgetc(infile);
while(!feof(infile))
putbits(code);
ch=fgetc(infile);
}alignbits();
fclose(infile);
fclose(outfile);
printf("the compress rate is %d%%\n",(outbytecnt*100)/inbytecnt);
}
解碼:
#include #include static unsigned int inbfr;
static file *outfile,*infile;
static int incnt;
void init()
int getbits()
return code;
}void main()
if((outfile=fopen("ddd.txt","wb"))==null)
init();
inbfr=fgetc(infile);
while(!feof(infile))
}else
}} fputc(ch,outfile);
} fclose(infile);
fclose(outfile);
system("pause");
}
實驗原理中提到將15個常用字元編寫為4位(0000~1110),其餘編寫為8位(11110000~11111111),一次寫檔案操作需要8位。看程式之前還在疑惑,4位的字元之後需要等待下乙個4位的字元湊齊8位才能進行寫操作,但如果下乙個字元是是8位的如何處理,如果繼續等待,解碼之後字元順序就會錯位。結果程式中給出的處理方法是4位字元之後補4個0,雖然是種方法,但有些浪費空間。
程式分為三部分,每個部分有乙個main函式,可以合併成乙個檔案。
音訊壓縮編碼
只有當信源產生的訊號具有冗餘時,才能對其進行壓縮。下面介紹幾種音訊冗餘的概念 1 時域冗餘度 幅度的非均勻分布 統計表明,語音中的小幅度樣本比大幅度樣本出現的概率要高。週期之間的相關 在特定的瞬間,某一聲音往往只是有頻帶內少數頻率成分起作用。當聲音中只存在少數幾個頻率時,就會象波一樣,在週期與週期之...
RLE 壓縮編碼
rle全程run length encoding,翻譯為遊程編碼,又譯行程長度編碼,又稱變動長度編碼法 run coding 在控制論中對於二值影象而言是一種編碼方法,對連續的黑 白畫素數 遊程 以不同的碼字進行編碼。遊程編碼是一種簡單的非破壞性資料壓縮法,其好處是加壓縮和解壓縮都非常快。其方法是計...
單詞的壓縮編碼
1 描述820 給定乙個單詞列表,我們將這個列表編碼成乙個索引字串 s 與乙個索引列表 a。例如,如果這個列表是 time me bell 我們就可以將其表示為 s time bell 和 indexes 0,2,5 對於每乙個索引,我們可以通過從字串 s 中索引的位置開始讀取字串,直到 結束,來恢...