0

char データ (8 ビット) のバッファーとして格納されている信号を取得しています。私は同じ信号に 24 dB を加えたものも得ています。私の上司は、12 ビットとして格納される 1 つ (出力として使用される) の 2 つのバッファーから再構築できるはずだと言いました。それを行うことができる数学的な操作と、なぜ +24dB を選択したのかを知りたいです。ありがとうございます (私はばかです ><)。

4

1 に答える 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 に答える