最近在做一个项目,使用以前寻呼机使用的POCSAG编码,下面先介绍下POCSAG编码。
POCSAG码是我国公众寻呼网广泛使用的信息编码,它具有容量大、编码效率高、适应能力强等优点委员会(CCIR)推荐为“无线寻呼1号码”。
POCSAG码常使用1200 bps和512 bps 2种传输速率。每次传输包括一个前置码(Preamble),亦称位同步码,后跟完整码字的若干个码组(Batch),每个码组起始均有一个字同步码字(SC)。当无后续呼叫时,发送可在一码组终点停止。信号格式如图1所示。
,被国际无线电咨询
图1 POCSAG码格式
在实际信息传输中,总是在遵守以上格式的情况下,一个地址码字后面跟随着多个信息码字。在每个码组中,对同步码字后的8个帧分别给予0~7的编号。在实际寻呼网中,全部寻呼机被分成8组,每个寻呼机只接收特定帧的地址码,因此,寻呼机接收的特定帧号成为其21位地址的低3位。在任何码组中,若没有地址码字或信息码字时,则用空闲码字填满。
假设我们来传输的信息是“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”的码字分配情况
位 |
0 |
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)值 |
奇偶校验位 |
查阅相关资料(《信息论与编码》)可得: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所示:
图2 信息位与生成多项式进行模2除法运算过程
至此,我们可以得到,码字1的实际内容为:
表 信息“WAITSHA”前20位编码后得到的实际码字1
位 |
0 |
1 - 20 |
21 - 30 |
31 |
码字1 |
1 |
0101 0011 0100 0001 0100 |
10 0111 1100 |
1 |
在数据传输过程中,如果没有发生错误的话,我们应该接收到的内容应该是:
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,示例如下。
A |
B |
C |
|
A |
D |
G |
J |
D |
E |
F |
前后 互为 转置 矩阵 |
B |
E |
H |
K |
G |
H |
I |
C |
F |
I |
L |
|
J |
K |
L |
|
|
|
|
|
BCH(31,21)一致校验矩阵为10行31列,则它的转置矩阵H为31行10列,D为1行31列。R=D*H,则R为1行10列的矩阵。
矩阵乘法示例:
a |
b |
c |
d |
e |
f |
矩阵A |
1 |
2 |
3 |
4 |
5 |
6 |
矩阵B |
|
|
1*a+3*b+5*c |
2*a+4*b+6*c |
1*d+3*e+5*f |
2*d+4*e+6*f |
|
|
矩阵C = 矩阵A*矩阵B |
|
上面单元格中的*表示“与”运算 |
|
上面单元格中的+表示“或”运算 |
|
1*0=0 , 1*1=1 , 0*1=0 , 0*0 = 0 |
|
1+0=1 , 1+1=1 , 0+1=1 , 0+0 = 0 |
得到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)的第二位发生了错误,将其反转纠错。
这只是一位数据发生错误的情况,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所示:
列5 |
0 |
1 |
1 |
1 |
1 |
0 |
0 |
0 |
0 |
1 |
列7 |
0 |
1 |
1 |
0 |
1 |
0 |
0 |
0 |
1 |
0 |
结果 |
0 |
0 |
0 |
1 |
0 |
0 |
0 |
0 |
1 |
1 |
图4 列5与列7的异或结果。
其结果行与上面对数据(3)进行的纠错计算是一样的,所以可以得知接收到的数据第5和第7位发生了错误,进行反转即可。
作者没有上过《信息论与编码》的课程,内容难免有错误,欢迎提出,作者定在第一时间修改。
作者只初略知道BCH(31,21),其它的BCH(!=31,!=21)都不了解,;) 。
作者也不清楚文件中提到的g(x) 和一致校验矩阵是怎么来的,都是由相关资料中找到的。
参考文献:
《信息论与编码导论》Robert J.McEliece
《信息论与编码》姜丹
作者将在最近时间提出编码与解码程序,如有兴趣请关注。
希望文章能够帮助你,最后一句“支持原创”,经常找到一模一样的内容,很郁闷 :( ……
源码链接:http://download.csdn.net/detail/woijal520/3618990 添加日期:2011-09-20 13:07:00