【北邮-本科-通信原理】第五章关于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 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 |
dn1 | +1 | 0 | 0 | 0 | +V | 0 | -1 | +1 | -B | 0 | 0 | -V | +B | 0 | 0 | +V | -1 | 0 | +1 |
dn2 | +1 | -B | 0 | 0 | -V | 0 | +1 | -1 | +B | 0 | 0 | +V | -B | 0 | 0 | -V | +1 | 0 | -1 |
dn3 | -1 | +B | 0 | 0 | +V | 0 | -1 | +1 | -B | 0 | 0 | -V | +B | 0 | 0 | +V | -1 | 0 | +1 |
dn4 | -1 | 0 | 0 | 0 | -V | 0 | +1 | -1 | +B | 0 | 0 | +V | -B | 0 | 0 | -V | +1 | 0 | -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>。