在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编码,第二组是,从第3组开始,两个编码被交织在一起,如第14页所述。
即第一个BCH(15,11,1)组应为01101110010 1100,第二组为01001011011000000000011010,分拆为010010110110001和000001000001010。
我正在搜索的是一个例程,它获取这些11+4位并验证奇偶校验。交叉处理和其他我自己能做的事情。如前所述,纠错对我来说并不重要,我只需要一个是/否。
任何能帮我的事都很感激。
发布于 2014-07-14 16:31:52
在深入研究这个主题之后,我找到了一个可行的解决方案。我会在这里作为任何有同样问题的人的参考。
注意: 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"));
}
发布于 2015-11-26 14:36:59
在代码中没有实现交织。但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,因为在一个代码序列中有15位,但是它也能工作。
https://stackoverflow.com/questions/24612436
复制相似问题