前言:
这里主要介绍结合Bipolar-AMI 介绍一下为什么要Scrambling
以及北美,欧洲日本常用的方案
于威廉·斯托林斯的《数据与计算机通信》
一 Bipolar-AMI 编码
这里面简单回顾一下该编码
作用:
数字信号调制成模拟脉冲信号
原理:
pre_voltage = -1
if bit== 0:
voltage =0
else
voltage = - pre_voltage
pre_voltage = voltage
二 现有方案问题
收发双发时钟不同步,导致收发出错。
通讯的时候:
收发双发都是按照约定的采样周期去采样的
如下图:
发送方发送5个0,接收方因为时钟不同步,采样得到的数据只有4个0
同样当接收方发送数据的时候,接收方可能会多一个0
如下:
当全是1的时候
由电压变化,重置时钟,避免不同步,但是不能保证任何给定的时钟信号都是周期性的,我们有些1,所以我们通过扰码技术,以确保即使发送者发送一个长序列0,也能检测到电压变化,
达到时钟同步的效果.
三 B8ZS(bipolar with 8-zeros substitution)
这种扰码技术是基于双极AMI( Bipolar-AMI),在北美常用
双极AMI:
正电压后面一定是负电压值交替出现
原理:
编码的时候,当遇到连续8个0 的时候,
当前一个电压值为 +, 替换为 000+ -0-+
当前一个电压值为 -, 替换为 000 - +0+-
因为双极AMI( Bipolar-AMI) 编码的时候,必须是+,-交替出现的
但是加扰后,出现的是++ -- + 或者 --++-,违反+- 交替出现的规则
def B8ZS():
data = [1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1]
Positive =[0,0,0,1,-1,0,-1,1]
Negative= [0,0,0,-1,1,0,1,-1]
pre_voltage = -1
Y = []
N = len(data)
zeros ={}
for i in range(N):
bit = data[i]
if 0 == bit:
num = num+1
if num==8: #记录下当前的位置
zeros[i]=pre_voltage
num = 0
print("\n i",i,pre_voltage)
else:
num = 0
pre_voltage = -pre_voltage
Y.append(pre_voltage)
for key in zeros.keys():
voltage = zeros[key]
print("\n voltage ",voltage)
if voltage == -1:
Y[key-7:key]=Negative
else:
Y[key-7:key]=Positive
show_voltage(Y)
if __name__ == "__main__":
B8ZS()
如上图,红色部分是违背编码规则的,很容易检测出来,通过voltage编码
进行时钟同步。
四 high-density bipolar 3zeros(3阶高密度双极性码)
这种扰码技术是基于双极AMI( Bipolar-AMI),在日本欧洲常用
双极AMI:
正电压后面一定时负电压值
原理:
编码的时候,当遇到连续4个0 的时候,依照
前面脉冲的场景,替换成对应的脉冲信号。
需要检查:
a: 前面脉冲+ ,- 情况
b: 上次替换后,脉冲1的奇偶数情况