传感器值信息的压缩表达

上文提到传感器值信息和描述信息的分离。值信息和描述的分离,有利于代码结构化,也可以节约传输带宽。

这里记录一种传感器值信息的压缩表达方法,但不建议在项目中使用。主要是现在无论是处理器(单片机)还是传输线路,性能都提升很多,并不对节省的这几个字节敏感。

一般来讲,传感器采集的数据,得到的信息都是展现給人来看的。让我们来看几组温度数据。
1、2、3、4 温度数据分辨率为1,采集间隔内,数据变化间值为1.
100、200、300、400,501 温度数据分辨率为1,采集间隔内,数据变化间值为100,501会被我们约等为500。
2、4、8、17温度数据分辨率为1,采集间隔内,数据指数变化,8后面的预期数据为16,即便测量值为17,我们在口头描述中也多会约等为16。

因为数据只是用来人为观察,这种约等完全是合理的,也并没有破坏其中的统计规律。

由上,我们可以看到我们对数据总是有一个识别分辨率的。而这个分辨率一个字节表述就足够了。

1、2、3、4
1×100、2×100、3×100、4×100 100为基础数据,有效数据只传输1,2,3,4即可。
pow(2,1)、pow(2,2)、pow(2,3)、pow(2,4) 2的指数为基础数据,有效数据只传输1,2,3,4即可

比如下面公式:
result = (double) (((m * val) + (b * pow(10, k1))) * pow(10, k2))

其中val为有效数据,m,b,k1,k2都为基础数据,这个函数曲线通过调节参数总能找到一个适应当前数据的渐进线。~,如果找不到这条渐进线,还可以将结果:

case SDR_SENSOR_L_LN:
                  result = log(result);
                  break;
          case SDR_SENSOR_L_LOG10:
                  result = log10(result);
                  break;
          case SDR_SENSOR_L_LOG2:
                  result = (double) (log(result) / log(2.0));
                  break;
          case SDR_SENSOR_L_E:
                  result = exp(result);
                  break;
          case SDR_SENSOR_L_EXP10:
                  result = pow(10.0, result);
                  break;
          case SDR_SENSOR_L_EXP2:
                  result = pow(2.0, result);
                  break;
          case SDR_SENSOR_L_1_X:
                  result = pow(result, -1.0);     /*1/x w/o exception */
                  break;
          case SDR_SENSOR_L_SQR:
                  result = pow(result, 2.0);
                  break;
          case SDR_SENSOR_L_CUBE:
                  result = pow(result, 3.0);
                  break;
          case SDR_SENSOR_L_SQRT:
                  result = sqrt(result);
                  break;
          case SDR_SENSOR_L_CUBERT:
                  result = cbrt(result);
                  break;

这样我们便做好了传感器值信息的压缩。

这套数据压缩方案来自于IPMI协议

你可能感兴趣的:(传感器值信息的压缩表达)