鹿意茁 姜欣欣
鹿意茁 姜欣欣
(延邊大學(xué),吉林 延吉 133002)
摘 要:在多樣化的通信編碼系統(tǒng)中,本文主要對(duì)基帶傳輸?shù)倪^(guò)程進(jìn)行整合設(shè)計(jì),采取綜合性能較好的信源編碼與信道編碼。通過(guò)對(duì)哈夫曼編碼和曼徹斯特編碼算法的研究,針對(duì)信源特性,使用Python編程語(yǔ)言實(shí)現(xiàn)了信源信息到數(shù)字信號(hào)波形圖像的簡(jiǎn)化。結(jié)果表明:該系統(tǒng)明顯提高了傳輸效率。
關(guān)鍵詞:哈夫曼編碼;曼徹斯特編碼;通信編碼系統(tǒng)
中圖分類(lèi)號(hào):TP393文獻(xiàn)標(biāo)識(shí)碼:A文章編碼:1003-5168(2021)08-0028-03
Design and Implementation of a Communication Coding System
LU Yizhuo JIANG Xinxin
(Yanbian University,Yanji Jilin 133002)
Abstract: In the diversified communication coding system, this paper mainly designed the baseband transmission process, and adopted the source code and channel coding with better comprehensive performance. Through the research on Huffman coding and Manchester coding algorithm, according to the characteristics of the source, Python programming language was used to simplify the source information to the digital signal waveform image. The results show that the transmission efficiency is improved obviously.
Keywords: Haffman coding;Manchester code;communication coding system
本文設(shè)計(jì)了一種通信編碼系統(tǒng)。在基帶傳輸中,模擬信號(hào)需要經(jīng)過(guò)信源編碼成為數(shù)字基帶信號(hào),再經(jīng)過(guò)信道信號(hào)形成器變換成可采用的碼型在規(guī)定的信道傳輸[1]。信源編碼利用輸出符號(hào)序列的統(tǒng)計(jì)特性把信源輸出符號(hào)序列變換為最短的碼字序列,輸出編碼的比特流[2]。信道編碼的作用就是對(duì)在信道中傳輸?shù)臄?shù)字信號(hào)進(jìn)行糾、檢錯(cuò),使信息能無(wú)誤差地到達(dá)信號(hào)接收端進(jìn)行信號(hào)重建[3]。本系統(tǒng)采用哈夫曼編碼。哈夫曼碼的編碼方法并不唯一,對(duì)信源的統(tǒng)計(jì)特性并沒(méi)有特殊要求,編碼效率比較高,綜合性能優(yōu)于其他編碼,并且該編碼可提供一種同步機(jī)制,使接收端和發(fā)送端信號(hào)同步。為了方便對(duì)文本信息進(jìn)行編碼,該系統(tǒng)將信源編碼與信道編碼結(jié)合,通過(guò)程序?qū)崿F(xiàn)編碼算法的核心思想,設(shè)計(jì)出將文本信息編碼成基帶信號(hào)的系統(tǒng),在一定程度上降低傳統(tǒng)傳輸?shù)膹?fù)雜性,減少信源傳輸?shù)牟襟E,使傳輸變得更為精確。
1 系統(tǒng)整體設(shè)計(jì)
通信編碼系統(tǒng)整體設(shè)計(jì)框架如圖1所示。從圖1可知,該系統(tǒng)主要包括以下模塊:文本處理、信源編碼、信道編碼、數(shù)字信號(hào)波形處理。
1.1 文本處理
文本處理模塊的主要功能是統(tǒng)計(jì)字符。本系統(tǒng)字符統(tǒng)計(jì)是將文本放入TXT文件中,利用Python代碼讀取文本內(nèi)容,統(tǒng)計(jì)字符,找出每個(gè)字符在文中出現(xiàn)的次數(shù)。
1.2 信源編碼
該系統(tǒng)選擇哈夫曼編碼作為主要算法。第一,將TXT文本統(tǒng)計(jì)出的字符出現(xiàn)次數(shù){M1,M2,M3,…,Mi,…,Mn}當(dāng)作權(quán)值構(gòu)成n棵二叉樹(shù)的初始集合T={N1,N2,N3,…,Ni,…,Nn},將按升序排列的Mi作為每棵二叉樹(shù)Ni的根節(jié)點(diǎn),左右子樹(shù)均為空;第二,構(gòu)造新的二叉樹(shù),將T中的兩個(gè)根節(jié)點(diǎn)權(quán)值最小的樹(shù)作為左右子樹(shù),根節(jié)點(diǎn)的權(quán)值為其左右子樹(shù)的根節(jié)點(diǎn)的權(quán)值之和;第三,從T中刪除這兩棵樹(shù),并把新的二叉樹(shù)按升序排列加入集合T中;第四,重復(fù)第二和第三步,直到集合T中只含一棵二叉樹(shù),這就是哈夫曼樹(shù)。
從根節(jié)點(diǎn)開(kāi)始為每個(gè)節(jié)點(diǎn)路徑上的左分支賦予0,右分支賦予1,從根節(jié)點(diǎn)開(kāi)始到每個(gè)節(jié)點(diǎn)的路徑就是每個(gè)節(jié)點(diǎn)的編碼,即為對(duì)應(yīng)該權(quán)值的字符的哈夫曼編碼[4]。
1.3 信道編碼
該系統(tǒng)采用曼徹斯特編碼對(duì)信號(hào)進(jìn)行處理。第一,
讀取文本信息,將文本信息轉(zhuǎn)化為哈夫曼編碼的形式,存入新的TXT文件;第二,讀取哈夫曼編碼文件,該系統(tǒng)將“0”定義為由高電平到低電平的跳變,“1”定義為由低電平向高電平的跳變;第三,對(duì)文本的哈夫曼碼進(jìn)行重新編碼,成為曼徹斯特編碼形式存入新的TXT文件中。
1.4 數(shù)字信號(hào)波形處理
該模塊主要是利用Python繪圖表示出文本處理后字符經(jīng)過(guò)編碼后的數(shù)字信號(hào)波形。
2 系統(tǒng)編碼的實(shí)現(xiàn)
2.1 文本統(tǒng)計(jì)與單字符哈夫曼編碼
將英文文本信息believe in yourself存入TXT文件中。先一次性讀取全部文本信息,再統(tǒng)計(jì)每一個(gè)字符出現(xiàn)的次數(shù)。開(kāi)始進(jìn)行哈夫曼編碼時(shí),首先判斷字符出現(xiàn)的次數(shù)是否為0,若不為0,就建立值為次數(shù)的節(jié)點(diǎn),并得到該字母和其出現(xiàn)次數(shù)。為得到字符的哈夫曼樹(shù),首先定義節(jié)點(diǎn)的類(lèi),再根據(jù)哈夫曼樹(shù)思想定義函數(shù),找出所有次數(shù)中最小的兩個(gè)值,分別放入一個(gè)樹(shù)節(jié)點(diǎn)的左右節(jié)點(diǎn)中。起始為root,從左節(jié)點(diǎn)開(kāi)始,判斷Capcity屬性是否可以作為節(jié)點(diǎn)子節(jié)點(diǎn)的數(shù)量,如果可以,打印0,然后繼續(xù)子節(jié)點(diǎn)到最下一層,重復(fù)這個(gè)操作,最后打印出每一個(gè)字符的父節(jié)點(diǎn)到root根部的所有路徑,便得到了單字符的哈夫曼編碼。
文本統(tǒng)計(jì)與單字符哈夫曼編碼算法思路如算法1所示。
算法1:文本統(tǒng)計(jì)與單字符哈夫曼編碼算法。
先定義一個(gè)閾值MAXSIZE最大值為26。
首先定義節(jié)點(diǎn)MHNode類(lèi),利用__init__(self)函數(shù)傳遞參數(shù),賦值給節(jié)點(diǎn)屬性。
第一部分定義尋找兩個(gè)最小值FindTwoMinNode()函數(shù),輸入字符arr,字符長(zhǎng)度arr_len。因?yàn)閍rr中有很多為空值,第一步先取得第一個(gè)不是0的,第二步尋找更小的值,第三步先設(shè)置第二小的值的初始值,然后取得第二個(gè)小的值,第四步尋找第二小的值,最后一步返回較大的max_index,較小的min_index的值。
第二部分定義哈夫曼節(jié)點(diǎn)插入InsertMHNode()函數(shù),輸入arr,arrptr_len(閾值最大長(zhǎng)度)。首先進(jìn)行賦值操作,設(shè)置最后返回head,當(dāng)作root。新建立一個(gè)節(jié)點(diǎn),設(shè)置此節(jié)點(diǎn)為樹(shù)節(jié)點(diǎn),而不是子節(jié)點(diǎn),這個(gè)節(jié)點(diǎn)合并FindTwoMinNode()函數(shù)的兩個(gè)最小值,左邊為較大值,右邊為較小值。
第三部分定義哈夫曼樹(shù)遍歷PrintMHCode()函數(shù),輸入根節(jié)點(diǎn)root。先進(jìn)行賦值操作,然后遍歷哈夫曼樹(shù)。再進(jìn)行賦值操作,最后輸出head.data。
第四部分設(shè)置主函數(shù)main(),首先進(jìn)行賦值操作。第一步讀取文件,設(shè)置content為文件全部?jī)?nèi)容,將c(每一個(gè)字母)以content內(nèi)容循環(huán),統(tǒng)計(jì)每一個(gè)字母的數(shù)量。第二步進(jìn)行哈夫曼編碼,首先設(shè)置節(jié)點(diǎn),當(dāng)字母數(shù)量不是0時(shí),建立一個(gè)節(jié)點(diǎn),調(diào)用節(jié)點(diǎn)類(lèi)MHNode(),然后輸出“字母,數(shù)量”。第三步依次調(diào)用函數(shù)InsertMHNode(arr,arrptr_len)、函數(shù)FindTwoMinNode(arr,arr_len)和函數(shù)PrintMHCode(root),然后輸出字母統(tǒng)計(jì)結(jié)果,輸出PrintMHCode(root)函數(shù)的執(zhí)行結(jié)果。程序的執(zhí)行結(jié)果如圖2所示。各字符的哈夫曼編碼如圖3所示。
2.2 文本哈夫曼編碼算法
在運(yùn)用第一步字符操作結(jié)果的基礎(chǔ)上進(jìn)行編程,在原本定義的函數(shù)中進(jìn)行改變和增加函數(shù),定義了新的函數(shù),將哈夫曼樹(shù)保存到設(shè)置的空字典中,形成鍵名為字母、鍵值為哈夫曼編碼的字典。最后根據(jù)英文文本中字符的順序?qū)蝹€(gè)字符對(duì)應(yīng)的哈夫曼編碼保存在列表中,再拼接保存在另一個(gè)TXT文件中。
文本哈夫曼編碼算法思路如算法2所示。
算法2:文本哈夫曼編碼算法。
首先定義字典函數(shù)MHCodeDict(),輸入根節(jié)點(diǎn)root,鍵值d。先生成一個(gè)字典,鍵名為字母,鍵值為哈夫曼樹(shù)。然后進(jìn)行賦值運(yùn)算操作。
設(shè)置主函數(shù)main(),依次調(diào)用函數(shù)InsertMHNode(arr,arrptr_len)和函數(shù)FindTwoMinNode(arr,arr_len)。先設(shè)置d為空字典{}(保存哈夫曼樹(shù)到字典),執(zhí)行MHCodeDict(root,d)函數(shù),然后根據(jù)文章內(nèi)容打印哈夫曼樹(shù)到另一個(gè)文件。再設(shè)置lst_tmp為空列表[](遍歷每一個(gè)字符,將每一個(gè)字符的哈夫曼樹(shù)添加到列表),以寫(xiě)的方式打開(kāi)文件,然后添加寫(xiě)入lst_tmp。圖4為文本經(jīng)過(guò)信源編碼后的哈夫曼編碼。
2.3 曼徹斯特編碼與數(shù)字信號(hào)波形顯示算法
首先,一次讀取第二步生成哈夫曼碼的TXT文件,利用循環(huán)將原編碼的字符串轉(zhuǎn)化為數(shù)組,再根據(jù)系統(tǒng)的曼徹斯特編碼規(guī)則利用循環(huán)與判斷語(yǔ)句對(duì)原編碼進(jìn)行重新編碼,保存曼徹斯特編碼到新的TXT文件。其次,繪制信號(hào)波形圖時(shí),要先設(shè)置圖像所需要的幾個(gè)重要變量,根據(jù)曼徹斯特編碼的規(guī)則,每個(gè)比特的中間有一次電平跳變,變通一下為原編碼的一個(gè)比特寬度對(duì)應(yīng)新編碼的兩個(gè)比特寬度,兩個(gè)編碼設(shè)置為相同的高度,同時(shí)設(shè)定一些距離數(shù)據(jù),規(guī)定新編碼在原編碼的下方。最后,設(shè)置顯示圖像的一些變量。
將繪制過(guò)程分3個(gè)步驟:第一步,繪制所有的橫線(xiàn);第二步,繪制豎線(xiàn);第三步,繪制虛線(xiàn)。
曼徹斯特編碼與數(shù)字信號(hào)波形顯示算法思路如算法3所示。
算法3:曼徹斯特編碼與數(shù)字信號(hào)波形顯示算法。
第一步畫(huà)虛線(xiàn)draw_xuxian函數(shù),輸入畫(huà)虛線(xiàn)的相關(guān)參數(shù)draw,x,y,count,width,height,pen_color。判斷條件循環(huán)執(zhí)行畫(huà)虛線(xiàn)draw.line( (_x,y+j*_sp,_x,y+(j+1)*_sp),pen_color)函數(shù)。圖5表示曼徹斯特編碼。
第二步畫(huà)編碼draw_encoding函數(shù),輸入畫(huà)編碼的相關(guān)參數(shù)draw,x,y,lst,width,height,height_2,pen_color。判斷條件循環(huán)執(zhí)行畫(huà)編碼draw.line((_x1,_y,_x2,_y),pen_color)函數(shù)。
第三步畫(huà)main主函數(shù),首先讀取文件內(nèi)容傳入content,并將content內(nèi)容賦值給 old_encoding,創(chuàng)建新的數(shù)組。然后以old_encoding內(nèi)容循環(huán),如果i為‘0:new_encoding添加[‘1,‘0];若i為‘1:new_encoding添加[‘0,‘1]。再將f以寫(xiě)的形式讀取新文件,在f中寫(xiě)入new_encoding。最后進(jìn)行賦值操作,依次執(zhí)行函數(shù)draw_encoding(o*)、函數(shù)draw_encoding(n*)、函數(shù)draw_xuxian(*)和函數(shù)image1.save(*)[創(chuàng)建指定大小、白色底部的RGB(Red、Green、Blue)圖形]。
哈夫曼編碼和曼徹斯特編碼的數(shù)字信號(hào)波形顯示如圖6所示。
3 結(jié)語(yǔ)
該通信編碼系統(tǒng)對(duì)基帶傳輸?shù)倪^(guò)程進(jìn)行整合,結(jié)合數(shù)據(jù)結(jié)構(gòu)和Python編程技術(shù)開(kāi)發(fā)完成,實(shí)現(xiàn)對(duì)文本的處理和編碼,再利用Python的繪圖庫(kù)PIL對(duì)信號(hào)波形進(jìn)行繪制。Python語(yǔ)言語(yǔ)法簡(jiǎn)單易學(xué)[5]。使用Python編程語(yǔ)言根據(jù)相應(yīng)編碼方法編出代碼,降低了信息傳輸?shù)膹?fù)雜性,并使每一個(gè)算法都簡(jiǎn)單易懂,對(duì)通信編碼理論的學(xué)習(xí)有較大幫助??傊?,編碼結(jié)合處理是一個(gè)非常有發(fā)展前途的研究方向,這一研究方向的突破對(duì)信息傳輸和通信事業(yè)的發(fā)展具有深遠(yuǎn)意義。
參考文獻(xiàn):
[1]吳恩學(xué).簡(jiǎn)述數(shù)字信號(hào)的基帶傳輸與調(diào)制傳輸技術(shù)[J].中國(guó)廣電技術(shù)文萃,2014(4):62-89.
[2]劉敘含.基于圖像壓縮感知的信源信道聯(lián)合編碼系統(tǒng)研究[D].西安:西北工業(yè)大學(xué),2015:45.
[3]陳辰,周林,陳啟望,等.聯(lián)合編碼的中繼系統(tǒng)不等錯(cuò)誤保護(hù)機(jī)制[J].北京郵電大學(xué)學(xué)報(bào),2021(1):59-65.
[4]楊蘭.基于C語(yǔ)言的哈夫曼編碼的實(shí)現(xiàn)[J].軟件導(dǎo)刊,2012(9):40-42.
[5]張雪蓮.試析Python編程語(yǔ)言的特點(diǎn)及應(yīng)用[J].電腦編程技巧與維護(hù),2020(11):29-30.