3 RDS数据组同步的获取
在RDS数据块中,采用的是标准CRC校验的一种变形,其生成多项式为:
将16位的信息字对g(x)进行模2除法,所得到的余式再使用模2加法加上数据块的偏移量即构成所发送的10位校验字。
由于RDS数据组、数据块之间采用连续发送,没有任何间隔,要完成RDS数据组的同步操作,必须要在每接收到一个新的数据位后,都对新组成的26位数据流进行CRC校验运算。为了保证数据处理的连续性,运算必须在下一个数据位到来前完成,也就是说,必须要在842μs(即一个RDS码元周期)内完成运算。
由于RDS中CRC校验的生成多项式G(x)在单片机运算中占据两个字节,根据CRC校验的原理,其在8位单片机中的运算其实就是一种三字节序列递推运算,每次运算所得的余式加入下一个三字节序列进行模二除法。依次类推,每一次递推运算都是对一个三字节序列的计算,因此,如何简单快捷地对三字节进行运算是算法的关键。
提到简单快捷,人们自然会想到查表法,即事先将三字节序列的所有余式计算出来,置于一个称之为余式表的表格中供随时读取。不过这样的表格太大,需要224个16位单元,即占用225个字节的存储空间,这对单片机来说是无法接受的,因此,要设法尽量减少表格所占用的存储空间。
设一个三字节序列Tabc=[a b c],一个三字节序列Ta00=[a O O]和一个二字节序列Tbc=[b c]。可以用多项式的形式表示它们之间的关系为Tabc(x)=Ta00(x)+Tbc(x),因此,对Ta00来说:
其中,Qa00(x)是整数,与余式无关;而Ra00(x)和Tbc都是二字节序列,因而,它们的和(模2加法,即异或运算)仍然是二字节序列,因此,它就是Tabc的余式Rabc,即:
这样就可以把三字节序列Tabc=[a b c]的运算分解成两个步骤来完成:
(1)通过查余式表,读取Ta00=[a O 0]的余式Ra00=[ha00 laO0];
(2)将Ra00与[b c]进行异或运算,从而得到[a b c]的余式Rabc=[habc labc]。
由于[a 0 0]只有一个字节不为零,因此,余式表只需要256个单元即512 B的存储空间。
在RDS接收机的设计过程中采用的是PIC16F74单片机,其ROM空间仅有16 KB,还要完成显示控制、电子调谐控制等许多其他功能,存储空间非常紧张,所以还需要对余式表进行压缩。
将Ta00=[a o o]分解为Ta00=[e O O]和Tf00=[f 0 O],并使字节e的上半字节内容与a的上半字节相同但下半字节为零,同时使字节f的下半字节内容与a的下半字节内容相同但上半字节内容为零,然后用Ta00和Tf00的生成余式表来代替Ta00的余式表。由于Ta00和Tf00中只有半个字节内容不为零,所以每个余式表只需16个单元,即32个字节,两个余式表共占用64个字节,可以满足PIC16F74单片机对于存储空间的要求。
实现CRC校验的快速算法只是获取RDS数据信号同步的前提条件之一。由于RDS数据信号的同步信息是包含在每个26位数据块的结尾处,必须采用先接收数据,再进行同步运算的办法。在PICl6F74单片机的通用寄存器中专门为接收数据设置了4个字节的缓冲区,每接收到1位数据,就按照先入先出(FIFO)的原则对数据缓冲区进行移位操作,然后对最近接收到的26位数据进行CRC校验运算,将运算结果与RDS数据块偏移量A,B,C,D进行比较,如果发现与其中之一相同,则认为进入准同步状态。由于接收数据的随机性,在单独一个26位数据流中运算出数据块偏移量的几率是比较大的,所以必须进行进一步的检测。