不归零、曼彻斯特、差分曼彻斯特编码的c++实现

1)不归零编码
信号电平由0、1表示,并且在表示完一个码元后,电压不需回到0
数字信号可以直接采用基带传输(未对载波信号称为基带信号,也就是不许需要搬移基带信号频谱的传输方式,近距离的局域网常采用这种方式)
对于不归零编码的缺点
1.很难说清信号的开始和结束
2.发送和接受必须要时钟同步
3.多个连续的数字可能会出现累计误差
4.容易发生传播错误
由于NZR不具有自同步的特性,需要先发送一个同步头,比如0101010的方波信号,让接收者通过这个同步头计算出发送者的频率,然后再用这个频率来采样之后的数据信号

2)曼彻斯特编码
每一位的中间有一跳变,位中间的跳变既作时钟信号,又作数据信号;从高到低跳变表示“1”,从低到高跳变表示“0”。
优点:克服了NRZ编码的缺点;用作时钟的自同步
缺点:增加了信道频率带宽的要求,同时高频率的噪音增加,容易受到噪音的干扰
二义性

3)差分曼彻斯特编码
每位中间的跳变仅提供时钟定时,而用每位开始时有无跳变表示“0”或“1”,有跳变为“0”,无跳变为“1”。

对于他们的c++实现,可以依据定义来进行输出
代码如下

#include <stdio.h>
#include <iostream>
#include <string.h>
#include <vector>
using namespace std;
void NRZ(const char* num);
void Mcoding(const char* num);
void CMcoding(const char* num);
int changenum(int num);
int main()
{
	char num[40];
	cout << "请输入" << endl;
	cin >> num;
	NRZ(num);
	Mcoding(num);
	CMcoding(num);
	getchar();
	return 0;
}
void NRZ(const char *num)
{
	int length = strlen(num);
	for (int i = 0; i < length; i++)
	{
		cout << num[i] << "  ";
	}
	cout << endl;
}
void Mcoding(const char* num)
{
	int length = strlen(num);
	for (int i = 0; i < length; i++)
	{
		if (num[i] == '0')
		{
			cout << "0  1" << "  ";
		}
		else
		{
			cout << "1  0" << "  ";
		}
	}
	cout<<endl;
}
void CMcoding(const char* num)
{
	//假定前面为1
	int length = strlen(num);
	vector<int> kkk;
	kkk.push_back(1);
	for (int i = 0;i<length;i++)
	{
		if (num[i]=='0')//不相同
		{
			kkk.push_back(changenum(kkk[2 * i]));
			kkk.push_back(kkk[2 * i]);
		}
		else
		{
			kkk.push_back(kkk[2 * i]);
			kkk.push_back(changenum(kkk[2 * i]));
		}
	}
	for (int i = 0; i < length; i++)
	{
		cout << kkk[2 * i + 1] << "  " << kkk[2 * i + 2] << "  ";
	}
	cout << endl;
}
int changenum(int num)
{
	return num > 0 ? 0 : 1;
}

运行结果如下图
第一个为不归零编码
第二个为曼彻斯特编码
第三个为差分曼彻斯特编码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值