char データ (8 ビット) のバッファーとして格納されている信号を取得しています。私は同じ信号に 24 dB を加えたものも得ています。私の上司は、12 ビットとして格納される 1 つ (出力として使用される) の 2 つのバッファーから再構築できるはずだと言いました。それを行うことができる数学的な操作と、なぜ +24dB を選択したのかを知りたいです。ありがとうございます (私はばかです ><)。
質問する
1602 次
1 に答える
1
問題文から、2 つの振幅でサンプリングされたアナログ信号があると思います。両方の信号の分解能は 8 ビットですが、一方はシフトされて切り捨てられます。
最初の信号の上位 4 ビットを組み合わせて 2 番目の信号と連結することにより、12 ビットの信号を取得できます。
sOut = ((sIn1 & 0xF0) << 4) | sIn2
もう少し精度を上げたい場合は、2 つの信号の共通ビットの平均を計算してみてください。通常、最初の信号の下位 4 ビットは、2 番目の信号の上位 4 ビットとほぼ等しくなります。丸め誤差やノイズにより、値がわずかに異なる場合があります。値の 1 つがオーバーフローし、範囲の反対側に移動した可能性もあります。
int Combine(byte sIn1, byte sIn2)
{
int a = sIn1 >> 4; // Upper 4 bits
int b1 = sIn1 & 0x0F; // Common middle 4 bits
int b2 = sIn2 >> 4; // Common middle 4 bits
int c = sIn2 & 0x0F; // Lower 4 bits
int b;
if (b1 >= 12 && b2 < 4)
{
// Assume b2 has overflowed, and wrapped around to a smaller value.
// We need to add 16 to it to compensate the average.
b = (b1 + b2 + 16)/2;
}
else if (b1 < 4 && b2 >= 12)
{
// Assume b2 has underflowed, and wrapped around to a larger value.
// We need to subtract 16 from it to compensate the average.
b = (b1 + b2 - 16)/2;
}
else
{
// Neither or both has overflowed. Just take the average.
b = (b1 + b2)/2;
}
// Construct the combined signal.
return a * 256 + b * 16 + c;
}
これをテストしたところ、最初の式よりも頻繁に信号を正確に再現しました。
于 2012-07-15T14:33:37.503 に答える