μ-Law算法实现

时间:2014-07-21 11:17:40

标签: audio codec naudio

这是来自NAudio的Mu-Law编码器。问题是这个公式如何与代码相同?我可以理解MuLawCompressTable实际上是Log,但我不知道为什么它被视为原样。

enter image description here

    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;
        }

1 个答案:

答案 0 :(得分:2)

他们是不同的。请参阅mu-law的维基百科页面,http://en.wikipedia.org/wiki/Mulaw

  

此算法有两种形式 - 模拟版本和量化数字版本。

引用“模拟”版本的公式 - 从-1..1到-1..1的压缩映射,强调mu-law的基本思想,即量化值编码更多细节(用法)对于较小的值,较小的量化步长),因此引入的量化误差大致与信号的整体幅度成比例。

“数字”版本是对这一基本思想的分段线性近似,还有一些额外的转变以进一步简化处理。

这是一个比较两者的情节。您可以看到绿色线(mu_digital)中的阶梯对应于离散的7位值,您还可以看到近似于平滑蓝线的不同线性部分。

analog and digital mulaw plot