0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

格雷码编码器功能实现

PoisonApple 来源:网络整理 2018-03-02 16:13 次阅读

编码器

编码器(encoder)是将信号(如比特流)或数据进行编制、转换为可用以通讯、传输和存储的信号形式的设备。编码器把角位移或直线位移转换成电信号,前者称为码盘,后者称为码尺。按照读出方式编码器可以分为接触式和非接触式两种;按照工作原理编码器可分为增量式和绝对式两类。增量式编码器是将位移转换成周期性的电信号,再把这个电信号转变成计数脉冲,用脉冲的个数表示位移的大小。绝对式编码器的每一个位置对应一个确定的数字码,因此它的示值只与测量的起始和终止位置有关,而与测量的中间过程无关。

格雷码

格雷码属于可靠性编码,是一种错误最小化的编码方式。因为,虽然自然二进制码可以直接由数/模转换器转换成模拟信号,但在某些情况,例如从十进制的3转换为4时二进制码的每一位都要变,能使数字电路产生很大的尖峰电流脉冲。而格雷码则没有这一缺点,它在相邻位间转换时,只有一位产生变化。它大大地减少了由一个状态到下一个状态时逻辑的混淆。由于这种编码相邻的两个码组之间只有一位不同,因而在用于方向的转角位移量-数字量的转换中,当方向的转角位移量发生微小变化(而可能引起数字量发生变化时,格雷码仅改变一位,这样与其它编码同时改变两位或多位的情况相比更为可靠,即可减少出错的可能性。

格雷码编码器功能实现

格雷码的实现

格雷码(Gray Code)是一个数列集合,每个数使用二进位来表示,假设使用n位元来表示每个数字,任两个数之间只有一个位元值不同。

例如以下为3位元的格雷码: 000 001 011 010 110 111 101 100 。

如果要产生n位元的格雷码,那么格雷码的个数为2^n.

假设原始的值从0开始,格雷码产生的规律是:第一步,改变最右边的位元值;第二步,改变右起第一个为1的位元的左边位元;第三步,第四步重复第一步和第二步,直到所有的格雷码产生完毕(换句话说,已经走了(2^n) - 1 步)。

用一个例子来说明:

假设产生3位元的格雷码,原始值位 000

第一步:改变最右边的位元值: 001

第二步:改变右起第一个为1的位元的左边位元: 011

第三步:改变最右边的位元值: 010

第四步:改变右起第一个为1的位元的左边位元: 110

第五步:改变最右边的位元值: 111

第六步:改变右起第一个为1的位元的左边位元: 101

第七步:改变最右边的位元值: 100

如果按照这个规则来生成格雷码,是没有问题的,但是这样做太复杂了。如果仔细观察格雷码的结构,我们会有以下发现:

1、除了最高位(左边第一位),格雷码的位元完全上下对称(看下面列表)。比如第一个格雷码与最后一个格雷码对称(除了第一位),第二个格雷码与倒数第二个对称,以此类推。

2、最小的重复单元是 0 , 1。

000

001

011

010

110

111

101

100

所以,在实现的时候,我们完全可以利用递归,在每一层前面加上0或者1,然后就可以列出所有的格雷码。

比如:

第一步:产生 0, 1 两个字符串。

第二步:在第一步的基础上,每一个字符串都加上0和1,但是每次只能加一个,所以得做两次。这样就变成了 00,01,11,10 (注意对称)。

第三步:在第二步的基础上,再给每个字符串都加上0和1,同样,每次只能加一个,这样就变成了 000,001,011,010,110,111,101,100。

好了,这样就把3位元格雷码生成好了。

如果要生成4位元格雷码,我们只需要在3位元格雷码上再加一层0,1就可以了: 0000,0001,0011,0010,0110,0111,0101,0100,1100,1101,1110,1010,0111,1001,1000.

也就是说,n位元格雷码是基于n-1位元格雷码产生的。

如果能够理解上面的部分,下面部分的代码实现就很容易理解了。

java] view plain copypublic String[] GrayCode(int n) {

// produce 2^n grade codes

String[] graycode = new String[(int) Math.pow(2, n)];

if (n == 1) {

graycode[0] = “0”;

graycode[1] = “1”;

return graycode;

}

String[] last = GrayCode(n - 1);

for (int i = 0; i 《 last.length; i++) {

graycode[i] = “0” + last[i];

graycode[graycode.length - 1 - i] = “1” + last[i];

}

return graycode;

}

格雷码还有一种实现方式是根据这个公式来的 G(n) = B(n) XOR B(n+1), 这也是格雷码和二进制码的转换公式。代码如下:

[java] view plain copypublic void getGrayCode(int bitNum){

for(int i = 0; i 《 (int)Math.pow(2, bitNum); i++){

int grayCode = (i 》》 1) ^ i;

System.out.println(num2Binary(grayCode, bitNum));

}

}

public String num2Binary(int num, int bitNum){

String ret = “”;

for(int i = bitNum-1; i 》= 0; i--){

ret += (num 》》 i) & 1;

}

return ret;

}

这是一道google 的面试题,以上代码均是网友peking2 和 SEwind520写成。原题还要求把二进制码转成十进制数。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 编码器
    +关注

    关注

    45

    文章

    3638

    浏览量

    134419
  • 格雷码
    +关注

    关注

    2

    文章

    34

    浏览量

    13185
收藏 人收藏

    评论

    相关推荐

    什么是

    (Gray code),又叫循环二进制或反射二进制 在数字系统中只能识别0和1,各种数据要转换为二进制代码才能进行处理,
    发表于 11-11 09:34 7337次阅读
    什么是<b class='flag-5'>格</b><b class='flag-5'>雷</b><b class='flag-5'>码</b>

    编码器的定义与功能 编码器的工作原理和种类

    在数字系统里,常常需要将某一信息(输入)变换为某一特定的代码(输出)。把二进制按一定的规律编排,例如8421等,使每组代码具有一
    的头像 发表于 10-27 09:29 1.2w次阅读
    <b class='flag-5'>编码器</b>的定义与<b class='flag-5'>功能</b> <b class='flag-5'>编码器</b>的工作原理和种类

    常用编码(BCD编码、余3反射、奇偶校验)

    反射(循环)十进制数 二进制数 十进制数 二进制数
    发表于 04-11 10:00

    简介及格与二进制的转换程序

    ] 。  属于可靠性编码,是一种错误最小化的编码,因为它大大地减少了由一个状态到下一个状态时电路中的混淆。由于这种
    发表于 04-22 09:00

    什么是BCD、8421、余三

    的是8421BCD,无权用得较多的是余三,我们通常所说的BCD
    发表于 11-03 17:36

    的规则和应用问题?

    今天看到一个计数的程序,搜了下定义,觉得还是云里雾里,定义写的是若任意两个相邻的代码只有一位二进制数不同,则这种编码
    发表于 08-20 14:41

    编码器的定义

    编码器  编码器的定义:在数字系统里,常常需要将某一信息(输入)变换为某一特定的代码(输出)。把二进制按一定的规律编排,例如8421
    发表于 09-03 06:35

    码式旋转编码器在位移检测中的应用

    码式旋转编码器在位移检测中的应用 介绍码式旋转编码器的特点,通过PLC转换成二进制式运
    发表于 04-30 08:43 2229次阅读
    <b class='flag-5'>格</b><b class='flag-5'>雷</b>码式旋转<b class='flag-5'>编码器</b>在位移检测中的应用

    运算研究

    运算研究 在数字系统中只能识别0和1,各种数据要转换为二进制代码才能进行处理,是一
    发表于 03-18 14:07 1459次阅读

    LDPC编码器的FPGA实现

    800Mbps准循环LDPC编码器的FPGA实现
    发表于 05-09 10:59 37次下载

    编码规则_有什么规律

    典型的二进制简称,因1953年公开的弗兰克·
    的头像 发表于 03-02 14:29 5.6w次阅读
    <b class='flag-5'>格</b><b class='flag-5'>雷</b><b class='flag-5'>码</b><b class='flag-5'>编码</b>规则_<b class='flag-5'>格</b><b class='flag-5'>雷</b><b class='flag-5'>码</b>有什么规律

    编码器基础——这样图案化编码的好处

    (Gray Code)因1953年公开的弗兰克.的专利而得名。
    的头像 发表于 01-11 10:28 1.6w次阅读
    <b class='flag-5'>编码器</b>基础——<b class='flag-5'>格</b><b class='flag-5'>雷</b><b class='flag-5'>码</b>这样图案化<b class='flag-5'>编码</b>的好处

    转换为二进制编码器的方法

    绝对编码器中的传感输出格序列,需要一些复杂的转换方法才能正确使用。本文展示了如何获取绝对编码器使用的
    的头像 发表于 05-05 15:41 6527次阅读
    将<b class='flag-5'>格</b><b class='flag-5'>雷</b><b class='flag-5'>码</b>转换为二进制<b class='flag-5'>编码器</b>的方法

    一文详解编码器

    本文介绍,这是绝对编码器与控制通信所必需的一种特殊二进制排列。
    的头像 发表于 05-05 15:47 1.1w次阅读

    结构光|解码方法

    是一种特殊的二进制,在结构光三维视觉中,常常被用于编码。比起我们常见的二进制
    的头像 发表于 12-21 11:14 1236次阅读