发明名称 时序数据实时高效线性压缩与解压缩方法
摘要 本发明公开了一种时序数据实时高效线性压缩与解压缩方法。根据所处理时序数据的类型和压缩阈值,采用滤波算法对数据进行滤波,按照数据结构封装规则对滤波后的数据进行结构封装,将结构封装的数据存入数据缓冲区,当数据缓冲区存满时,启动线性压缩方法对结构封装的数据进行线性压缩,并将压缩后的数据存入历史数据存储区;当需要查询数据时,调用解压缩方法对历史数据存储区中的数据进行解压。本发明可应用于各类工业控制系统时序数据的压缩和解压缩,适用于数据流量大、采样种类多、干扰冗余严重的情况,可较好地保留原数据的特征,实时性好,压缩比高,实用性强。
申请公布号 CN102098058B 申请公布日期 2013.03.06
申请号 CN201010542716.6 申请日期 2010.11.12
申请人 中南大学 发明人 孙志强;李志勇
分类号 H03M7/30(2006.01)I 主分类号 H03M7/30(2006.01)I
代理机构 长沙市融智专利事务所 43114 代理人 黄美成
主权项 1.一种时序数据实时高效线性压缩与解压缩方法,其特征在于,包括以下步骤:步骤1:对于待压缩的一组数据,基于第1个数据(x<sub>1</sub>,y<sub>1</sub>)和第2个数据(x<sub>2</sub>,y<sub>2</sub>)加上压缩阈值(0,t)为基准,建立第1条直线,该直线的斜率k<sub>max</sub>为本次压缩的斜率上限:<maths num="0001"><![CDATA[<math><mrow><msub><mi>k</mi><mi>max</mi></msub><mo>=</mo><mfrac><mrow><mo>(</mo><msub><mi>y</mi><mn>2</mn></msub><mo>+</mo><mi>t</mi><mo>-</mo><msub><mi>y</mi><mn>1</mn></msub><mo>)</mo></mrow><mrow><mo>(</mo><msub><mi>x</mi><mn>2</mn></msub><mo>-</mo><msub><mi>x</mi><mn>1</mn></msub><mo>)</mo></mrow></mfrac><mo>,</mo></mrow></math>]]></maths>式中:x表示时刻;y表示x时刻的数据值;t表示压缩阈值,即数据压缩所允许的误差限;以第1个数据(x<sub>1</sub>,y<sub>1</sub>)和第2个数据(x<sub>2</sub>,y<sub>2</sub>)减去压缩阈值(0,t)为基准建立第2条直线,该直线的斜率k<sub>min</sub>为本次压缩的斜率下限<maths num="0002"><![CDATA[<math><mrow><msub><mi>k</mi><mi>min</mi></msub><mo>=</mo><mfrac><mrow><mo>(</mo><msub><mi>y</mi><mn>2</mn></msub><mo>-</mo><mi>t</mi><mo>-</mo><msub><mi>y</mi><mn>1</mn></msub><mo>)</mo></mrow><mrow><mo>(</mo><msub><mi>x</mi><mn>2</mn></msub><mo>-</mo><msub><mi>x</mi><mn>1</mn></msub><mo>)</mo></mrow></mfrac><mo>,</mo></mrow></math>]]></maths>步骤2:再以第1个数据和第3个数据重复以上步骤,即得到新的斜率<img file="FDA00002490377600013.GIF" wi="80" he="60" />和斜率<img file="FDA00002490377600014.GIF" wi="76" he="60" />如下:<maths num="0003"><![CDATA[<math><mrow><msubsup><mi>k</mi><mi>max</mi><mo>&prime;</mo></msubsup><mo>=</mo><mfrac><mrow><mo>(</mo><msub><mi>y</mi><mn>3</mn></msub><mo>+</mo><mi>t</mi><mo>-</mo><msub><mi>y</mi><mn>1</mn></msub><mo>)</mo></mrow><mrow><mo>(</mo><msub><mi>x</mi><mn>3</mn></msub><mo>-</mo><msub><mi>x</mi><mn>1</mn></msub><mo>)</mo></mrow></mfrac><mo>;</mo></mrow></math>]]></maths><maths num="0004"><![CDATA[<math><mrow><msubsup><mi>k</mi><mi>min</mi><mo>&prime;</mo></msubsup><mo>=</mo><mfrac><mrow><mo>(</mo><msub><mi>y</mi><mn>3</mn></msub><mo>-</mo><mi>t</mi><mo>-</mo><msub><mi>y</mi><mn>1</mn></msub><mo>)</mo></mrow><mrow><mo>(</mo><msub><mi>x</mi><mn>3</mn></msub><mo>-</mo><msub><mi>x</mi><mn>1</mn></msub><mo>)</mo></mrow></mfrac><mo>;</mo></mrow></math>]]></maths>取<img file="FDA00002490377600017.GIF" wi="80" he="61" />和k<sub>max</sub>中的较小者作为k<sub>max</sub>,取<img file="FDA00002490377600018.GIF" wi="75" he="61" />和k<sub>min</sub>中的较大者作为k<sub>min</sub>,即<maths num="0005"><![CDATA[<math><mrow><msub><mi>k</mi><mi>max</mi></msub><mo>=</mo><mi>min</mi><mrow><mo>(</mo><msubsup><mi>k</mi><mi>max</mi><mo>&prime;</mo></msubsup><mo>,</mo><msub><mi>k</mi><mi>max</mi></msub><mo>)</mo></mrow><mo>;</mo></mrow></math>]]></maths><maths num="0006"><![CDATA[<math><mrow><msub><mi>k</mi><mi>min</mi></msub><mo>=</mo><mi>max</mi><mrow><mo>(</mo><msubsup><mi>k</mi><mi>min</mi><mo>&prime;</mo></msubsup><mo>,</mo><msub><mi>k</mi><mi>min</mi></msub><mo>)</mo></mrow><mo>;</mo></mrow></math>]]></maths>步骤3:对第i个数据(x<sub>i</sub>,y<sub>i</sub>),i大于等于4,计算新的<img file="FDA000024903776000111.GIF" wi="221" he="60" />如下:<maths num="0007"><![CDATA[<math><mrow><msubsup><mi>k</mi><mi>max</mi><mo>&prime;</mo></msubsup><mo>=</mo><mfrac><mrow><mo>(</mo><msub><mi>y</mi><mi>i</mi></msub><mo>+</mo><mi>t</mi><mo>-</mo><msub><mi>y</mi><mn>1</mn></msub><mo>)</mo></mrow><mrow><mo>(</mo><msub><mi>x</mi><mi>i</mi></msub><mo>-</mo><msub><mi>x</mi><mn>1</mn></msub><mo>)</mo></mrow></mfrac><mo>;</mo></mrow></math>]]></maths><maths num="0008"><![CDATA[<math><mrow><msubsup><mi>k</mi><mi>min</mi><mo>&prime;</mo></msubsup><mo>=</mo><mfrac><mrow><mo>(</mo><msub><mi>y</mi><mi>i</mi></msub><mo>-</mo><mi>t</mi><mo>-</mo><msub><mi>y</mi><mn>1</mn></msub><mo>)</mo></mrow><mrow><mo>(</mo><msub><mi>x</mi><mi>i</mi></msub><mo>-</mo><msub><mi>x</mi><mn>1</mn></msub><mo>)</mo></mrow></mfrac><mo>;</mo></mrow></math>]]></maths>取<img file="FDA000024903776000114.GIF" wi="79" he="61" />和k<sub>max</sub>中的较小者作为k<sub>max</sub>,取<img file="FDA000024903776000115.GIF" wi="75" he="61" />和k<sub>min</sub>中的较大者作为k<sub>min</sub>,即<maths num="0009"><![CDATA[<math><mrow><msub><mi>k</mi><mi>max</mi></msub><mo>=</mo><mi>min</mi><mrow><mo>(</mo><msubsup><mi>k</mi><mi>max</mi><mo>&prime;</mo></msubsup><mo>,</mo><msub><mi>k</mi><mi>max</mi></msub><mo>)</mo></mrow><mo>;</mo></mrow></math>]]></maths><maths num="0010"><![CDATA[<math><mrow><msub><mi>k</mi><mi>min</mi></msub><mo>=</mo><mi>max</mi><mrow><mo>(</mo><msubsup><mi>k</mi><mi>min</mi><mo>&prime;</mo></msubsup><mo>,</mo><msub><mi>k</mi><mi>min</mi></msub><mo>)</mo></mrow><mo>;</mo></mrow></math>]]></maths>步骤4:比较当前的k<sub>max</sub>与k<sub>min</sub>,如果k<sub>max</sub>&gt;k<sub>min</sub>,则令i=i+1,返回步骤3,如果k<sub>max</sub>小于或等于k<sub>min</sub>,则此段压缩结束,记录当前的i为n,保存压缩中用到的数据点n-1处的数据(x<sub>n-1</sub>,y<sub>n-1</sub>),并根据数据点n-1处的k<sub>max</sub>、k<sub>min</sub>的平均值,调整n-1处的数据值y<sub>n-1</sub>,即<maths num="0011"><![CDATA[<math><mrow><msub><mi>y</mi><mrow><mi>n</mi><mo>-</mo><mn>1</mn></mrow></msub><mo>=</mo><mrow><mo>(</mo><mfrac><mrow><msub><mi>k</mi><mi>max</mi></msub><mo>+</mo><msub><mi>k</mi><mi>min</mi></msub></mrow><mn>2</mn></mfrac><mo>)</mo></mrow><mo>&CenterDot;</mo><mrow><mo>(</mo><msub><mi>x</mi><mrow><mi>n</mi><mo>-</mo><mn>1</mn></mrow></msub><mo>-</mo><msub><mi>x</mi><mn>1</mn></msub><mo>)</mo></mrow><mo>+</mo><msub><mi>y</mi><mn>1</mn></msub><mo>;</mo></mrow></math>]]></maths>并将更新后的(x<sub>n-1</sub>,y<sub>n-1</sub>)保存到历史数据存储区;步骤5:处理待压缩的一组数据中的下一段数据,直到待压缩的一组数据的最后一个数据,具体步骤如下:将第n个数据点(x<sub>n</sub>,y<sub>n</sub>)作为所述的第1个数据点,将第n+1个数据点(x<sub>n+1</sub>,y<sub>n+1</sub>)作为所述的第2个数据点,…,依此类推,重复步骤1-4,直到处理到待压缩的数据的最后一个数据,整个压缩过程结束;压缩进行的过程中,当判断出到达数据的最后一位时,如果仍有k<sub>max</sub>&gt;k<sub>min</sub>,则只保存最后一位数据,结束压缩;解压缩过程为:将历史数据存储区内相邻数据用直线相连以还原历史数据曲线,当需要查询某时刻的数据时,根据线性插值计算得到待求点处的数据。
地址 410083 湖南省长沙市岳麓区麓山南路932号