一个医院呼叫器项目,采用以前的寻呼机技术,使用以前寻呼机使用的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种。
- 同步码字的16进制表示为(7CD215D8 ),
- 空闲码字的16进制表示为(7A89C197)。
- 在地址码字中,第1位为0,第2
19位为地址,20和21位为状态,2231位为BCH校验,第32位为奇偶校验。 - 在信息码字中,第1位为1,第2
21位为信息,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
-
《信息论与编码》姜丹