<p>使用时间压缩。在</p>
<p>用时间换取准确性。当ADC快速变化时,发送7位近似值。当它变化缓慢时,发送delta。在</p>
<p>下面是一个粗略的实现思路。在</p>
<p>假设2字节ADC值在0-3FFF范围内。在</p>
<pre><code> sample = ADC();
encode_value = sample >> 7;
send(encode_value);
diff = sample - (encode_value << 7);
loop:
previous_sample = sample
sample = ADC();
diff = previous_sample - sample;
if (diff >= -64 && diff <= 63) {
send(diff | 0x80);
diff = 0;
} else {
encode_value = sample >> 7;
send(encode_value);
diff = sample - (encode_value << 7);
}
</code></pre>
<p>//接收</p>
^{pr2}$
<p>在发送delta时,可能应该预留另一个位来检测丢失的序列。其他的考虑也适用,但在这里,它是给行动的另一个观点。在</p>
<p>优化包括让<code>delta</code>放弃<code>mantissa</code>的2位,以获得2位指数。在</p>
<hr/>
<p>[编辑]</p>
<p>12位随机数据不适合8位。一些想法:</p>
<ol>
<li><p>放弃精确。简单地将12位值除以16,发送8位,然后在接收端乘以16。</p></li>
<li><p>通过将12位值分成2个6位的两半,发送第一个A/D样本。使用MSB来区分发送的是上限还是下限。接收端需要两个样品来把东西放在一起。传输端的第二个A/D样本被丢弃。</p></li>
<li><p>像2个,但是每3个样品中送2个。3个8位消息中的24位数据。</p></li>
<li><p>正如这个答案开头的回答。有时发送航向值,有时发送增量。</p></li>
<li><p>正如下面评论的<a href="https://stackoverflow.com/questions/34364741/can-i-send-a-2-byte-size-variable-as-1-byte-size-variable/34365430#comment56473736_34365430">@Clifford</a>总是发送有符号的8位增量。可能需要一个小的调整,以确保任何偏差的接收金额最终会得到解决。</p></li>
<li><p>取1000(百万)个样本,将其作为压缩的12位数据写入文件。压缩文件。每一个压缩比的发现,都是我们能得到的最佳压缩方案的一个指标。如果它不是至少33%,那么您最好接受这样一个事实:数据太动态,无法按照给定的要求完全传输。</p></li>
</ol>