使用add + shift进行pcm16到pcm14的转换

0 c linux audio pcm

我正在研究一种声音转换算法,其中接收一组带符号的短路.
在算法的给定点,它将样本从16位转换为14位,并且它像这样:

int16_t sample = (old_sample + 2) >> 2;
Run Code Online (Sandbox Code Playgroud)

对我来说很清楚,因为我们想要摆脱至少2个重要位,所以需要移位,但+2那里呢?

psm*_*ars 8

向下移动会丢失最不重要的两位.如果你只是移位,那么即使底部的两位都设置了,它也总是向下舍入.如果设置了更大的丢失位,则添加2轮.

(另外值得注意的是,减少位数的更好方法是使用抖动,即在减小样本大小之前添加随机(和非常小)的噪声量;这避免了由于声音是周期性的问题,对于特定频率,舍入通常最终会持续向上或持续向下,从而导致声音中出现明显的失真.维基百科文章链接解释了它比我更好!)