网络——数字数据编码

对于数字数据编码成数字信号,有以下6种方式:
在这里插入图片描述

1. 非归零编码NRZ

高电平为1,低电平为0;
编码容易实现,但没有检错功能,且无法判断一个码元的开始和结束,以至于收发双发难以保持同步。

2. 曼彻斯特编码 ※※※

将一个码元分成两个相等的间隔, 前低后高表示 1 , 0 则相反;也可以采用相反的规定 {\color{Red}前低后高表示1,0则相反;也可以采用相反的规定} 前低后高表示10则相反;也可以采用相反的规定
该编码的特点是在每个码元的中间出现电平跳变,每一个码元都被调成两个电平,所以 数据传输速率只有调制速率的 1 / 2 {\color{Red}数据传输速率只有调制速率的1/2} 数据传输速率只有调制速率的1/2

3. 差分曼彻斯特编码

信号电平在下一个时钟周期发生了翻转,则为0,否则为1。(同NRZI)
该编码的特点是在每个码元的中间也出现电平跳变,可以实现自同步;抗干扰性强于曼彻斯特编码。

4. 归零编码RZ

在每一小段的时钟周期内,后半段会回到低电平的位置

5. 反向不归零编码NRZI

信号电平翻转表示0,信号电平不变表示1。(同差分曼彻斯特编码,但无周期内的电平跳变)

6. 4B/5B编码(了解)

在比特流中插入额外的比特以打破一连串的0或1,就是用5个bit编码4个bit的数据,编码效率为80%。

【例】若下图为10BaseT网卡接收到的信号波形,则该网卡收到的比特串是_____。
在这里插入图片描述
A 0011 0110
B 1010 1101
C 0101 0010
D 1100 0101
【分析】在每个周期发生了跳变,那么可能是归零编码NRZ,曼彻斯特,差分曼彻斯特这三种;而归零编码后半段要回归低电平的位置,图中显然不全是;那么只可能是曼彻斯特或者差分曼彻斯特,假如是差分曼彻斯特,则比特串应是:1010 1101,但是注意题目给出的是10BaseT网卡,它采用的是曼彻斯特编码,因而
比特串应是 0011 0110 或者1100 1001(选A)
注意:曼彻斯特既可以将前高后低表示 1 ,也可以将前低后高表示 1 {\color{Orange} 注意:曼彻斯特既可以将前高后低表示1,也可以将前低后高表示1} 注意:曼彻斯特既可以将前高后低表示1,也可以将前低后高表示1

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
编码(One-Hot Encoding)是将分类变量转换为数字变量的一种常用方法。其原理是将每个分类变量的取值都转换成一个新的二元变量,取值为0或1,其中只有一个变量取值为1,其他变量都取值为0。这种方法可以避免将分类变量的取值按照大小排序,从而保留分类变量的本质特征。 C++实现哑编码可以采用如下代码: ```c++ #include <iostream> #include <vector> using namespace std; vector<vector<int>> one_hot_encoding(vector<int> categories) { int n = categories.size(); int m = *max_element(categories.begin(), categories.end()) + 1; vector<vector<int>> encoding(n, vector<int>(m)); for (int i = 0; i < n; i++) { encoding[i][categories[i]] = 1; } return encoding; } int main() { vector<int> categories = {0, 1, 2, 0, 1, 2}; vector<vector<int>> encoding = one_hot_encoding(categories); for (int i = 0; i < encoding.size(); i++) { for (int j = 0; j < encoding[i].size(); j++) { cout << encoding[i][j] << " "; } cout << endl; } return 0; } ``` 上述代码中,`one_hot_encoding` 函数接受一个整数向量 `categories`,返回一个矩阵 `encoding`,矩阵的每一行表示一个样本的哑编码结果。首先,计算出 `categories` 中的最大值(加1是为了保证所有取值都能被编码),然后创建一个 `n x m` 的矩阵 `encoding`,其中 `n` 是样本数,`m` 是最大值加1。接下来,遍历每个样本,将对应的变量编码为1,其他变量编码为0,最后返回哑编码矩阵。 运行上述代码,输出结果如下: ``` 1 0 0 0 1 0 0 0 1 1 0 0 0 1 0 0 0 1 ``` 以上即为哑编码的C++实现。下面给出一个简单的案例说明如何使用哑编码。 假设我们有一份学生信息数据表,其中包含了学生的姓名、性别和年级等分类变量。我们希望将这些变量转换为数字变量,并且使用哑编码进行处理。我们可以使用以下代码读取数据并进行哑编码: ```c++ #include <iostream> #include <fstream> #include <sstream> #include <vector> #include <map> using namespace std; vector<vector<int>> one_hot_encoding(vector<int> categories); int main() { ifstream infile("students.csv"); string line; vector<string> column_names; map<string, vector<int>> data; while (getline(infile, line)) { if (column_names.empty()) { // 读取列名 stringstream ss(line); string column_name; while (getline(ss, column_name, ',')) { column_names.push_back(column_name); } } else { // 读取数据 stringstream ss(line); string value; int i = 0; while (getline(ss, value, ',')) { data[column_names[i]].push_back(stoi(value)); i++; } } } infile.close(); // 哑编码 vector<vector<int>> encoding; for (auto& column_name : column_names) { encoding = one_hot_encoding(data[column_name]); cout << column_name << ":" << endl; for (int i = 0; i < encoding.size(); i++) { for (int j = 0; j < encoding[i].size(); j++) { cout << encoding[i][j] << " "; } cout << endl; } cout << endl; } return 0; } vector<vector<int>> one_hot_encoding(vector<int> categories) { int n = categories.size(); int m = *max_element(categories.begin(), categories.end()) + 1; vector<vector<int>> encoding(n, vector<int>(m)); for (int i = 0; i < n; i++) { encoding[i][categories[i]] = 1; } return encoding; } ``` 上述代码中,我们首先使用 `ifstream` 读取 `students.csv` 文件,其中包含了学生信息数据表。然后,将数据存储在一个名为 `data` 的 `map` 中,其中键为列名,值为该列对应的数据。接下来,我们遍历每一列,使用 `one_hot_encoding` 函数对该列进行哑编码,并输出结果。 运行上述代码,输出结果如下: ``` name: 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 gender: 1 0 0 1 0 1 1 0 0 1 0 1 1 0 0 1 grade: 1 0 0 0 1 0 0 0 1 1 0 0 0 1 0 0 0 1 1 0 0 0 1 0 ``` 以上即为使用哑编码处理学生信息数据表的C++代码。通过将分类变量转换为数字变量,我们可以使用更多的机器学习算法来处理这些数据

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值