改进曼彻斯特对光信号编码

2017-08-31  本文已影响0人  creker

文章铺垫

我为什么要编码

正文

常用的编码方式

  1. 文字叙述:时钟源之间如果是上升沿,则表示0,下降沿则表示1。当然,你也可以反过来。
  2. 规律:看两个虚线之间,如果是下降,对应的数字信号栏就是1,反之为0。
曼彻斯特编码
图片来自网络,点击可看来源
  1. 时钟源开始信号为标准,如果在虚线处保持电平,则表示为1,如果在虚线处发生了翻转,则表示为0。
  2. 规律:数字信号栏,第一个数字为1,左侧虚线对应的差分编码电平没有反转,第二个数字是0,左侧虚线信号发生了反转,如此进行。
差分曼彻斯特编码,紫色圈部分
图片来自上上图统一网络,笔者做了些粗暴的编辑

使用差分曼彻斯特编码的好处

算法优化

4B/5B编码

图片来自百度百科

附上C语言代码

/*曼彻斯特差分编码
输入:  str0:原始二进制数据
no_flip_len:无翻转的数据长度
输出: str1:二进制流数据
    bit_len:二进制数据长度
*/
void Dif_Manchester1(u8* str0, u8* str1,u16 no_flip_len,u8* bit_len)
{
    u16 avg=0;
    u16 count=1;
    u16 count_0=0;
    u16 j=0;
    avg = averge_range(str0);
    while(count<no_flip_len)
    {
        if(!(*str0^*(++str0)))
        {
            count++;
        }else
        {
            if((count%avg)>(avg*2/3))//此处做了容差处理
            {
                count_0 = (count / avg)+1;
            }else
            {
                count_0 = (count / avg);
            }
            if(count_0 >= 2)//此处做了8B/10B编码处理
            {
                str1[j] = 0;
                j += 1;
            }
            str1[j] = 1;
            j += 1;
            count = 1;
        }
    }
    *bit_len = j - 1;
} 

CrekerLi,2017年9月2日修改以前的笔记。

上一篇 下一篇

猜你喜欢

热点阅读