C语言实现HDB3编码与译码
HDB3码
AMI码存在出现长的连0串的缺点,为了克服AMI码的缺点,人们设计了HDB3码。HDB3码的编码规则如下:
- 把原二进制序列变成AMI码,检查AMI码的连0情况,当无3个以上连0码时,AMI码就是HDB3码。(我感觉实际应用时可以不要转AMI码这一步)
- 当出现4个或4个以上的连0码时,则将每4个连0小段的第4个0变成非0码,这个非0码用符号V表示。原来二进制序列中所有的1码称为信码,用符号B表示。B码与V码的正负必须满足两个条件:①B码和V码各自都应该保持极性交替变换(确保编好的码中没有直流成分);②V码必须与前一个B码同极性,如果不能满足这个条件,则将4个连0码的第1个0码变成与V码同极性的补信码,补信码用符号B’表示,同时要做出调整以保持B码与B’码保持极性交替变换。
例如:
原二进制序列:0 1 0 0 0 0 1 HDB3码:0 1 0 0 0 1 -1 特殊情况: 原二进制序列:0 0 0 0 0 0 0 0 HDB3码:1 0 0 1 -1 0 0 -1
C语言HDB3编码
/*** @description: Encode the source code as HDB3 code.* @param: hdb3 is a pointer to HDB3 code.* source is a pointer to source code.* len is sequence length.* @return: none*/
void HDB3_Encoding(char *hdb3, const char *source, int len)
{ unsigned int i = 0;unsigned int cnt_0 = 0; //记录连续0的个数char last_b = 0; //记录上一个信码(含B及B')极性,初始化为0保证第一个信码极性为+1char last_v = -1; //记录上一个V码极性,初始化为-1保证第一个V码极性为+1for(i = 0; i < len; i++){if(!source[i]){//源码为0cnt_0++;if(cnt_0 >= 4){//连续0的个数大于4cnt_0 = 0;*(hdb3+i) = (last_v&0x80)?1:-1;//保证V码极性交替变化last_v = *(hdb3+i);//更新last_vif((last_v != last_b)){//如果当前V码与前一个信码极性不同,则增加同极性的补信码*(hdb3+i-3) = last_v;last_b = last_v;//更新last_b}}else{*(hdb3+i) = 0;}}else{//源码为1cnt_0 = 0;if(!last_b){//如果是第一个为1的源码,则对应HDB3码的信码极性为+1*(hdb3+i) = 1;last_b = 1;}else{*(hdb3+i) = (last_b&0x80)?1:-1;//保证信码极性交替变化last_b = *(hdb3+i);//更新last_b}}}
}
C语言HDB3译码
/*** @description: Decode HDB3 code.* @param: hdb3 is a pointer to HDB3 code.* source is a pointer to source code.* len is sequence length.* @return: none*/
void HDB3_Decoding(char *source, const char *hdb3, int len)
{unsigned int i = 0;unsigned int cnt_0 = 0; //记录连续0的个数char polarity = 0; //记录前一个信码(含B及B')极性for(i = 0; i < len; i++){if(!(*(hdb3+i))){//HDB3码为0,译码结果一定是0cnt_0++;*(source+i) = 0;}else{//HDB3码为1或-1if((*(hdb3+i) == polarity)&&(cnt_0 >= 2)){//如果当前HDB3码极性与前一个信码极性相同且连续0的个数大于等于2个//则当前HDB3码是V码,译码结果为0*(source+i) = 0;if(cnt_0 == 2){//如果连续0的个数等于2个,则前一个信码是补信码,译码结果为0*(source+i-3) = 0;//修改补信码处的译码结果}}else{//当前HDB3码是信码(含B及B'),译码结果是1*(source+i) = 1;polarity = *(hdb3+i);//记录信码极性}cnt_0 = 0;}}
}
将HDB3码的编、译码函数编译成Matlab可以调用的.mexw64文件后,用Matlab绘制的波形图如下图所示,可见译码结果与原二进制序列相同。
C语言实现HDB3编码与译码相关推荐
- Verilog实现HDB3编码译码
Verilog实现HDB3编码译码 前言 一.使用的软件 二.具体实现 1.模块介绍 2.模块的.V文件 三.仿真结果 四.总结 1.关于编程的结构 2.收获 五.附testbench文件 前言 本次 ...
- c语言赫夫曼树的编码与译码,哈夫曼树与编码译码实现
一.哈弗曼树的基本概念. 哈夫曼树,又称最优树,是一类带权路径长度最短的树.下面有几个概念: (1)路径. 树中一个结点到另一个结点之间的分支构成这两个结点之间的路径. (2)路径长度. 路径上的分枝 ...
- 电文的编码和译码,哈夫曼编码译码(C语言)
内容: 从键盘接收一串电文字符,输出对应的Huffman(哈夫曼)编码,同时,能翻译由Huffman编码生成的代码串,输出对应的电文字符串.设计要求: (1)构造一棵Huffman树: ...
- 电文的编码和译码c语言实现,电文的编码及译码.doc
数据结构课程设计 题目:电文的编码与译码 院系: 班级: 学号: 姓名: 2014-2015年度 第1学期 目录 一.题目:电文的编码与译码3 二.设计目标3 三.问题描述3 四.需求分析3 五.概要 ...
- 哈夫曼树编码和译码c语言,C++哈夫曼树编码和译码的实现
78 /*-----------创建工作---------------------------*/ 79 int s1,s2; 80 for (int i = n + 1; i < ...
- 算术编码、译码以及matlab实现
算术编码是一种采用的编码,我们用matlab语言来实现算术码的编码.译码过程. 首先,我们给定研究范围为 2元信号.用{0,1}符号来表示,然后我们假设发送方和接收方都知道符号0出现的概率p(0)和符 ...
- 优先级队列实现哈夫曼树的编码和译码
//优先级队列实现的哈夫曼树的编码和译码 #include<iostream> #include<queue> #include<string> using nam ...
- Swift3.0语言教程使用编码创建和初始化字符串
Swift3.0语言教程使用编码创建和初始化字符串 使用编码创建和初始化字符串 创建和初始化字符串除了可以使用上文中提到的方法外,还可以使用init(coder:)方法,此方法一般不常使用,其语法形式 ...
- r语言处理数据集编码_在强调编码语言或工具之前,请学习这3个基本数据概念
r语言处理数据集编码 重点 (Top highlight) I got an Instagram DM the other day that really got me thinking. This ...
- 信息论 哈夫曼编码 与 菲诺编码的实现(对一幅BMP格式的灰度图像(个人 证件照片)进行二元霍夫曼编码和译码。并进行编码效率的计算,对一幅BMP格式的灰度图像进行二 元Fano编码、译码 )
信息论 哈夫曼编码 与 菲诺编码的实现(对一幅BMP格式的灰度图像(个人 证件照片)进行二元霍夫曼编码和译码.并进行编码效率的计算,对一幅BMP格式的灰度图像进行二 元Fano编码.译码 ) 原始图片 ...
最新文章
- 在多线程 Python 程序中实现多目标不同缩进格式的 logging
- 常用的 服务器 与 交换机
- 计算机进阶操作,新手进阶Win7系统操作使用手册
- Linux中断处理流程
- Server Tomcat v8.0 Server at localhost was unable to start within 45 seconds. 报错详细
- DIV中文字不换行解决办法
- 如何通过提问成为更好的开发人员
- cache 计算机系统实验报告,西安交通大学计算机系统结构实验报告CACHE.doc
- stats | nls——求解非线性回归的待定参数
- 【报告分享】2019年中国互联网企业战投发展白皮书.pdf(附154页pdf下载链接)...
- Hive Union操作中的隐式转换
- 济南 天然气 暖气 物业费 水费 电费价格
- 湖州南浔张静江:“满堂花醉三千客,一剑霜寒四十州”
- 神经网络模型如何使用的,神经网络模型是干嘛的
- 3DGIS 与 BIM 融合技术方案
- python-函数参数和文档
- 干货!怎么写满意度调查报告?
- 计算机一级一分钟要打多少字,打字速度分几个等级,一分钟打多少个字算较快?...
- 杨森翔书法:立马越王台
- k8s pod控制器详解(ReplicaSet、Deployment、Horizontal Pod Autoscaler)