归零码:
信号电平在一个码元之内都要恢复到零的编码方式,它包括曼彻斯特编码和差分曼彻斯特编码两种编码方式。
一种二进制信息的编码,用极性不同的脉冲分别表示二进制的“1”和“0”,在脉冲结束之后要维持一段时间的零电平。能够自同步,但信息密度低。 它是码元
中间的信号回归到0电平,判断的方法是\"从正电平到零电平的转换边表示的码元为0,而从负电平到零电平转换边表示码元1\使得这种编码为自定时的编码.
曼彻斯 Manchester code (又称裂相码、双向码),一种用电平跳变来表示1或0的编码,其变化规则很简单,即每个码元均用两个不同相位的电平信号表示,也就是一个周期的方波,但0码和1码的相位正好相反。 其对应关系为: 0--》01 1--》10
信码 0 1 0 0 1 0 1 1 0
双向码 01 10 01 01 10 01 10 10 01
一. 原理:
1.曼彻斯特编码:每一位的中间有一跳变,位中间的跳变既作时钟信号,又作数据信号;从高到低跳变表示\"1\",从低到高跳变表示\"0\"。
曼彻斯特编码的编码规则是:
----在信号位中电平从低到高跳变表示1; ----在信号位中电平从高到低跳变表示0;
2.差分曼彻斯特编码:每位中间的跳变仅提供时钟定时,而用每位开始时有无跳变表示
\"0\"或\"1\",有跳变为\"0\",无跳变为\"1\"。
差分曼彻斯特编码的编码规则是:
在信号位开始时不改变信号极性,表示辑\"1\"
在信号位开始时改变信号极性,表示逻辑\"0\"
两种曼彻斯特编码是将时钟和数据包含在数据流中,在传输代码信息的同时,也将时钟同步信号一起传输到对方,每位编码中有一跳变,不存在直流分量,
因此具有自同步能力和良好的抗干扰性能。但每一个码元都被调成两个电平,所以数据传输速率只有调制速率的1/2。
二. 编解码流程:
3.不论码元是1或者0,在每个码元正中间的时刻,一定有一次电平转换。
图:数字信号与其曼彻斯特编码及差分曼彻斯特编码对应关系
编码步骤分析:
*. 以第一条虚线为纵坐标。 不归零制编码:
1. t=0时,接入信号。
2. 数字信号为1时,为高电平;数字信号为0时,为低电平。 曼彻斯特编码:
1. t=0时,接入数字信号。
2. 第一个时钟周期,数字信号为0,此时曼彻斯特编码表现为从高电平跳转为低电
平;
3. 第二个时钟周期,数字信号为1,此时曼彻斯特编码表现为从低电平跳转为高电
平。以此类推,根据数字信号即可编写为曼彻斯特编码,如图。
差分曼彻斯特编码:
1. t=0时,接入数字信号。
2. 第一个时钟周期,数字信号为0,此时差分曼彻斯特编码开始时需要进行一次跳
变,即从原来的高电平跳变为低电平。
3. 第二个时钟周期,数字信号为1,此时差分曼彻斯特编码开始时电平需要和原来
保持一致,即保持原来的高电平。以此类推,根据数字信号即可编写为差分曼彻斯特编码,如图。
就三种编码而言,在每个码元正中间都必定有一次电平跳转。差分曼切斯特编码比曼切斯特编码的变化要少,因此更适合与传输高速的信息,被广泛用于宽带高速网中。然而,由于每个时钟位都必须有一次变化,原本的数字信号需要由两种电平来表示,信息量变为2bit,故两种编码的效率仅可能达到50%左右。
三. 源代码
#include #include int j; //j代表编码后序列的数组下标 int i; //i代表输入码字的数组下标 int length; //输入数组的长度 //参数表 int Direct_code(char str0[ ]) { char dirct_code[2*M]; memset(dirct_code,0,2*M); dirct_code[0]='0'; dirct_code[1]='1'; j=0; for(i=0;i printf(\"current character is: %c \ // 循环处理,0 ->00 1 ->11 if(str0[i]=='0') { dirct_code[j++]='0'; dirct_code[j++]='0'; } else if(str0[i]=='1') { dirct_code[j++]='1'; dirct_code[j++]='1'; } else { printf(\"input error,exit........ \"); return 1; } // 输入出错 // 循环处理后数据 printf(\"-----\"); printf(\"after process: %c%c \ } dirct_code[j]=0; // 输出结果 printf(\"------------------------------------------- \"); printf(\"\\n\"); printf(\"Direct_code coding is:%s \ printf(\"\\n\"); return 0; } int Manchester(char str0[]) //曼彻斯特编码 { char Manchester[2*M]; memset(Manchester,0,2*M); Manchester[0]='0'; Manchester[1]='1'; j=0; for(i=0;i printf(\"current character is: %c \ // 循环处理,0 ->10 1 ->01 if(str0[i]=='0') { } Manchester[j++]='1'; Manchester[j++]='0'; else if(str0[i]=='1') { } Manchester[j++]='0'; Manchester[j++]='1'; else { printf(\"input error,exit........ \"); return 1; } // 输入出错 // 循环处理后数据 printf(\"-----\"); printf(\"after process: %c%c \ } // 结果字符串加上终结符 Manchester[j]=0; // 输出结果 printf(\"------------------------------------------- \"); printf(\"\\n\"); printf(\"Manchester coding is :%s \ printf(\"\\n\"); return 0; } int Dif_Manchester(char str0[]) //差分曼彻斯特编码 { char Dif_Manch[2*M]; memset(Dif_Manch,0,2*M); //初始化数组 Dif_Manch[0]='0'; Dif_Manch[1]='1'; j=1; for(i=0;i printf(\"current character is: %c \ // 循环处理,0 ->01 1 ->10 if(str0[i]=='0') { if(Dif_Manch[j]== '0') { Dif_Manch[++j]='1'; Dif_Manch[++j]='0'; } else { Dif_Manch[++j]='0'; Dif_Manch[++j]='1'; } } else if(str0[i]=='1') { if(Dif_Manch[j]== '0') { } else { Dif_Manch[++j]='1'; Dif_Manch[++j]='0'; Dif_Manch[++j]='1'; Dif_Manch[++j]='0'; } } else { printf(\"input error,exit........ \"); return 1; } // 输入出错 // 循环处理后数据 printf(\"-----\"); printf(\"after process: %c%c \ } // 结果字符串加上终结符 j=j+1; Dif_Manch[j]=0; // 输出结果 printf(\"------------------------------------------- \"); printf(\"\\n\"); printf(\"Dif_Manchester coding is :%s \ printf(\"\\n\"); return 0; } //主函数 int main() { char str0[M]; // 获取输入数据 printf(\"please input the number string you want(it must less than 10): \"); scanf(\"%s\ // 验证输入数据是否正确,可以用assert之类 printf(\"what you input is------:: %s \ printf(\"\\n\"); length=strlen(str0); assert(length 四. 运行结果: 因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- oldu.cn 版权所有 浙ICP备2024123271号-1
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务