qakcn
学生会会长
学生会会长
  • 注册日期2008-10-31
  • 最后登录2021-01-05
  • 生日1988-8-18
  • 光玉3394颗
阅读:1850回复:9

科普第23篇——二进制的线性编码

楼主#
更多 发布于:2011-11-23 00:25
这篇文章讲的内容有点深入,请自行斟酌是否阅读,如果不理解欢迎回复。
因为网络的文章中会涉及到一些概念,不便详述,所以单独写一篇文章来说明。

我这里说的二进制信号,指的就是数字信号。本篇文章就是要介绍数字信号的调制方式。
调制(名词modulation,动词modulate)就是指将原始信号注入载波(作为载体的电磁波),以转换成适合传输的制式,然后就可以将信号通过合适的介质发送出去。调制的目的是使信号能够与杂讯等有所区分,从而能获得正确的信号,减小干扰。调制的逆过程称为解调(demodulation,demodulate)。我们上网时用的“猫”就是“调制解调器”(modem)的昵称。

在介绍数字信号之前,先说说模拟信号的调制方式。

模拟信号的载波一般都是正弦波,可以用如下函数来表示:
si(t) = Acos(2πfot + θ)

模拟信号的调制就是通过改变载波的幅度A、频率fo以及相位θ来实现的,分别称为调幅、调频和调相。调幅和调频比较常见,就介绍以下这两个吧。

调幅全称幅度调制(amplitude modulation,AM),具体的原理就不细说了,来看一个图就能理解了:

第一个是信号的波形(绿色),第二个是载波,然后进行调制的到第三个波形,然后进行传输,最后接收方经过解调得到信号的波形(红色)。

调频全称频率调制(frequency modulation,FM),还是用一个图片来说明吧:

绿色的是载波,红色的是信号,蓝色的就是调制之后的波形。

具体的原理感兴趣的可以去查相关的资料,本质上就是数学上的变换,大学学过高等数学都不难理解。


二进制数据的调制就是将0、1的信号变成适合传输的信号,可以说是一种数字信号到模拟信号的转换。通常二进制数据都用方波来表示,或者叫做脉冲信号。调制信号也不一定适合所有情况的传输(比如在电缆中传输和用无线电传输就不同),所以有时还会把这个信号用上面说的模拟信号的调制方法再进行调制。

二进制的线性编码(line code),又叫数据带宽调制(digital baseband modulation)或数据带宽传输方法(digital baseband transmission method)。在讲具体的编码之前线介绍几个概念:

二进制信号传输会用到时钟信号(clock signal),和模拟信号用某个频率的信号作为载波不同,这个时钟信号只是作为收发信号的双方检波时所用的同步信号,并不一定实际传输(不一定是因为,下面介绍的某些编码本身就可以有时钟同步的作用,就不必传输时钟信号了,否则就要另外的线路来传输时钟信号)。
时钟信号通常用方波来表示,信号的的传输通常是在时钟周期的上升沿或下降沿(也有上升沿和下降沿都传输数据的,比如DDR内存,所以工作频率200MHz的DDR内存等效于SDRAM内存的频率是400MHz;DDR2内存使用了4bit预取,所以200MHz的DDR2的等效频率是800MHz;DDR3则采用8bit预取,200MHz的DDR3等效频率是1600MHz)。
收发双方只有在约定的上升沿或下降沿才检测信号的变化(称为跳变),其余时间的就忽略。

二进制信号通常用电位的跳变来表示。电位也叫电势,单位伏特V,这是个高中物理学的概念就不做介绍了。电势要求有参考点,而这个参考点就被称为地线(缩写GND)。规定参考点为0,于是信号的电位就有正有负了。二进制的信号的电位通常用整数来表示,并不代表实际的电位大小。比如可以规定+0.5±0.01V就表示+1,-0.5±0.01V就表示-1。
当然,跳变不止电位一种形式,光脉冲等也是可以视为跳变,不过下面我们还是以电位来说明。

下面就来介绍几种比较常见的线性编码吧:


曼彻斯特编码(Manchester code)
也叫相位编码(PE,Phase Encoding)。我们还是来看图讲解:

最上面的是时钟信号,第二个是数据,第三个是G.E. Thomas标准的曼彻斯特编码,第四个是IEEE 802.3(也就是以太网)标准的曼彻斯特编码。

可以看到,曼彻斯特编码在时钟的下降沿传输信号,G.E. Thomas以从高到低的跳变表示1,从低到高的跳变表示0,IEEE 802.3的高低变化相反。而在时钟周期的上升沿,信号是设置到所需要的电位。也就是说,如果下降沿是要从高到低的跳变,那么上升沿要先把电位设置为高;如果下降沿是要从低到高,那么上升沿要先把电位设置为低;如果已经是所需要的电位,那么上升沿就不作任何变化。可以看到曼彻斯特编码只能利用时钟的一个沿来传输数据。
曼彻斯特编码可以自己同步时钟(因为下降沿一定会产生跳变),不需要额外的时钟信号。

需要注意的是(下面也一样),当我说电位的高低时,不一定是指正负,有可能高电位是正低电位是0,或者高电位是0低电位是负,或者高电位是正低电位是负,这完全看参考点的选取。
电位有正、负之分的被称作双极(bipolar)编码,只有高低之分而不关心极性(不关心不等于没有)的称为单极(unipolar)编码。


双相符号编码(Biphase mark code)
简称BMC,也叫差分曼彻斯特编码(differential Manchester encoding)。
和曼彻斯特编码一样,差分曼彻斯特编码依然可以自己同步时钟,但是根据同步信号的位置不同分为两种:

1、数据先于时钟:

和曼彻斯特编码一样在每个下降沿都会有跳变以同步时钟,但是数据的不是用跳变的方向来表示的,而是看上升沿是否有跳变。上升沿有跳变就是0,无跳变就是1。

2、时钟先于数据:

和上面的正好相反,时钟同步信号是在上升沿,数据则是看下降沿是否有跳变。和上面的也相反,下降沿有跳变就是1,无跳变就是0。


归零编码(Return-to-zero)
简称归零码或RZ。还是看图:

归零码用电位从正到零的跳变表示1,电位从负到零的跳变表示0。所以时钟周期的一个沿用于传输数据,另一个沿和曼彻斯特编码一样要设置到所需要的电位,因此曼彻斯特编码一样只能利用时钟的一个沿来传输数据。
归零码也可以自己同步时钟(上升沿与下降沿都会产生跳变)。

另外在光学通信中有一种反相归零码RZI(Return to zero, inverted),简单来说就是信号为0时有一个脉冲(脉冲的长度短于一个信号周期),为1时没有脉冲。


不归零编码(Non-return-to-zero)
既然有归零码,那就有不归零码(NRZ)。还是看图:

不归零码解释起来就更简单了,高电位表示1,低电位表示0。
不归零码可以占用一整个时钟周期,也可以只占用半个时钟周期。但是不归零码只有在0-1或者1-0变化时才会有跳变,所以必须要有额外的同步时钟信号。


反相不归零编码(Non-return-to-zero, inverted)
既然有反相归零码,那就有反相不归零码(NRZI)。依旧看图:

反相不归零码不使用电位的高低来表示0、1,而是使用跳变:无跳变就是0,有跳变就是1,这个跳变可以使从低到高,也可以是从高到低。
同样反相不归零码也可以利用时钟周期的一个或者两个沿来传输数据,也要有额外的同步时钟信号。


交替传号反转(alternate mark inversion)
简称AMI,也叫双极编码(bipolar encoding)。图图:

AMI有三个电位状态:正、0和负,正和负都用来表示二进制1,0就表示0,并且保证每个1和前后的1(不管中间有没有隔着0)电位状态都不同。比如上图第3位的1是负的,和第1位以及第6位的1不同。

编码传号反转(Coded mark inversion)
本质上也是一种NRZ编码。图:

和NRZ不同的是,CMI规定在一个时钟周期中,0表示为前半周期低电位、后半周期高电位,而1则表示为整个周期电位不变,并且和AMI相似,前后两个1(不管中间有没有隔着0)电位状态必须不同。
可见CMI要表示一位数据就必须占用一个完整的周期,不像NRZ或NRZI那样可以一个周期传输两位数据。
那么数据传输率比每周期传两位的NRZ低(和每周期传一位的NRZ数据传输率就一样了),为什么还要这种编码呢?
有时因为某些原因,没有传输时钟信号,就需要接收方根据信号去“猜测”这个时钟,这就是时钟恢复(clock recovery)。CMI进行时钟恢复比NRZ要容易。曼彻斯特编码时钟恢复也是很容易的,归零码是最容易的。


MLT-3码(MLT-3 encoding)
MLT表示Multi-Level Transmit,3表示有三个状态。图:

MLT-3说起来也很简单:数据在时钟周期的上升沿检测,有跳变就是1,无跳变就是0。
怎么听着好熟悉?没错,NRZI也是用跳变来表示0、1的,不过不同的是,NRZI是在高低两个状态间跳变,而MLT-3是在正、0、负三个状态间跳变,如果跳变达到正电位,则下面的跳变将是变为0,在下一次跳变则是变为负电位,然后又向0和正电位方向跳变,如此反复。这正是名称中3这个数字的含义。
同样可以看出,MLT-3也无法自己同步时钟。


4B5B、6b/8b、8b/10b、64b/66b编码
b的意思是bit(二进制位),4B5B的意思就是把4位二进制数编码为5位二进制数,其余的以此类推。
为什么要做这种事呢?这样数据效率不是反而下降了吗?
但是凡事都是有原因的,下面就来说一说。
在数据传输中,必须要标识数据开始和数据结束,这样才能正确地接受数据。通常都是用某个特定二进制序列来表示。但是数据中也有可能会出现这个特定序列,这样就可能会出错。所以必须要有方法来避免特定序列出现在数据中。还有一种情况是,数据中可能会出现比较长的连续的0或1的序列,这时很难判断这是正常的数据还是信号出现了错误。所以二进制信号的传输中有一个原则是要保证尽量多的跳变。于是4B5B这些编码就这样诞生了。下面就是4B5B的对应表格:
名称
4b5b描述
0000011110十六进制数据 0
1000101001十六进制数据 1
2001010100十六进制数据 2
3001110101十六进制数据 3
4010001010十六进制数据 4
5010101011十六进制数据 5
6011001110十六进制数据 6
7011101111十六进制数据 7
8100010010十六进制数据 8
9100110011十六进制数据 9
A101010110十六进制数据 A
B101110111十六进制数据 B
C110011010十六进制数据 C
D110111011十六进制数据 D
E111011100十六进制数据 E
F111111101十六进制数据 F
Q-NONE-00000Quiet (signal lost)
I-NONE-11111Idle
J-NONE-11000Start #1
K-NONE-10001Start #2
T-NONE-01101End
R-NONE-00111Reset
S-NONE-11001Set
H-NONE-00100Halt

可以看到11000和10001的序列是表示开始,01101是表示结束,也有表示其他状态的序列,和表示一般数据的序列有了区分。而4b的数据编码成5b之后也不会出现很长的连续的0或1。

我们常用的以太网就使用了这些编码。百兆以太网使用了4B5B,千兆以太网和USB3.0、SATA、PCI-E、HDMI等都使用了8b/10b,万兆以太网则使用了64b/66b。


这次就介绍这么多了,二进制的线性编码还有很多,比如海明码(奇偶校验码)、密勒码(延迟码)等等,所以以后有机会可能还会写第二篇。
线性编码的含义是,源数据到编码后的数据关系是线性的,是一对一的。数据可能要经过多次编码才最终传输(比如百兆网,先用4B5B,再用NRZI或MLT-3,然后才在物理介质上发送出去),但都是为了保证传输数据的过程中不会受到干扰、保证数据传输的正确性。

下次就继续网络的内容,讲OSI模型。


==========之前的文章==========
科普第1篇——计算机色彩
科普第1篇补遗——CSS颜色
科普第2篇——光盘
科普第3篇——2、8、10、16
科普第4篇——电池
科普第5篇——浏览器
科普第6篇——字符编码
科普第7篇——加密解密
科普第8篇——移动通信技术
科普第9篇——为什么32位CPU不能支持大于4GB内存?
科普第10篇——智能手机简介
科普第11篇——14.52-14.49=0.0299999?
科普第12篇——为什么HTTPS会更安全?
科普第13篇——计算机语言
科普第14篇——字体(上)
科普第15篇——字体(中)
科普第16篇——字体(下)
科普第17篇——域名解析
科普第17篇补遗——域名
科普第18篇——虚拟内存
科普第19篇——时间
科普第20篇——日期
科普第21篇——日期时间补遗及计算机的时间
科普第22篇——网络(0):基本概念

科普番外篇1——虽然没用但了解一下也很有趣的知识
喜欢1 评分0

最新喜欢:

wudahhtwudahh...
nurari
光坂二年生
光坂二年生
  • 注册日期2011-04-26
  • 最后登录2013-01-26
  • 生日1986-3-15
  • 光玉314颗
沙发#
发布于:2011-11-23 01:24
相位编码真是有亲切感啊=。=
回复(0) 喜欢(0)     评分
幻之星河
光坂三年生
光坂三年生
  • 注册日期2011-11-10
  • 最后登录2020-07-16
  • 生日1990-8-21
  • 光玉572颗
2楼#
发布于:2011-11-23 02:08
终于第23篇了,只懂二进制,然后看了后面头大中==
太难懂了
回复(0) 喜欢(0)     评分
bleen
光坂学士生
光坂学士生
  • 注册日期2010-05-28
  • 最后登录2022-02-21
  • 生日1988-12-9
  • 光玉2111颗
3楼#
发布于:2011-11-23 02:08
。。。。。。大Q前辈是学什么的,计算机专业都没提这么详细。。。
回复(0) 喜欢(0)     评分
我很随便的哦
光坂学士生
光坂学士生
  • 注册日期2011-07-24
  • 最后登录2023-04-25
  • 生日1996-5-29
  • 光玉2125颗
4楼#
发布于:2011-11-23 06:41
弱弱的问一句= =这个有几个人知道= =
回复(0) 喜欢(0)     评分
mooncrazy
学生会会长
学生会会长
  • 注册日期2010-12-28
  • 最后登录2024-05-06
  • 生日1989-8-9
  • 光玉11146颗
5楼#
发布于:2011-11-23 07:41
啊啊真是复杂啊,只学过微机原理
回复(0) 喜欢(0)     评分
命运の指轮
光坂学士生
光坂学士生
  • 注册日期2011-11-21
  • 最后登录2015-03-24
  • 生日1990-12-17
  • 光玉2290颗
6楼#
发布于:2011-11-23 08:27
只懂二进制是什么。。。
回复(0) 喜欢(0)     评分
火舞
学生会干部
学生会干部
  • 注册日期2011-06-12
  • 最后登录2021-10-03
  • 生日1991-11-10
  • 光玉2007颗
7楼#
发布于:2011-11-23 11:48
这个这次真没看懂,二进制只在数字电路基础和计算机组成原理中学到一点= =
回复(0) 喜欢(0)     评分
xx
xx
光坂硕士生
光坂硕士生
  • 注册日期2011-10-10
  • 最后登录2013-09-03
  • 生日1950-1-23
  • 光玉6210颗
8楼#
发布于:2011-11-23 20:56
值得笔记下啊
                   NoName == 401 Unauthorized
                 The Unknown Will Stay Unknown
                    This  Is   X       A   Pro   Diver
回复(0) 喜欢(0)     评分
serffyme水草~
光坂学士生
光坂学士生
  • 注册日期2008-12-11
  • 最后登录2020-04-28
  • 生日1989-11-27
  • 光玉4876颗
9楼#
发布于:2011-11-23 22:42
看懂了一部分。。二进制什么的以前倒是有学~4B5B编码以外的其他编码。。太陌生了。。0 0
不要公式~~眼晕哦~~~~~~~(>_<)~~~~
回复(0) 喜欢(0)     评分
游客

返回顶部