鹿意茁 姜欣欣



鹿意茁 姜欣欣
(延邊大學,吉林 延吉 133002)
摘 要:在多樣化的通信編碼系統中,本文主要對基帶傳輸的過程進行整合設計,采取綜合性能較好的信源編碼與信道編碼。通過對哈夫曼編碼和曼徹斯特編碼算法的研究,針對信源特性,使用Python編程語言實現了信源信息到數字信號波形圖像的簡化。結果表明:該系統明顯提高了傳輸效率。
關鍵詞:哈夫曼編碼;曼徹斯特編碼;通信編碼系統
中圖分類號:TP393文獻標識碼: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
本文設計了一種通信編碼系統。在基帶傳輸中,模擬信號需要經過信源編碼成為數字基帶信號,再經過信道信號形成器變換成可采用的碼型在規定的信道傳輸[1]。信源編碼利用輸出符號序列的統計特性把信源輸出符號序列變換為最短的碼字序列,輸出編碼的比特流[2]。信道編碼的作用就是對在信道中傳輸的數字信號進行糾、檢錯,使信息能無誤差地到達信號接收端進行信號重建[3]。本系統采用哈夫曼編碼。哈夫曼碼的編碼方法并不唯一,對信源的統計特性并沒有特殊要求,編碼效率比較高,綜合性能優于其他編碼,并且該編碼可提供一種同步機制,使接收端和發送端信號同步。為了方便對文本信息進行編碼,該系統將信源編碼與信道編碼結合,通過程序實現編碼算法的核心思想,設計出將文本信息編碼成基帶信號的系統,在一定程度上降低傳統傳輸的復雜性,減少信源傳輸的步驟,使傳輸變得更為精確。
1 系統整體設計
通信編碼系統整體設計框架如圖1所示。從圖1可知,該系統主要包括以下模塊:文本處理、信源編碼、信道編碼、數字信號波形處理。
1.1 文本處理
文本處理模塊的主要功能是統計字符。本系統字符統計是將文本放入TXT文件中,利用Python代碼讀取文本內容,統計字符,找出每個字符在文中出現的次數。
1.2 信源編碼
該系統選擇哈夫曼編碼作為主要算法。第一,將TXT文本統計出的字符出現次數{M1,M2,M3,…,Mi,…,Mn}當作權值構成n棵二叉樹的初始集合T={N1,N2,N3,…,Ni,…,Nn},將按升序排列的Mi作為每棵二叉樹Ni的根節點,左右子樹均為空;第二,構造新的二叉樹,將T中的兩個根節點權值最小的樹作為左右子樹,根節點的權值為其左右子樹的根節點的權值之和;第三,從T中刪除這兩棵樹,并把新的二叉樹按升序排列加入集合T中;第四,重復第二和第三步,直到集合T中只含一棵二叉樹,這就是哈夫曼樹。
從根節點開始為每個節點路徑上的左分支賦予0,右分支賦予1,從根節點開始到每個節點的路徑就是每個節點的編碼,即為對應該權值的字符的哈夫曼編碼[4]。
1.3 信道編碼
該系統采用曼徹斯特編碼對信號進行處理。第一,
讀取文本信息,將文本信息轉化為哈夫曼編碼的形式,存入新的TXT文件;第二,讀取哈夫曼編碼文件,該系統將“0”定義為由高電平到低電平的跳變,“1”定義為由低電平向高電平的跳變;第三,對文本的哈夫曼碼進行重新編碼,成為曼徹斯特編碼形式存入新的TXT文件中。
1.4 數字信號波形處理
該模塊主要是利用Python繪圖表示出文本處理后字符經過編碼后的數字信號波形。
2 系統編碼的實現
2.1 文本統計與單字符哈夫曼編碼
將英文文本信息believe in yourself存入TXT文件中。先一次性讀取全部文本信息,再統計每一個字符出現的次數。開始進行哈夫曼編碼時,首先判斷字符出現的次數是否為0,若不為0,就建立值為次數的節點,并得到該字母和其出現次數。為得到字符的哈夫曼樹,首先定義節點的類,再根據哈夫曼樹思想定義函數,找出所有次數中最小的兩個值,分別放入一個樹節點的左右節點中。起始為root,從左節點開始,判斷Capcity屬性是否可以作為節點子節點的數量,如果可以,打印0,然后繼續子節點到最下一層,重復這個操作,最后打印出每一個字符的父節點到root根部的所有路徑,便得到了單字符的哈夫曼編碼。
文本統計與單字符哈夫曼編碼算法思路如算法1所示。
算法1:文本統計與單字符哈夫曼編碼算法。
先定義一個閾值MAXSIZE最大值為26。
首先定義節點MHNode類,利用__init__(self)函數傳遞參數,賦值給節點屬性。
第一部分定義尋找兩個最小值FindTwoMinNode()函數,輸入字符arr,字符長度arr_len。因為arr中有很多為空值,第一步先取得第一個不是0的,第二步尋找更小的值,第三步先設置第二小的值的初始值,然后取得第二個小的值,第四步尋找第二小的值,最后一步返回較大的max_index,較小的min_index的值。
第二部分定義哈夫曼節點插入InsertMHNode()函數,輸入arr,arrptr_len(閾值最大長度)。首先進行賦值操作,設置最后返回head,當作root。新建立一個節點,設置此節點為樹節點,而不是子節點,這個節點合并FindTwoMinNode()函數的兩個最小值,左邊為較大值,右邊為較小值。
第三部分定義哈夫曼樹遍歷PrintMHCode()函數,輸入根節點root。先進行賦值操作,然后遍歷哈夫曼樹。再進行賦值操作,最后輸出head.data。
第四部分設置主函數main(),首先進行賦值操作。第一步讀取文件,設置content為文件全部內容,將c(每一個字母)以content內容循環,統計每一個字母的數量。第二步進行哈夫曼編碼,首先設置節點,當字母數量不是0時,建立一個節點,調用節點類MHNode(),然后輸出“字母,數量”。第三步依次調用函數InsertMHNode(arr,arrptr_len)、函數FindTwoMinNode(arr,arr_len)和函數PrintMHCode(root),然后輸出字母統計結果,輸出PrintMHCode(root)函數的執行結果。程序的執行結果如圖2所示。各字符的哈夫曼編碼如圖3所示。
2.2 文本哈夫曼編碼算法
在運用第一步字符操作結果的基礎上進行編程,在原本定義的函數中進行改變和增加函數,定義了新的函數,將哈夫曼樹保存到設置的空字典中,形成鍵名為字母、鍵值為哈夫曼編碼的字典。最后根據英文文本中字符的順序將單個字符對應的哈夫曼編碼保存在列表中,再拼接保存在另一個TXT文件中。
文本哈夫曼編碼算法思路如算法2所示。
算法2:文本哈夫曼編碼算法。
首先定義字典函數MHCodeDict(),輸入根節點root,鍵值d。先生成一個字典,鍵名為字母,鍵值為哈夫曼樹。然后進行賦值運算操作。
設置主函數main(),依次調用函數InsertMHNode(arr,arrptr_len)和函數FindTwoMinNode(arr,arr_len)。先設置d為空字典{}(保存哈夫曼樹到字典),執行MHCodeDict(root,d)函數,然后根據文章內容打印哈夫曼樹到另一個文件。再設置lst_tmp為空列表[](遍歷每一個字符,將每一個字符的哈夫曼樹添加到列表),以寫的方式打開文件,然后添加寫入lst_tmp。圖4為文本經過信源編碼后的哈夫曼編碼。
2.3 曼徹斯特編碼與數字信號波形顯示算法
首先,一次讀取第二步生成哈夫曼碼的TXT文件,利用循環將原編碼的字符串轉化為數組,再根據系統的曼徹斯特編碼規則利用循環與判斷語句對原編碼進行重新編碼,保存曼徹斯特編碼到新的TXT文件。其次,繪制信號波形圖時,要先設置圖像所需要的幾個重要變量,根據曼徹斯特編碼的規則,每個比特的中間有一次電平跳變,變通一下為原編碼的一個比特寬度對應新編碼的兩個比特寬度,兩個編碼設置為相同的高度,同時設定一些距離數據,規定新編碼在原編碼的下方。最后,設置顯示圖像的一些變量。
將繪制過程分3個步驟:第一步,繪制所有的橫線;第二步,繪制豎線;第三步,繪制虛線。
曼徹斯特編碼與數字信號波形顯示算法思路如算法3所示。
算法3:曼徹斯特編碼與數字信號波形顯示算法。
第一步畫虛線draw_xuxian函數,輸入畫虛線的相關參數draw,x,y,count,width,height,pen_color。判斷條件循環執行畫虛線draw.line( (_x,y+j*_sp,_x,y+(j+1)*_sp),pen_color)函數。圖5表示曼徹斯特編碼。
第二步畫編碼draw_encoding函數,輸入畫編碼的相關參數draw,x,y,lst,width,height,height_2,pen_color。判斷條件循環執行畫編碼draw.line((_x1,_y,_x2,_y),pen_color)函數。
第三步畫main主函數,首先讀取文件內容傳入content,并將content內容賦值給 old_encoding,創建新的數組。然后以old_encoding內容循環,如果i為‘0:new_encoding添加[‘1,‘0];若i為‘1:new_encoding添加[‘0,‘1]。再將f以寫的形式讀取新文件,在f中寫入new_encoding。最后進行賦值操作,依次執行函數draw_encoding(o*)、函數draw_encoding(n*)、函數draw_xuxian(*)和函數image1.save(*)[創建指定大小、白色底部的RGB(Red、Green、Blue)圖形]。
哈夫曼編碼和曼徹斯特編碼的數字信號波形顯示如圖6所示。
3 結語
該通信編碼系統對基帶傳輸的過程進行整合,結合數據結構和Python編程技術開發完成,實現對文本的處理和編碼,再利用Python的繪圖庫PIL對信號波形進行繪制。Python語言語法簡單易學[5]。使用Python編程語言根據相應編碼方法編出代碼,降低了信息傳輸的復雜性,并使每一個算法都簡單易懂,對通信編碼理論的學習有較大幫助。總之,編碼結合處理是一個非常有發展前途的研究方向,這一研究方向的突破對信息傳輸和通信事業的發展具有深遠意義。
參考文獻:
[1]吳恩學.簡述數字信號的基帶傳輸與調制傳輸技術[J].中國廣電技術文萃,2014(4):62-89.
[2]劉敘含.基于圖像壓縮感知的信源信道聯合編碼系統研究[D].西安:西北工業大學,2015:45.
[3]陳辰,周林,陳啟望,等.聯合編碼的中繼系統不等錯誤保護機制[J].北京郵電大學學報,2021(1):59-65.
[4]楊蘭.基于C語言的哈夫曼編碼的實現[J].軟件導刊,2012(9):40-42.
[5]張雪蓮.試析Python編程語言的特點及應用[J].電腦編程技巧與維護,2020(11):29-30.