一个医院呼叫器项目,采用以前的寻呼机技术,使用以前寻呼机使用的POCSAG编码,网上找了很多资料都凌乱而且都是直接复制粘贴,原文也没出处,很头疼,特意讲网络文章做了下整理:

POCSAG编码介绍

1.1 POCSAG简介

POCSAG码是我国公众寻呼网广泛使用的信息编码,它具有容量大、编码效率高、适应能力强等优点委员会(CCIR)推荐为"无线寻呼1号码"。

1.2 POCSAG码的格式

POCSAG码常使用1200 bps和512 bps 2种传输速率。每次传输包括一个前置码(Preamble),亦称位同步码,后跟完整码字的若干个码组(Batch),每个码组起始均有一个字同步码字(SC)。当无后续呼叫时,发送可在一码组终点停止。

POCSAG码格式:

  • A为前置码,它是一种101010……形式的翻转方波,其持续时间至少为576位;
  • B为POCSAG第一码组,它以同步码字(SC)开始,其后跟随着8个帧(Frame),每帧又包含2个码字(Codeword) ,每个码字为32位。显然,每帧的长度是17个码字,共544位。
  • C为第二及随后的各码组,码组结构与第一码组相同。码字可分为同步码字、地址码字、信息码字和空闲码字4种。
  1. 同步码字的16进制表示为(7CD215D8 ),
  2. 空闲码字的16进制表示为(7A89C197)。
  3. 在地址码字中,第1位为0,第219位为地址,20和21位为状态,2231位为BCH校验,第32位为奇偶校验。
  4. 在信息码字中,第1位为1,第221位为信息,2231位为BCH校验,第32位为奇偶校验。

在实际信息传输中,总是在遵守以上格式的情况下,一个地址码字后面跟随着多个信息码字。在每个码组中,对同步码字后的8个帧分别给予0~7的编号。在实际寻呼网中,全部寻呼机被分成8组,每个寻呼机只接收特定帧的地址码,因此,寻呼机接收的特定帧号成为其21位地址的低3位。在任何码组中,若没有地址码字或信息码字时,则用空闲码字填满。

2.1 BCH(31,21)编码解码

假设我们来传输的信息是"WAITSHA.",则可以得到下面的编码信息。

W(0x57):0101 0111

A(0x41):0100 0001

I(0x49):0100 1001

T(0x54):0101 0100

S(0x53):0101 0011

H(0x48):0100 1000

A(0x41):0100 0001

则最后得到需要传输的内容为:

01010011  01000001  01001001  01010100  01010011  01001000  01000001

共56=7*8位。

而每一个信息码字里面可以传输20位,则需要3个信息码字方能将数据传输完整。

详细信息码字如下:

表 信息"WAITSHA"的码字分配情况

1 – 20 21 – 30 31
码字1 1 0101 0011 0100 0001 0100 BCH(31,21)值 奇偶校验位
码字2 1 1001 0101 0100 0101 0011 BCH(31,21)值 奇偶校验位
码字3 1 0100 1000 0100 0001 0000 BCH(31,21)值 奇偶校验位

2.2 BCH(31,21)编码

查阅相关资料(《信息论与编码》)可得:BCH(31,21)的生成多项式为:

g(x) = x 10 + x 9 + x 8 + x 6 + x 5+ x 3 + 1,即1110 1101 001

将21位信息位对生成多项式进行模2除法运算(方法与按位进行的CRC运算完全相同),运算过程如下图2所示:

至此,我们可以得到,码字1的实际内容为:

2.3.1 BCH(31,21)纠正一位错误

在数据传输过程中,如果没有发生错误的话,我们应该接收到的内容应该是:

1010  1001  1010  0000  1010  0100  1111  1001   数据 (1)

将接收到的数据(1)与矩阵H进行乘法运算可以得到新矩阵R,称R为伴随式。

R = D*H

(其中 D为数据(1)前31位的1行31列矩阵——奇偶校验位不参加运算 , H为BCH(31,21)一致校验矩阵(参见图3)的转置矩阵)


图3 BCH(31,21)的一致校验矩阵。

提示:矩阵的转置矩阵等于原矩阵的行列元素相互交换,如果交换前矩阵元素为M*N,则转置后矩阵为N*M,示例如下。

BCH(31,21)一致校验矩阵为10行31列,则它的转置矩阵H为31行10列,D为1行31列。R=D*H,则R为1行10列的矩阵。

矩阵乘法示例:

得到R后,我们就可以根据R矩阵来判断具体是哪一位或者哪二位出现的错误,错误的可能只是由1错为0或者相反,发现错误位后直接反转即可纠错。

由前面内容可以知道数据(1)是没有发生错误的,其伴随式R中的所有元素均为0,现将数据(1)第2位反转得到数据(2):

1110  1001  1010  0000  1010  0100  1111  1001   数据 (2)

R2 = D2 *H,对数据(2)进行译码的结果为:0 1 1 1 0 1 1 0 1 0。可见结果与图3中的第二列一模一样,则可以数据(2)的第二位发生了错误,将其反转纠错。

2.3.1 BCH(31,21)纠正二位错误

这只是一位数据发生错误的情况,BCH(31,21)是可以纠正两位随机错误的。我们将数据(1)的第5,7位进行反转,得到数据(3):

1010  0011  1010  0000  1010  0100  1111  1001   数据 (3)

R3 = D3 *H,对数据(2)进行译码的结果为:0 0 0 1 0 0 0 0 1 1。0 0 0 1 0 0 0 0 1 1在图3中打不到,这时候需要一点异或运算,如下:

取图3中任意不同的两列(列i和列j),对两列元素下标相同的进行异或运算。当ij分别等于5和7时,结果如图4所示:

其结果行与上面对数据(3)进行的纠错计算是一样的,所以可以得知接收到的数据第5和第7位发生了错误,进行反转即可。

作者没有上过《信息论与编码》的课程,内容难免有错误,欢迎提出,作者定在第一时间修改。

作者只初略知道BCH(31,21),其它的BCH(!=31,!=21)都不了解,;) 。

作者也不清楚文件中提到的_g_(x)_ _和一致校验矩阵是怎么来的,都是由相关资料中找到的。

参考文献

  • 《信息论与编码导论》Robert J.McEliece

  • 《信息论与编码》姜丹

源码链接

http://download.csdn.net/detail/woijal520/3618990