天气雷达数据压缩算法设计
xu_zh_cosmos
(2007年7月26日---2007年8月8日)
雷达每扫描一周,就获得一次回波数据,这些数据往往需要大的硬盘存放。以四川绵阳民航飞行学院站点的天气雷达回波数据为例,一个日志文件的大小就有180M,有的甚至达到500M左右。为了提高雷达数据的传输速率,减少雷达数据量,因此找到一个合适的数据压缩方法是有非常重要的实现意义。
1 天气雷达回波数据的特点
天气雷达数据是以文件形式存放到存储介质上,文件格式如表1所示。
下面是四川绵阳民航飞行学院站点2007年07月13日15时18分15秒扫描的天气雷达回波数据。以一字节为最小读写的单位,通过编程显示原始数字回波数据,如图1所示,
图中数值是以16进制表示的,可以看到存在大量的数值为00和FF的数据。倘若这些大量的相同数值只用一个标记和一些控制字来表示,在把其写入压缩文件里。这样就达到数据压缩。这些重复出现的数据具有稀疏串的数据特点。
在文件处理中,无论输入的文本数据、二进制数、图像还是其他的数据形式,我们都可以把输入流看成一个位串。在文献[1]对此有详细的介绍。且文献[1]认为如果串中的大部分位是0,就是稀疏的。在此,本文提出更为广义的稀疏串的定义:只要串中存在着大部分子串的数值相同,就可认为是稀疏的。由此,可以把文献[1]定义的稀疏串在本文中称为狭义的稀疏串。
2 狭义的稀疏串压缩方法[1]
2.1 编码方法
首先定位稀疏串开始的位置,假使从N1位的稀疏串L1。
第一步, 把稀疏串L1等分为16个4位长的4位长的子串,再对字串中按位逻辑或得到16位串L2:
L1=0000|0000|0000|0000|0000|1001|0100|0000|0000|0000|0001|0000|0000|0000|1000|0000
L2=0000|0110|0010|0010|
第二步,对L2的字串进行同样的位逻辑运算得到L3:
L3=0111
第三步,把L1、L2中所有0子串删去。最终得到三个子串:
L1=1001|0100|0001|1000,L2=0110|0010|0010,L3=0111
输出流是8个子串,是原来的一半,然后只要增加几个数字来标识每个子串的长度。
2.2 解码方法
解压过程是以通过子串L3来重构L1,具体过程如图2所示:
由图可知解码过程为:各级中的0生成下一级子串0,1用编码流中相对应的级的非0子串代替,如此这样直至解码结束。
3 广义的稀疏串压缩方法
同样先采集64位字,为了针对雷达回波数据,数据来源于图1的地址为00477d00h那行数据,即
L1=0001|1101|0000|0000|0000|0000|0000|0000|1111|0000|1111|1111|1111|1111|1111|1111。
可以看到0、F均满足稀疏串分布的特点。如果采用狭义的稀疏串压缩方法,编码流为:
L1=0001|1101|1111|1111|1111|1111|1111|1111|1111,L2=1100|1011|1111,L3=1011,还要增加一些控制字符,这样的压缩效果明显是不好的。如果以F为稀疏串编码(可以按位逻辑与或者取反按位逻辑或处理),同理会起到数据扩展,而非数据压缩。现介绍本文提出的广义的稀疏串压缩方法。
把0、F都看成稀疏串的数据,这样一个4位的子串就存在0、F和非稀疏串的三种状态。所以编码串必须用2位子串才能标识。为了充分利用2位标识子串,对标识子串如下分配:用11标识1111,00标识0000,用10标识的范围为1000-1011,用01标识的范围为其他10个数字。
再接下来编码时,标识子串为00和11不需要附加信息,解码流就知道其原码是0000和1111。这样编码的好处在于把8字节的标识子串在输出时一起输出,附加信息在它们的后面输出。因为雷达回波数据中存在大量的0、F,所以标识子串流也会构成0、F稀疏串,这样可以二次压缩,提高压缩性能。
如果子串值属于1000-1011时,只需附加后两位子串到编码流中。在解码时,遇到10的标识串,就只在附加的码流中提取两位子串作为低两位,标识位10作为高两位,这样的结合数值与原码相同实现解码。这样就进一步提高了标识子串的利用率,同时也对1000-1011的非稀疏子串进行了压缩。标识子串为01,编码流要在附加流中添加4位原码信息。虽然这十个数值没有进行压缩,但雷达回波数据中稀疏串是0和F,这样编码毕竟是少数,同时这样可以在编码流不必再增加其余的控制字,解码同样可以准确无误进行,降低了解码器的复杂度。
该方法对图1的地址为00477d00h那行数据的数据编码过程如下:
第一步,读入一个字节数据存放在如下的结构体中:
struct Indata
{
unsigned H:4;
unsigned L:4;
}fidata;
第二步,依次对读入的1字节数据按高低字节进行分配标识子串,存放在如下的结构体中:
struct Outdata
{
unsigned H:2;
unsigned L:2;
}fodata[8];
第三步,对fodata[8]里的H、L的进行分析,如果是00和11不必分配附加信息。如果是10,附加位取自相应的fidata的H、L的低二位数值。如果是01,原数值附加到以下的结构体中:
struct Appendata
{
unsigned APFH:4; //存放标识子串为01的原码数值。
unsigned APFL:4;
unsigned APTH:2; //存放标识子串为10的原码低两位数值。
unsigned APTL:2;
}Apdata[8];
最终得到的编码流为:0101|0000|0000|0000|1100|1111|1111|1111|0001|11101,输出编码流不需要要附加其他任何控制信息,且流中也含0、F稀疏串可以再进行二次压缩。
现对编码流,进行解码。解码过程如下:
第一步,读取8个2位的标识子串存放在如下结构体中。
struct contr
{
unsigned H:2;
unsigned L:2;
}control[8];
第二步,依次对读入的8字节数据标识子串分析,如果是00和11,就解码成0000、1111;如果是10,10作为解码数据的高二位数值,再读取相应的2位附加位,作为解码数据的低二位数值。如果是01,再读取相应的4位附加位,作为解码数据输出,对编码流0101|0000|0000|0000|1100|1111|1111|1111|0001|11101解码输出为0001|1101|0000|0000|0000|0000|0000|0000|1111|0000|1111|1111|1111|1111|1111|1111。
达到了无损压缩的效果。
结束语
本文提出的广义稀疏串及其压缩方法,简单易行。该方法还具有一个优点是,在程序设计时可设计为自适应的压缩,如果第一次压缩输出码流含有比较多的广义稀疏串,可进行二次压缩,以提高压缩质量。该方法可以用于雷达回波数据的实时压缩。最后感谢成都远望科技有限责任公司的软件开发工程师王文明为本文提供大量的近期天气雷达回波数据!
参考文献
[1]David Salomon著.数据压缩原理与应用[M].吴乐南译.北京:电子工业出版社,2003:528-532。