这是取自NAudio的Mu-Law编码器。问题是该公式与代码如何相同?我可以理解MuLawCompressTable实际上是Log,但是我不知道尾数为何被直接使用。

    private const int cBias = 0x84;
            private const int cClip = 32635;

            private static readonly byte[] MuLawCompressTable = new byte[256]
            {
                 0,0,1,1,2,2,2,2,3,3,3,3,3,3,3,3,
                 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,
                 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
                 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
                 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
                 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
                 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
                 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
                 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
                 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
                 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
                 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
                 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
                 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
                 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
                 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7
            };

 public static byte LinearToMuLawSample(short sample)
        {
            //We get the sign
            int sign = (sample >> 8) & 0x80;
            if (sign != 0)
                sample = (short)-sample;
            if (sample > cClip)
                sample = cClip;


            sample = (short)(sample + cBias);

            int exponent = (int)MuLawCompressTable[(sample >> 7) & 0xFF];
            int mantissa = (sample >> (exponent + 3)) & 0x0F;
            int compressedByte = ~(sign | (exponent << 4) | mantissa);

            return (byte)compressedByte;
        }

最佳答案

它们是不同的。参见mu-law的Wikipedia页面http://en.wikipedia.org/wiki/Mulaw



您引用“模拟”版本的公式-从-1..1到-1..1的压缩映射,它强调了mu-law的基本概念,即量化值编码的细节更多(使用较小的量化对于较小的值,则引入的量化误差与信号的整体幅度大致成比例。

“数字”版本是对该基本概念的分段线性近似,并进行了一些其他更改以进一步简化处理。

这是比较两者的图。您可以在绿线(mu_digital)中看到与离散7位值相对应的阶梯,并且还可以看到接近平滑蓝线的不同线性部分。

关于audio - μ法律算法实现,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24863770/

10-11 07:53