在pdfhttp://www.beidou.gov.cn/attach/2012/12/27/201212273da29c5eb8274deb8cd2b178228ba2bd.pdf第5章(第9ff页)中,描述了北斗系统的bch(15,11,1)码。
我正在尝试使用这个代码进行错误检查(也就是说,我只想验证奇偶校验信息——我不需要错误修正能力)。理想情况下,我搜索一个例程,它得到15位并返回匹配的4个奇偶校验位。
我检查了下面的代码,但无法让它做我想做的事情。最好是生成bch(15,11,3)代码。
http://www.eccpage.com/bch3.c
两个字符串示例如下:
E240DCB12D8201A 043FFA7277777BA777777B777776A77803503C0013e000eec6eeeee60
E2411C9D2D9DD17DDDDA9DDDE0D500F00264780013555552D555554B555552D55555554B0
注意,前15位不是bch编码,第二组是,从第三组开始,两个编码交错,如第14页所述。
也就是说,第一个bch(15,11,1)集合应该是011011110010110101100,第二个没有交织
0100101101100000100000001010并拆分
01001011011 0001和00000100000 1010。
我正在搜索的是一个例程,它获取11+4位,并可以验证奇偶校验。交叉处理和所有其他我可以自己做的事情。如前所述,纠错对我来说并不重要,我只需要一个是/否。
任何能帮助我的东西都很感激。

最佳答案

在深入研究这个话题之后,我找到了一个可行的解决方案我在这里给任何有同样问题的人作参考。
注意:GETBITS是一个宏,它从“data”变量中提取给定数量的位并将其存储到提供的参数中我懒得提取和减少相关代码,所以请使用您自己的版本:-)

static int checkbds(int bits)
{
  static int const at[15] = {1, 2, 4, 8, 3, 6, 12, 11, 5, 10, 7, 14, 15, 13, 9};
  int s, i, j;

  for(i = 1; i <= 2; i++)
  {
    s = 0;
    for(j = 0; j < 15; j++)
    {
      if(bits & (1<<j))
      {
        s ^= at[(i * j) % 15];
      }
    }
    if(s != 0)
    {
      return 0;
    }
  }
  return 1;
}

int bdsbch(const unsigned char *data)
{
  int 38, i, b, b2, j;

  GETBITS(b, 15) /* drop first 15 bits */

  GETBITS(b, 15) /* get first bit set */
  if(!checkbds(b))
    return 0;
  for(i = 0; i < 9; ++i)
  {
    GETBITS(b, 11) /* get first bit set */
    GETBITS(b2, 11) /* get second bit set */
    GETBITS(j, 4)
    b = (b<<4)|j;
    GETBITS(j, 4)
    b2 = (b2<<4)|j;
    if(!checkbds(b) || !checkbds(b2))
      return 0;
  }
  return 1;
}

int main(void)
{
  printf("%d\n", bdsbch((const unsigned char*)"\xE2\x40\xDC\xB1\x2D\x82\x01\xA0\x43\xFF"
                  "\xA7\x27\x77\x77\xBA\x77\x77\x77\x7B\x77\x77\x76\xA7\x77\x80"
                  "\x35\x03\xC0\x01\x33\xE0\x00\xEE\xC6\xEE\xEE\xEE\x60"));
  printf("%d\n", bdsbch((const unsigned char*)"\xE2\x41\x1C\x9D\x2D\x9D\xD1\x7D\xDD\xDD"
                  "\xDA\x9D\xDD\xE0\xD5\x00\xF0\x02\x64\x78\x00\x16\x35\x55\x55"
                  "\x52\xD5\x55\x55\x4B\x55\x55\x55\x2D\x55\x55\x54\xB0"));
}

关于c - 如何检查BDS/北斗卫星系统的BCH(15,11,1)代码/校验和,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24612436/

10-08 22:01