行代码–在Matlab和Python中演示

线路代码是用于表示通信线路上数据的信令方案。有几种可能的映射方案可用于此目的。让我们了解并演示Matlab和Python中的线路代码和PSD(功率谱密度)。

线路代码–要求

在长距离传输二进制数据时,使用行代码编码二进制数据应满足以下要求。

  • 可以传输所有可能的二进制序列。
  • 线路编码信号必须占用较小的传输带宽,以便单位带宽可以传输更多的信息。
  • 编码信号的错误概率应尽可能小
  • 由于长距离通信信道无法传输低频内容(例如:信号的直流分量,此类线路码在编码时应消除直流)。编码信号的功率谱密度也应适用于传输介质。
  • 接收器应该能够从发送的信号中提取定时信息。
  • 保证二进制数据中长时间运行1s和0s的定时恢复位的转换。
  • 支持通信系统的错误检测和纠正功能。

单极非归零(NRZ)电平和归零(RZ)电平代码

单极NRZ(L)是所有行代码中最简单的,其中正电压表示二进制位1,零伏表示位0。它也称为开关键控。

在单极归零(RZ)电平线路码中,信号值在每个脉冲之间归零。

单极不归零(NRZ)和归零(RZ)线路代码-5V峰值电压
单极不归零(NRZ)和归零(RZ)线路代码–5V峰值电压

对于单极NRZ和RZ线编码信号,信号的平均值不为零,因此它们具有显著的直流分量(注意功率谱密度(PSD)图中零频率处的脉冲)。

PSD中的直流脉冲不携带任何信息,也会导致传输线发热。这是通信资源的浪费。

单极性编码信号不包括定时信息,因此长时间运行0和1可能会导致同步在接收器上。

单极NRZ线码的功率谱密度
单极NRZ线码的功率谱密度
单极RZ线码的功率谱密度
单极RZ线码的功率谱密度

双极非归零(NRZ)电平代码

在双极NRZ(L)编码中,二进制位1映射到正电压,位0映射到负电压。由于有两个相反的电压(正电压和负电压),这是一种双极信号方案。

双极不归零(NRZ)和归零(RZ)线路代码-5V峰值电压
双极不归零(NRZ)和归零(RZ)线路代码–5V峰值电压

从功率谱密度可以看出,双极NRZ信号在零频率下没有明显的脉冲(直流分量非常接近零)。此外,它的功率比单极线路码大(注:双极NRZ的PSD曲线比单极NRZ稍高)。因此,双极NRZ信号在接收器处提供更好的信噪比(SNR)。

双极NRZ信号缺少嵌入的时钟信息,当二进制信息长时间运行0和1时,接收机会出现同步问题。

双极NRZ和单极NRZ线路码功率谱密度的比较
双极NRZ和单极NRZ线路码功率谱密度的比较

交替标记反转(AMI)

AMI是一种双极信号方法,将二进制0编码为0伏,二进制1编码为+ve和-ve电压(在连续的1s之间交替)。

交替标记反转(AMI)行代码
交替标记反转(AMI)线路代码–5V峰值电压

AMI消除了直流分量。从下面的PSD图中可以看出,与单极和双极NRZ线路码相比,AMI降低了带宽(更窄的隆起)并加快了滚动速度。

它具有内置的错误检测机制:一个比特错误会导致违反双极信号。即使长时间运行1和0,它也能保证定时转换。

交替标记反转(AMI)线码的功率谱密度
与单极和双极NRZ线路码相比,交替标记反转(AMI)的功率谱密度

曼彻斯特编码

在曼彻斯特编码中,每个二进制位的信号都包含一个转换。例如,位0表示为从负电压到正电压的转换,位1表示为从一个正电压到负电压的转换。因此,它被认为是自时钟,并且没有直流分量。

数字曼彻斯特编码可以通过对二进制数据和时钟进行异或运算,然后将输出映射到适当的电压水平来实现。

曼彻斯特编码
曼彻斯特编码

从PSD图中,我们可以得出曼彻斯特编码信号占用双极NRZ(L)编码信号带宽的两倍。

曼彻斯特编码的功率谱密度
曼彻斯特编码与双极NRZ(L)编码功率谱密度的比较

Matlab脚本

在这个脚本中,使用以下命令模拟线路代码并绘制其功率谱密度(PSD)pwelch命令.

%模拟线路代码并绘制功率谱密度(PSD)%作者:Mathuranathan Viswanathanclearvars;clc;L=32;%每个数据位的数字采样数Fs=8*L;%采样频率电压等级=5;%峰值电压水平(伏特)数据=兰特(10000,1)>0.5;%数据的随机1和0clk=mod(0:2*numel(数据)-1,2).';%时钟采样ami=1*数据;previousOne=0;%AMI编码ii=1:numel(数据)if(ami(ii)==1)&&(previousOne==0)ami(ii)=电压水平;previousOne=1;if(ami(ii)==1)&&(previousOne==1ami(ii)=-电压水平;previousOne=0;结束结束%将位转换为序列并映射到电压电平clk_sequence=重塑(repmat(clk,1,L).',1,长度(clk)*L);data_sequence=重塑(repmat(data,1,2*L).',1、长度(数据)*2*L);单极_nrz_l=电压电平*数据序列;nrz_encoded=电压等级*(2*data_sequence-1);unipolar_rz=电压等级*和(data_sequence,而不是(clk_sequece));ami_sequence=重塑(repmat(ami,1,2*L).',1,长度(ami)*2*L);manchester_encoded=电压等级*(2*xor(data_sequence,clk_sequence-1);数字;%在时域中绘制信号子区(7,1,1);地块(clk序列(1:800));标题(“时钟”);子区(7,1,2);绘图(数据序列(1:800));标题(“数据”)子区(7,1,3);图(unipolar_nrz_l(1:800));标题(“单极非归零电平”)子区(7,1,4);绘图(nrz编码(1:800));title(“双极非归零电平”)子区(7,1,5);绘图(单极_rz(1:800));标题(“单极归零”)子区(7,1,6);地块(ami_sequence(1:800));title(“交替标记反转(AMI)”)子区(7,1,7);绘图(曼彻斯特编码(1:800));标题(“曼彻斯特编码-IEEE 802.3”)数字;%绘制功率谱密度ns=最大值(大小(单极_nrz_l));na=16;%平均因子绘制平均welch谱w=汉宁(楼层(ns/na));%汉宁窗%使用Hanning窗口绘制Welch功率谱[Pxx1,F1]=pwelch(单极_nrz_l,w,[],[]、1,‘nesided’);[Pxx2,F2]=pwelch(nrz_encoded,w,[],[],1,'单侧');[Pxx3,F3]=pwelch(单极_rz,w,[],[],1,‘nesided’);[Pxx4,F4]=pwelch(ami_sequence,w,[],[]、1,‘nesided’);%[Pxx5,F5]=pwelch(曼彻斯特编码,w,[],[],1,‘nesided’);符号学(F1,Pxx1,‘DisplayName’,‘Unipolar-NRZ-L’);坚持;符号学(F2,Pxx2,'DisplayName','Bipolar NRZ(L)');符号学(F3,Pxx3,‘DisplayName’,‘Unipolar-RZ’);符号学(F4,Pxx4,'DisplayName','AMI');符号学(F5,Pxx5,‘DisplayName’,‘Manchester’);传奇();

Python代码

查看我的Google Colab中的python代码

评价此文章: 可怜的低于平均水平平均很好杰出的(18平均票数:3.83(共5个)

作者的书籍

Matlab中的无线通信系统
Matlab中的无线通信系统
第二版(PDF)

可怜的低于平均水平平均很好杰出的(177平均票数:3.64(共5个)

使用Python的数字调制
使用Python的数字调制
(PDF电子书)

可怜的低于平均水平平均很好杰出的(130平均票数:3.56(共5个)

数字模块使用matlab图书封面
使用Matlab的数字调制
(PDF电子书)

可怜的低于平均水平平均很好杰出的(135平均票数:3.63(共5个)

手绘通信工程最佳书籍
信号处理最佳书籍

关于“Line code–在Matlab和Python中演示”的4点思考

  1. 喜欢python书,很高兴您能使用colab共享新代码。以下是问题:
    1.你能同时展示NRZ和PAM-N吗?展示PAM4和NRZ的两个波瓣在一个波瓣中的情况(参见幻灯片26https://www.xilinx.com/publications/events/designcon/2016/slides-pam4signalingfor56gserial-zhang-designcon.pdf)

    我曾尝试应用Welch方法在工作时从我的Keysight DCA上的PRBS15-1 26GHz时钟NRZ中获得PSD,无论我如何将示波器滤波器/BW设置为最大值或是IEEE最新802规范要求的第四阶贝塞尔滤波器响应,我都没有得到与您显示的结果接近的结果。我认为这与Keysight BERT的tx的根升余弦有关,我不再这么认为了。如果能展示如何将理论上所做的应用于现实世界的测量,即使在模拟发现上只有一条I2c总线或AWG,那将是一件很棒的事情

    再一次,这本博文和python书很棒,谢谢

    答复

发表您的宝贵意见!!!