曼彻斯特编码


曼彻斯特编码(Manchester Encoding),也叫做相位编码(PE)是一个同步时钟编码技术,被物理层用来编码一个同步位流的时钟和数据;常用于局域网传输。在曼彻斯特编码中,每一位的中间有一跳变,位中间的跳变既作时钟信号,又作数据信号,就是说主要用在数据同步传输的一种编码方式。
 
但在不同的书籍中,曼彻斯特编码中,电平跳动表示的值不同,这里产生很多歧义:
1、在 网络工程师考试以及与其相关的资料中,如:雷振甲编写的《网络工程师教程》中对曼彻斯特编码的解释为:从低电平到高电平的转换表示1,从高电平到低电平的转换表示0,模拟卷中的答案也是如此,张友生写的考点分析中也是这样讲的。
位中间电平从高到低跳变表示"0";
位中间电平从低到高跳变表示"1"。
2、在一些《 计算机网络》书籍中,如《计算机网络(第4版)》中(P232页)则解释为高电平到低电平的转换为1,低电平到高电平的转换为0,《数据通信与网络(第三版)》,《计算机网络(第4版)》采用如下方式:
位中间 电平从高到低跳变表示"1";
位中间电平从低到高跳变表示"0"。
在清华大学出版的《计算机通信与网络教程》也是这么说的,就以此为标准,我们就叫这为 标准曼彻斯编码。至于第一种,我们在这里就叫它 曼彻斯特编码但是要记住,在不同的情况下懂得变通哦,否则会被老师扣分数的哦。这两者恰好相反,千万别弄混淆了。
【关于数据表示的约定】
  事实上存在两种相反的数据表示约定。
  第一种是由G. E. Thomas, Andrew S. Tanenbaum等人在1949年提出的,它规定0是由低-高的电平跳变表示,1是高-低的电平跳变。
  第二种约定则是在IEEE 802.4(令牌总线)和低速版的IEEE 802.3 (以太网)中规定, 按照这样的说法, 低-高电平跳变表示1, 高-低的电平跳变表示0。
  由于有以上两种不同的表示方法,所以有些地方会出现歧异。当然,这可以在差分曼彻斯特编码(Differential Manchester encoding)方式中克服.
 
差分曼彻斯特编码
在信号位 开始时不改变信号极性,表示辑"1"
在信号位 开始时改变信号极性,表示逻辑"0" ;
注意】:如果在最初信号的时候,即 第一个信号时:
如果中间位电平从低到高,则表示0;
如果中间位电平从高到低,则表示1;
后面的(从第二个开始)就看每个信号位开始时有没有跳变来决定:
下面我们来举个例子,来比较标准曼彻斯特编码、曼彻斯特编码、差分曼彻斯特编码:
1.不归零码NRZ、双极性不归零码BNRZ

不归零码在一个码型传输过程中不会归零,用“高电平”表示1,“零电平”表示0;

双极性不归零码BNRZ同样是不归零码,用“高电平”表示1,“负电平”表示0;

上述编码信道密度高,但无法从码型中提取同步信息,需要外同步,否则会累积误差。

波形如下:

2.归零码RZ,BRZ

归零码RZ也使用“高电平”表示1,但在一个周期内,高电平需要归零,“零电平”表示0,BRZ则“高电平”表示1,“负电平”表示0,一个周期内,正负电平都需要归零。

3.曼彻斯特、差分曼彻斯特(双相码)

曼彻斯特又叫相位编码,双相码,它包含自同步信息,码型中同时包括数据和时钟信息。

曼彻斯特:有两种定义,一种是“低-高”表示1,“高-低”表示0,在802.3中定义,另一种是相反的,”高-低”表示1,“低-高”表示0;

可以看出,802.3版本的曼彻斯特码波形可以由时钟与数据异或XOR直接得到,而Thomas的版本则是异或非NXOR。

差分曼彻斯特:差分曼彻斯特也是根据跳变沿解码,跳变与前一个跳变相同,表示0,相反表示1.

4.脉冲宽度编码

应用于NFC应用的SWP接口采用了脉冲宽度编码,一个码型包括4个码元,“1110”表示1,“1000”表示0,可以通过高电平码元的宽度来进行译码。

当然,SWP还使用了特殊的电流传输技术,能使用一根线进行双向信号传输。

5.NRZI

USB使用的是NRZI,电平翻转表示逻辑0,电平不变表示逻辑1

可以看到,即使NRZI的波形完全翻转,所表示的逻辑依然不变,这非常适合USB的差分传输中。

当然,NRZI也没有同步信息,需要发送同步头。


对于信源的设计,MATLAB提供了丰富的工具和函数库,可以方便地实现各种编解码方式。下面分别介绍AMI码、HDB3码、双相码和Miller码的实现方法: 1. AMI码 AMI码是一种常用的线路编码方式,可以有效地减小冗余信息,提高传输速率。在MATLAB中,可以使用comm.AMIEncoder和comm.AMIDecoder函数实现AMI码的编解码。具体操作如下: (1)编码: ```matlab % 设置信源参数 M = 2; % 码元数 L = 100; % 每个码元的长度 data = randi([0 M-1],1,L); % 生成随机数字序列 % 编码 amiEncoder = comm.AMIEncoder; codedData = amiEncoder(data'); ``` (2)解码: ```matlab % 解码 amiDecoder = comm.AMIDecoder; decodedData = amiDecoder(codedData'); ``` 2. HDB3码 HDB3码是一种高密度双极性三零编码方式,可以有效地减小码元传输速率,提高传输效率。在MATLAB中,可以使用comm.HDB3Encoder和comm.HDB3Decoder函数实现HDB3码的编解码。具体操作如下: (1)编码: ```matlab % 设置信源参数 M = 2; % 码元数 L = 100; % 每个码元的长度 data = randi([0 M-1],1,L); % 生成随机数字序列 % 编码 hdb3Encoder = comm.HDB3Encoder; codedData = hdb3Encoder(data'); ``` (2)解码: ```matlab % 解码 hdb3Decoder = comm.HDB3Decoder; decodedData = hdb3Decoder(codedData'); ``` 3. 双相码 双相码是一种常用的数字信号编码方式,可以有效地减小码元传输速率,提高传输效率。在MATLAB中,可以使用comm.BiPhaseEncoder和comm.BiPhaseDecoder函数实现双相码的编解码。具体操作如下: (1)编码: ```matlab % 设置信源参数 M = 2; % 码元数 L = 100; % 每个码元的长度 data = randi([0 M-1],1,L); % 生成随机数字序列 % 编码 biPhaseEncoder = comm.BiPhaseEncoder; codedData = biPhaseEncoder(data'); ``` (2)解码: ```matlab % 解码 biPhaseDecoder = comm.BiPhaseDecoder; decodedData = biPhaseDecoder(codedData'); ``` 4. Miller码 Miller码是一种常用的数字信号编码方式,可以有效地减小码元传输速率,提高传输效率。在MATLAB中,可以使用comm.MillerEncoder和comm.MillerDecoder函数实现Miller码的编解码。具体操作如下: (1)编码: ```matlab % 设置信源参数 M = 2; % 码元数 L = 100; % 每个码元的长度 data = randi([0 M-1],1,L); % 生成随机数字序列 % 编码 millerEncoder = comm.MillerEncoder; codedData = millerEncoder(data'); ``` (2)解码: ```matlab % 解码 millerDecoder = comm.MillerDecoder; decodedData = millerDecoder(codedData'); ``` 以上就是利用MATLAB进行信源设计的基本方法,可以根据需要选择不同的编解码方式,并且可以自定义参数进行设置,以满足不同的应用需求。

登录后您可以享受以下权益:

×
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值

举报

选择你想要举报的内容(必选)
  • 内容涉黄
  • 政治相关
  • 内容抄袭
  • 涉嫌广告
  • 内容侵权
  • 侮辱谩骂
  • 样式问题
  • 其他
点击体验
DeepSeekR1满血版
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回顶部