Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何检查BDS/北斗卫星系统的BCH(15,11,1)代码/校验和_C_Algorithm_Checksum_Parity - Fatal编程技术网

如何检查BDS/北斗卫星系统的BCH(15,11,1)代码/校验和

如何检查BDS/北斗卫星系统的BCH(15,11,1)代码/校验和,c,algorithm,checksum,parity,C,Algorithm,Checksum,Parity,PDF第5章(第9ff页)描述了北斗系统的BCH(15,11,1)代码 我正在尝试使用此代码进行错误检查(即,我只想验证奇偶校验信息-我不需要错误修复功能)。理想情况下,我搜索一个例程,它得到15位并返回匹配的4个奇偶校验位 我检查了以下代码,但无法让它执行我想要的操作。在最好的情况下,它生成BCH(15,11,3)代码 以下是两个示例字符串: E240DCB12D8201A043FFA7277777BA7777B777776A77803503C0133E000EEC6EEEE60 E2411

PDF第5章(第9ff页)描述了北斗系统的BCH(15,11,1)代码

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

我检查了以下代码,但无法让它执行我想要的操作。在最好的情况下,它生成BCH(15,11,3)代码

以下是两个示例字符串: E240DCB12D8201A043FFA7277777BA7777B777776A77803503C0133E000EEC6EEEE60 E2411C9D2D9DD17DDDDDDD9DDDE0D500F0026478001355555552D555554B555552D555554B0

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

也就是说,第一个BCH(15,11,1)集应该是011011110010 1100,第二个没有交错 010010110110000010000001010并拆分 01001011011 0001和00000100000 1010

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


任何对我有帮助的都将不胜感激。

在深入研究这个话题后,我找到了一个有效的解决方案。我会把它作为任何有同样问题的人的参考

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

静态整数校验BDS(整数位)
{
[15]处的静态int常量={1,2,4,8,3,6,12,11,5,10,7,14,15,13,9};
int s,i,j;

对于(i=1;i而言,您的代码中没有实现交错。但北斗ICD告诉我们有。您的代码是否正常工作

顺便说一下,我的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来工作

这取决于你从哪里获得数据。我得到的数据来自接收器的原始数据集,交织已经在那里移除。如果你更接近原始数据,那么你需要注意交织。I r硬件中的锁相环路后接收数据,所以我有卫星发送的比特流。但在任何情况下,在检查crc之前,都必须进行dch解码。crc功能在ICD北斗中实现了相关方案
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;
}