【问题标题】:How to check a BCH(15,11,1) code/checksum for BDS/Beidou satellite system如何检查 BDS/北斗卫星系统的 BCH(15,11,1) 代码/校验和
【发布时间】:2014-08-28 01:03:51
【问题描述】:

在 PDF http://www.beidou.gov.cn/attach/2012/12/27/201212273da29c5eb8274deb8cd2b178228ba2bd.pdf 第 5 章(第 9 页)中,描述了北斗系统的 BCH(15,11,1) 代码。

我正在尝试使用此代码进行错误检查(即我只想验证奇偶校验信息 - 我不需要错误修复功能)。理想情况下,我搜索一个例程,它获取 15 位并返回匹配的 4 个奇偶校验位。

我检查了以下代码,但无法让它做我想做的事。最好是生成 BCH(15,11,3) 代码。

http://www.eccpage.com/bch3.c

两个示例字符串是: E240DCB12D8201A043FFA7277777BA7777777B777776A777803503C00133E000EEC6EEEEEE60 E2411C9D2D9DD17DDDDDDA9DDDE0D500F0026478001635555552D555554B5555552D555554B0

请注意,前 15 位不是 BCH 编码,第二组是,从第三组开始,两个编码是交错的,如第 14 页所述。

I.E.第一个 BCH(15,11,1) 集应该是 01101110010 1100,第二个没有交错 0100101101100000100000 00011010 并拆分 01001011011 0001 和 00000100000 1010。

我正在搜索的是一个例程,它获取这 11+4 位并可以验证奇偶校验。交错处理和所有其他我可以自己做的事情。如前所述,纠错对我来说并不重要,我只需要一个是/否。

感谢任何对我有帮助的东西。

【问题讨论】:

    标签: c algorithm checksum parity


    【解决方案1】:

    您的代码中没有实现交错。但是ICD BEIDOU说有。您的代码运行正常吗?

    顺便说一下我的crc计算函数是

    typedef union {
        uint8_t val;
        struct {
            uint8_t b0:1;
            uint8_t b1:1;
            uint8_t b2:1;
            uint8_t b3:1;
        } bits;
    } bch_reg;
    
    uint8_t crc_calc(uint16_t data)
    {
        bch_reg reg;
        int8_t i;
        uint8_t gate1; // icd
        reg.val = 0;
    
        for (i = 10; i >= 0; i--) {
            gate1 = reg.bits.b3^(data >> i & 1);
            reg.bits.b3 = reg.bits.b2;
            reg.bits.b2 = reg.bits.b1;
            reg.bits.b1 = reg.bits.b0^gate1;
            reg.bits.b0 = gate1;
        }
    
        return reg.val;
    }
    

    哦,还有一件事。我试图在不解码的情况下计算 crc,但它不起作用。所以你需要交错而不是解码,然后计算并检查 crc

    uint16_t decode_bch_bin(uint16_t enc)
    {
        bch_reg reg;
        int8_t i;
        uint8_t bit;
        uint16_t const err[16] = {0, 1, 2, 16, 4, 256, 32, 1024, 8, 16384, 512, 128, 64, 
            8192, 2048, 4096}; 
        /* see Table 5.2 */
        reg.val = 0;
        /* BCH decoding (Fig 5-4) */
        for (i = 14; i >= 0; i--) {
            bit = reg.bits.b3;
            reg.bits.b3 = reg.bits.b2;
            reg.bits.b2 = reg.bits.b1;
            reg.bits.b1 = reg.bits.b0^bit;
            reg.bits.b0 = (enc >> i & 1)^bit;
        }
    
        /*error correction*/
        enc ^= err[reg.val];
        /*wipe off crc bits*/
        return enc;
    }
    

    附:我更喜欢 uin16_t 而不是 int,因为 1 个代码序列中有 15 位,但它也可以在 int 上工作

    【讨论】:

    • 这取决于您从哪里获取数据。我得到的数据来自接收器的原始数据集,并且交织已经在那里被删除。如果你更接近原始数据,那么你需要注意交错。
    • 我在硬件中的锁相环之后立即接收到数据,所以我有比特流,就像卫星发送一样。但无论如何,在检查 crc 之前,您必须进行 dch 解码。 crc函数实现ICD北斗中的相关方案
    【解决方案2】:

    在深入研究该主题后,我找到了一个可行的解决方案。我会在这里提供给遇到同样问题的任何人作为参考。

    注意:GETBITS 是一个宏,它从“数据”变量中提取给定数量的位并将它们存储到提供的参数中。我懒得提取和减少相关代码,所以使用你自己的版本:-)

    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"));
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-30
      • 1970-01-01
      • 1970-01-01
      • 2014-03-22
      • 2020-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多