发明内容
本发明要解决的技术问题是针对上述现有技术的不足,而提供一种基于LZW编码与改进游程编码的雷达数据无损压缩及解压方法,该基于LZW编码与改进游程编码的雷达数据无损压缩及解压方法具备无损、实时、压缩率高、节省资源且适用性强。
为解决上述技术问题,本发明采用的技术方案是:
一种基于LZW编码与改进游程编码的雷达数据无损压缩及解压方法,包括无损压缩和无损解压。
其中,无损压缩为将N bit的原数据,采用LZW编码或改进游程编码,使拓展为(N+M)bit的压缩数据,其中,M 为正整数且2≤M。
针对(N+M)bit的压缩数据,假设取其首位为标志位,用于识别压缩数据的压缩编码方式,同时假设标志位为“0”时,表示采用LZW编码,则“1”表示采用改进游程编码。
当标志位表示采用LZW编码时,标志位后面的(N+M-1)bit,从右至左的有效bit,则对应原数据。
当标志位表示采用改进游程编码时,假设取(N+M)bit压缩数据的最后(M-1)bit表示N bit原数据重复出现的次数,则位于标志位与最后(M-1)bit之间的N bit数据直接对应N bit原数据。
无损解压为将(N+M)bit的压缩数据,恢复为N bit原数据。无损解压时,通过标志位,识别压缩数据所采用的压缩编码方式,并采用与压缩相反的方式,恢复出N bit原数据。
无损压缩的方法,包括如下步骤。
步骤S1,初始化LZW字典。
步骤S2,建立标志位与编码对应关系:假设取压缩数据的首位为标志位并设定其为“0”时,表示采用LZW编码。设定标志位为“1”时,表示采用改进游程编码。
步骤S3,建立重复次数编码:当采用改进游程编码时,假设取(N+M)bit压缩数据的最后(M-1)bit表示N bit原数据重复出现的次数,则位于标志位与最后(M-1)bit之间的Nbit数据直接对应N bit原数据,同时建立最后(M-1)bit与N bit原数据重复次数cnt的对应关系。
步骤S4,当前N bit原数据的读取及寄存:假设待压缩数据串包含连续的原数据Dc和Dn。先读入当前到来的N bit原数据Dc,并将Dc进行寄存。
步骤S5,下一个N bit原数据的读取与比较:读入下一个N bit原数据Dn。
步骤S6,Dn与Dc比较:将步骤S5读入的Dn与步骤S4寄存的Dc按照如下方式进行比较:
步骤S61:若Dc=Dn,对Dc的重复次数cnt进行自增1运算,然后判断Dn是否为最后一个重复数据。
步骤S61A):若Dn为最后一个重复原数据,则采用改进游程编码,进行压缩数据输出。此时,改进游程编码的压缩输出方式为:先将首位设置为“1”,再根据步骤S3建立的重复次数编码,查找出步骤S61中自增运算后的cnt值所对应的重复次数编码,进行最后(M-1)bit的编码。最后,将读取的N bit原数据Dc,直接放置在标志位与最后(M-1)bit之间,从而形成改进游程编码的压缩输出数据。
步骤S61B):若Dn不是最后一个重复原数据,则读入Dn之后连续重复的N bit原数据,并记录最终自增运算后的重复次数cnt值,并按照步骤S61A)的改进游程编码压缩输出方式,形成改进游程编码的压缩输出数据。
步骤S62:若Dc≠Dn,判断Dc的重复次数变量cnt是否为0。
步骤S62A):若cnt=0,且Dn是最后一个原数据,则将Dc与Dn均采用LZW编码输出,压缩过程结束。
步骤S62B):若cnt=0,且Dn不是最后一个原数据,准备将Dc按照LZW编码输出,将Dn寄存并继续读入Dn后的下一个原数据。随后,将当前读入的Dn和下一个原数据与Dn进行比较,依次类推,直至最后一个原数据或出现相邻两个原数据相等时,将相等的相邻两个原数据前的所有非相等原数据,均准备按照LZW编码的压缩输出方式,依次进行压缩数据的输出。
步骤S62C):若cnt≠0,则表示Dc已经重复出现了cnt次,先准备将Dc采用改进游程编码输出,再判断Dn是否为最后一个重复数据,若是,则将Dc采用LZW编码输出并结束压缩过程,否则令Dc=Dn,并将Dc寄存,然后返回步骤S5继续进行压缩过程。
LZW编码的压缩输出方式为:先将首位设置为“0”,再将N bit原数据Dc和Dn经LZW编码后的压缩数据放置在待输出的编码数据的末尾,同时根据需要在首位和LZW编码数据有效位之前补“0”,从而形成(N+M)bitLZW编码的压缩输出数据。
无损解压的方法,包括如下步骤:
步骤Y1:读入待解压数据Di。
步骤Y2,选择解压方式:通过判断标志位的值,选择对应的解压方式。若标志位的值为1,则选择游程解码规则进行解压Di。若标志位的值为0,则选择LZW解码规则进行解压Di。
步骤Y3,解压:按照步骤Y2选择的解压方式,对Di进行解压,其中:
A)游程解码规则为:读取最后(M-1)bit的值,根据步骤S3建立的重复次数编码,查找得出Di的重复次数cnt值,再读取标志位与最后(M-1)bit之间的N bit原数据Dc,然后将Dc重复cnt次后输出。
B)LZW解码规则为:读取标志位后的(N+M-1)bit的值,按照传统LZW编码的解码规则进行解码。
步骤Y4:判断Di是否为最后一位待解压数据,若是,则结束此次解压过程。否则,返回步骤Y1,继续执行解压过程。
本发明具有如下有益效果:
1、充分利用了LZW编码与改进游程编码无损压缩、实时压缩的特性,同时利用LZW编码过程中对N bit数据拓展至(N+M)bit(一般M<N)的特点对传统游程编码进行改进,在一个压缩进程中用(N+M)bit输出数据的首位作为标志位对LZW编码与改进游程编码进行区分,同时用(M-1)bit表示采用改进游程编码时N bit数据重复出现的次数,取消了传统游程编码的压缩标志符与重复出现次数符,一方面节省了输出数据量,且相较原始方法中数据需连续重复出现4次才具有压缩效果的情况,该方法在数据重复出现2次即具有压缩效果,压缩率最高能提升66.7%。
2、本发明中,由于将重复的原数据,采用改进游程编码进行压缩,从而节省了LZW编码的字典库资源,减小了LZW编码的字典深度,大大减小了每次LZW编码时的比较次数,大大节省逻辑资源,具备无损压缩、实时压缩、高效压缩、节省资源且适用范围广的突出优点。
3、根据数据重复出现的特征自动选择较为合适的压缩方法,提高了压缩算法的适用范围。
4、综合了LZW编码与游程编码实时压缩与无损压缩的特点,解码方便。
具体实施方式
下面结合附图和具体较佳实施方式对本发明作进一步详细的说明。
本发明的描述中,需要理解的是,术语“左侧”、“右侧”、“上部”、“下部”等指示的方位或位置关系为基于附图所示的方位或位置关系,仅是为了便于描述本发明和简化描述,而不是指示或暗示所指的装置或元件必须具有特定的方位、以特定的方位构造和操作,“第一”、“第二”等并不表示零部件的重要程度,因此不能理解为对本发明的限制。本实施例中采用的具体尺寸只是为了举例说明技术方案,并不限制本发明的保护范围。
如图1所示,一种基于LZW编码与改进游程编码的雷达数据无损压缩及解压方法,包括无损压缩和无损解压。
其中,无损压缩为将N bit的原数据,采用LZW编码或改进游程编码,使拓展为(N+M)bit的压缩数据,其中,M为正整数且2≤M。
针对(N+M)bit的压缩数据,假设取其首位为标志位,用于识别压缩数据的压缩编码方式,同时假设标志位为“0”时,表示采用LZW编码,则“1”表示采用改进游程编码。
当标志位表示采用LZW编码时,标志位后面的(N+M-1)bit,从右至左的有效bit,则对应原数据。
当标志位表示采用改进游程编码时,假设取(N+M)bit压缩数据的最后(M-1)bit表示N bit原数据重复出现的次数,则位于标志位与最后(M-1)bit之间的N bit数据直接对应N bit原数据。
无损解压为将(N+M)bit的压缩数据,恢复为N bit原数据。无损解压时,通过标志位,识别压缩数据所采用的压缩编码方式,并采用与压缩相反的方式,恢复出N bit原数据。
无损压缩的方法,包括如下步骤。
步骤S1,初始化LZW字典。
步骤S2,建立标志位与编码对应关系:假设取压缩数据的首位为标志位并设定其为“0”时,表示采用LZW编码。设定标志位为“1”时,表示采用改进改进游程编码。
步骤S3,建立重复次数编码:当采用改进游程编码时,假设取(N+M)bit压缩数据的最后(M-1)bit表示N bit原数据重复出现的次数,则位于标志位与最后(M-1)bit之间的Nbit数据直接对应N bit原数据,同时建立最后(M-1)bit与N bit原数据重复次数cnt的对应关系。
步骤S4,当前N bit原数据的读取及寄存:假设待压缩数据串包含连续的原数据Dc和Dn。先读入当前到来的N bit原数据Dc,并将Dc进行寄存。
步骤S5,下一个N bit原数据的读取与比较:读入下一个N bit原数据Dn。
步骤S6,Dn与Dc比较:将步骤S5读入的Dn与步骤S4寄存的Dc按照如下方式进行比较:
步骤S61:若Dc=Dn,对Dc的重复次数cnt进行自增1运算,然后判断Dn是否为最后一个重复数据。
步骤S61A):若Dn为最后一个重复原数据,则采用改进游程编码,进行压缩数据输出。此时,改进游程编码的压缩输出方式为:先将首位设置为“1”,再根据步骤S3建立的重复次数编码,查找出步骤S61中自增运算后的cnt值所对应的重复次数编码,进行最后(M-1)bit的编码。最后,将读取的N bit原数据Dc,直接放置在标志位与最后(M-1)bit之间,从而形成改进游程编码的压缩输出数据。
步骤S61B):若Dn不是最后一个重复原数据,则读入Dn之后连续重复的N bit原数据,并记录最终自增运算后的重复次数cnt值,并按照步骤S61A)的改进游程编码压缩输出方式,形成改进游程编码的压缩输出数据。
步骤S62:若Dc≠Dn,判断Dc的重复次数变量cnt是否为0。
步骤S62A):若cnt=0,且Dn是最后一个原数据,则将Dc与Dn均采用LZW编码输出,压缩过程结束。其中,LZW编码的压缩输出方式为:先将首位设置为“0”,再将N bit原数据Dc和Dn经LZW编码后的压缩数据放置在待输出的编码数据的末尾,同时根据需要在首位和LZW编码数据有效位之前补“0”,从而形成(N+M)bitLZW编码的压缩输出数据。
步骤S62B):若cnt=0,且Dn不是最后一个原数据,准备将Dc按照LZW编码输出,将Dn寄存并继续读入Dn后的下一个原数据。随后,将当前读入的Dn和下一个原数据与Dn进行比较,依次类推,直至最后一个原数据或出现相邻两个原数据相等时,将相等的相邻两个原数据前的所有非相等原数据,均准备按照LZW编码的压缩输出方式,依次进行压缩数据的输出。
步骤S62C):若cnt≠0,则表示Dc已经重复出现了cnt次,先准备将Dc采用改进游程编码输出,再判断Dn是否为最后一个重复数据,若是,则将Dc采用LZW编码输出并结束压缩过程,否则令Dc=Dn,并将Dc寄存,然后返回步骤S5继续进行压缩过程
如图2所示,无损解压的方法,包括如下步骤:
步骤Y1:读入待解压数据Di。
步骤Y2,选择解压方式:通过判断标志位的值,选择对应的解压方式。若标志位的值为1,则选择游程解码规则进行解压Di。若标志位的值为0,则选择LZW解码规则进行解压Di。
步骤Y3,解压:按照步骤Y2选择的解压方式,对Di进行解压,其中:
A)游程解码规则为:读取最后(M-1)bit的值,根据步骤S3建立的重复次数编码,查找得出Di的重复次数cnt值,再读取标志位与最后(M-1)bit之间的N bit原数据Dc,然后将Dc重复cnt次后输出。
B)LZW解码规则为:读取标志位后的(N+M-1)bit的值,按照传统LZW编码的解码规则进行解码。
步骤Y4:判断Di是否为最后一位待解压数据,若是,则结束此次解压过程。否则,返回步骤Y1,继续执行解压过程。
下面以一具体实施例,对上述压缩及解压方法,进行详细说明。
假定对一串十六进制表示的8bit数据1AH,96H,B5H,B5H,1AH,96H,D8H,0FH,0FH,0FH,0FH进行压缩,压缩后的数据也采用16进制输出,参照图3,按照如下步骤进行。
步骤S1,初始化LZW字典,其中,对于传统的LZW编码,“初始化字典”即代表着“将十六进制表示的所有8bit数据00H~FFH,共256个数据,均预存入LZW字典,形成原始LZW字典。
本实例中,N=8,M=4,也即将8bit的输入数据进行压缩,将压缩后输出的数据宽度拓展至12bit。同时,将十六进制表示的100H与101H分别设为输出数据中每个LZW字典的开始标志与结束标志。
步骤S2,建立标志位与编码对应关系:设定标志位为“0”时,表示采用LZW编码。设定标志位为“1”时,表示采用改进游程编码。
当采用LZW编码时,压缩后输出数据的有效位为后11位,对应的编码字典深度为2048。
当采用改进游程编码时,压缩后输出数据的有效位为后11位,有效位中的前八位为8bit原数据,末尾三位表示8bit原数据的重复次数。
步骤S3,建立重复次数编码:当采用改进游程编码时,建立最后(M-1)bit与N bit原数据重复次数cnt的对应关系。因为有标志位的存在,若末尾三位均为0,即表示数据重复两次;若末尾三位均为1,则表示数据重复9次,以此类推。也即:000-重复两次-cnt=1,001-重复三次-cnt=2,010-重复四次-cnt=3,011-重复五次-cnt=4,100-重复六次-cnt=5,101-重复七次-cnt=6,110-重复八次-cnt=7,111-重复九次-cnt=8。
在图2中,cnt= 2m-1,m取自然数,重复次数为流程图中计算得到的cnt值加1。
步骤S4,当前N bit原数据的读取及寄存:假设待压缩数据串为Dc和Dn。先读入当前到来的N bit原数据Dc,并将Dc进行寄存。
本实施例中,首先读入当前到来的数据1AH并将其寄存。
步骤S5,下一个N bit原数据的读取与比较:读入下一个N bit原数据Dn。
本实施例中,继续读入下一个数据96H。
步骤S6,Dn与Dc比较。
第一步,本实例中,首先输出开始标志100H(开始标志的具体编码及地址可以根据需要,自行设置),继续判断得知1AH在LZW字典库中,然后将96H寄存并继续读入下一个数据B5H,比较得知二者不相等且计数变量cnt=0,将96H也按照LZW编码压缩,判断1AH&96H不在字典库中,因此将1AH所在地址输出,并将1AH&96H加入字典库中,因字典库中000H~0FFH地址已用于存放00H~FFH的8bit初始数据,且100H及101H用于字典库开始标志和结束标志,因此将1AH&96H存入字典库的102H位置处,然后输出96H在字典库中的地址,得到的输出编码依次为01AH、096H。
其中,以1AH为例,采用LZW编码压缩的输出步骤如下:
由于原数据1AH=(00011010)2;编码时,需将原数据位宽拓展至12位。编码方法:首位,也即标志位,设为“0”,后8位为“00011010”,中间3位补0,故LZW编码压缩后数据为(000000011010)2=01AH。
第二步,将B5H寄存并继续读入下一个数B5H,二者相等,计数变量cnt自增1,继续读入下一个数1AH,二者不相等且计数变量cnt≠0,因此先将B5H采用改进游程编码压缩,标志位设为1,实际输出时将末尾三位进行修正,实际输出值为DA8H,同时将cnt清零并将1AH寄存。
第三步:继续读入下一个数96H,比较得到二者不相等且计数变量cnt=0,准备将1AH按照LZW编码压缩,将96H寄存并继续读入下一个数D8H,比较得到二者不相等且计数变量cnt=0,准备将96H按照LZW编码压缩,将D8H寄存并继续读入下一个数0FH,比较得到二者不相等且计数变量cnt=0,准备将0FH按照LZW编码压缩,将0FH寄存并继续读入下一个数据0FH,比较得到二者相等,故先将1AH、96H、D8H按照LZW编码压缩后再将0FH按照改进游程编码压缩同时将标志位设为1,计数变量自增1。
第四步:判断得知1AH在字典库中,1AH&96H也在字典库中,但是1AH&96H&D8H不在字典库中,因此先将1AH&96H在字典库中的地址输出,再将D8H在字典库中的地址输出,得到输出编码依次为102H、0D8H。
第五步:继续读入下一个数据0FH,比较得到二者相等,计数变量cnt继续自增1,继续读入下一个数据0FH,比较得到二者相等,计数变量cnt继续自增1,判断得到最后一个数据已经到来,将连续四个0FH按照改进游程编码压缩,拼接标志位、0FH以及修正后的计数变量cnt,得到压缩后的输出数据87AH,整理得到上述连续数据串压缩后输出的数据流为100H,01AH、096H,DA8H,102H、0D8H,87AH。
参照图2,对十六进制的12bit的输入数据进行解压得到8bit的原数据,如将100H,01AH、096H,DA8H,102H、0D8H,87AH进行解压,得到的数据流如图4所示,具体步骤为:
第一步:读入十六进制数据100H,判断为LZW起始编码标志,继续读入下一个数据01AH,判断标志位为0,该数据按照LZW编码解压,得到原数据为1AH,判断不是最后一个数据。
第二步:继续读入下一个数据096H,判断标志位为0,该数据按照LZW编码解压,得到原数据为96H。
第三步:判断不是最后一个数据,继续读入下一个数据DA8H,判断标志位为1,该数据按照改进游程编码解压,原数据为第2至第9位,为B5H,计数变量cnt为末尾三位,为000,表示原数据中B5H重复出现了两次,得到原数据为B5H,B5H。
第四步:判断不是最后一个数据,继续读入下一个数据102H,判断标志位为0,该数据按照LZW编码解压,因102H已超过字典初始化最大地址,因此102H表示前面已经连续出现的数据1AH与96H拼接得到的新数据,故得到原数据1AH,96H。
第五步:继续读入下一个数据0D8H,判断标志位为0,该数据按照LZW编码解压,得到原数据为96H。
第六步:判断不是最后一个数据,继续读入下一个数据87AH,判断标志位为1,该数据按照改进游程编码解压,原数据为第2至第9位,为0FH,计数变量cnt为末尾三位,为010,表示原数据中0FH重复出现了四次,得到原数据为0FH,0FH,0FH,0FH,判断已是最后一个数据,结束解压过程,最终得到的原数据为1AH,96H,B5H,B5H,1AH,96H,D8H,0FH,0FH,0FH,0FH。
以上详细描述了本发明的优选实施方式,但是,本发明并不限于上述实施方式中的具体细节,在本发明的技术构思范围内,可以对本发明的技术方案进行多种等同变换,这些等同变换均属于本发明的保护范围。