主权项 |
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>′</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>′</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>′</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>′</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>′</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>′</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>′</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>′</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>>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>·</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>>k<sub>min</sub>,则只保存最后一位数据,结束压缩;解压缩过程为:将历史数据存储区内相邻数据用直线相连以还原历史数据曲线,当需要查询某时刻的数据时,根据线性插值计算得到待求点处的数据。 |