【北邮-本科-通信原理】第五章关于HDB3编码的C++实现

目录

一、HDB3码简介

二、实现思路

(1)当data【i】= 0时

(2)当data【i】=1时

(3)审计变量

三、代码部分

3.1、审计变量

3.2、data[ i ] == 0

3.2、data[ i ] == 1

3.3、更新flag

3.4、整体代码

3.5、运行结果

3.6、更多测试

四、错误日志

4.1、int8_t不能作为整型数据类型


一、HDB3码简介

HDB3(High Density Bipolar of code 3)码的全称是三阶高密度双极性码。

编码规则:

(a)将0编为0,将1交替编为±1;

(b)遇到连续四个零,将第四个零编为V,符号与前一个V相反;

(c)如果该V与前一个非零值符号不同,将第一个零编为B,符号与该V相同;

(d)将该V之后的1继续交替编为±1;

(e)重复以上步骤,最终将B和V都改为1,采用归零码成型。

bn

1000001100000000101
dn1+1000+V0-1+1-B00-V+B00+V-10+1
dn2+1-B00-V0+1-1+B00+V-B00-V+10-1
dn3-1+B00+V0-1+1-B00-V+B00+V-10+1
dn4-1000-V0+1-1+B00+V-B00-V+10-1

二、实现思路

现以第一个“1”编为“+1”,第一个“V”编为“+V”为例讲解:

    记 +V  == +2
    记 +B  == +3
    记第一个1标为+1
    记第一个V标为+V

任取一个待编码的数,非0即1,故分0、1两种情况讨论。

(1)当data【i】= 0时

其后三项都是0,那么这四项就组成了“连零4序列”,本项是该序列的序列头。那么data【i+3】就应该被编为“V”,本“V”正负号与上一个“V”的正负号相反;同时,若本“V”与上一非零值符号不同,则data【i】应标为“B”,符号与本“V”相同;

否则,0照抄。

(2)当data【i】=1时

如果这是第一个“1”:如果前面没有“V”,那编为“+1”;如果前面有“V”,那编为与“V”极性相反的极性;

否则,所有的“1”的正负号应与上一个非零元素的极性相反

(3)审计变量

故,需要有bool变量记录:循环执行一步后【非零值的正负】和【V的正负】。

三、代码部分

3.1、审计变量

bool exist_1 = 0;            //待编码是否出现过“1”
bool exist_V = 0;            //已编码是否出现过“±V”
bool flag = 0;		         //前一个非零值的符号
bool flag_for_V = (!first_V);//当前V的符号

3.2、data[ i ] == 0

对二、(1)的实现:

if (data[i] == 0)
{
	if ((i <= data.size() - 3) && (data[i + 1] == 0)
		&& (data[i + 2] == 0) && (data[i + 3] == 0))
	{
		data[i + 3] = (flag_for_V == 0) ? +2 : -2;
        //如果上一项的V是负的,则这项的V编为正的;
        //如果上一项的V是正的,则这项的V编为负的。
		flag_for_V = (!flag_for_V); //修改flag_for_V,记录当前的V的正负
		if (flag_for_V != flag)     //如果flag_for_V和上一个非零值极性不同
			data[i] = (flag_for_V == 1) ? +3 : -3;
                                    //则本项应即为±B,正负和当前V的正负相同
	}
}

3.2、data[ i ] == 1

对二、(2)的实现:

else if (data[i] == 1)
{
	if (exist_1 == 0)    //如果这是第一个“1”
	{
		exist_1 = 1;     //记录一下,现在已经有第一个“1”了
		if (exist_V == 0)flag = first_1;
            //如果前面除了“0”和“±V”(“±B”)之外什么都没有,那flag赋值为用户输入的规定
		else flag = (!flag_for_V);
            //否则,即前面可能有“±V”(“±B”),
            //那么flag赋值为上一个非零元素(即“V”)相反的极性。
		data[i] = (flag == 1) ? 1 : -1;
            //本“1”的极性,取决于flag的极性。
	}
	else data[i] = (flag == 1) ? -1 : 1;
        //如果已经存在过“1”了而又碰到“1”,那么“1”的极性与上一个非零元素极性相反。
}

也可以写做:

		else if (data[i] == 1)
		{
			if (exist_1 == 0 && exist_V == 0)
			{
				exist_1 = 1;
				flag = first_1;
				data[i] = (flag == 1) ? 1 : -1;
			}
			else data[i] = (flag == 1) ? -1 : 1;
		}

3.3、更新flag

if (data[i] != 0)flag = (data[i] > 0) ? 1 : 0;

如果当前data【i】非零(即“±B”、“±V”、“±1”),那么如果data【i】>0,flag记为1,否则记为0。

3.4、整体代码

#include <iostream>
#include <vector>
using namespace std;

/*
	记 +V  == +2
	记 +B  == +3
	记第一个1标为+1
	记第一个V标为+V
*/

void print_result(vector<int>data)
{
	for (int element:data)
	{
		switch (element)
		{
		case 2:cout << "+V" << " "; break;
		case -2:cout << "-V" << " "; break;
		case 3:cout << "+B" << " "; break;
		case -3:cout << "-B" << " "; break;
		default:cout << showpos << element << " "; break;
		}
	}
	cout << endl;
}

void HDB3_handler(vector<int>data,bool first_1,bool first_V)
{
	bool exist_1 = 0;
	bool exist_V = 0;
	bool flag = 0;		//前一个非零值的符号
	bool flag_for_V = (!first_V);//V的符号
	for (int i = 0; i < data.size(); i++)
	{
		if (data[i] == 0)
		{
			if ((i <= data.size() - 3) && (data[i + 1] == 0)
				&& (data[i + 2] == 0) && (data[i + 3] == 0))
			{
				exist_V = 1;
				data[i + 3] = (flag_for_V == 0) ? +2 : -2;
				flag_for_V = (!flag_for_V);
				if (flag_for_V != flag)
					data[i] = (flag_for_V == 1) ? +3 : -3;
			}
		}

		else if (data[i] == 1)
		{
			if (exist_1 == 0)
			{
				exist_1 = 1;
				if (exist_V == 0)flag = first_1;
				else flag = (!flag_for_V);
				data[i] = (flag == 1) ? 1 : -1;
			}
			else data[i] = (flag == 1) ? -1 : 1;
		}
		//else if (data[i] == 1)
		//{
		//	if (exist_1 == 0 && exist_V == 0)
		//	{
		//		exist_1 = 1;
		//		flag = first_1;
		//		data[i] = (flag == 1) ? 1 : -1;
		//	}
		//	else data[i] = (flag == 1) ? -1 : 1;
		//}
		if (data[i] != 0)flag = (data[i] > 0) ? 1 : 0;
	}
	print_result(data);
}

int main()
{
	system("color 0A");
	vector<int>data = { 1,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,1 };
	print_result(data);
	HDB3_handler(data,true,true);
	HDB3_handler(data, true, false);
	HDB3_handler(data, false, true);
	HDB3_handler(data, false, false);
	return 0;
}

3.5、运行结果

3.6、更多测试

int main()
{
	system("color 0A");
	vector<int>data = { 1,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,1 };
	vector<int>data_1 = { 1,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,0,1,0 };
	print_result(data_1); 
	HDB3_handler(data_1, true, true);
	HDB3_handler(data_1, true, false);
	//HDB3_handler(data,true,true);
	//HDB3_handler(data, true, false);
	//HDB3_handler(data, false, true);
	//HDB3_handler(data, false, false);
	return 0;
}

四、错误日志

4.1、int8_t不能作为整型数据类型

void print_result_2(vector<int8_t>data)
{
	for (auto it = data.begin(); it != data.end(); ++it)
		std::cout << *it << " ";
}

这段代码不能够打印出来vector,原因是:

所以不能为了更节省内存空间而将vector<int>写成vector<int8_t>。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

青山入墨雨如画

你的鼓励将是我创作的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值