这是取自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/