这是来自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;
}
答案 0 :(得分:2)
他们是不同的。请参阅mu-law的维基百科页面,http://en.wikipedia.org/wiki/Mulaw
此算法有两种形式 - 模拟版本和量化数字版本。
引用“模拟”版本的公式 - 从-1..1到-1..1的压缩映射,强调mu-law的基本思想,即量化值编码更多细节(用法)对于较小的值,较小的量化步长),因此引入的量化误差大致与信号的整体幅度成比例。
“数字”版本是对这一基本思想的分段线性近似,还有一些额外的转变以进一步简化处理。
这是一个比较两者的情节。您可以看到绿色线(mu_digital)中的阶梯对应于离散的7位值,您还可以看到近似于平滑蓝线的不同线性部分。