鹿意茁 姜欣欣
鹿意茁 姜欣欣
(延边大学,吉林 延吉 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.