2,543
社区成员
发帖
与我相关
我的任务
分享
3. 混音的实际算法:
考虑到数字音频的采样位数,其每点的的采用的最大最小值是被限定的,如8位采样,则采样值的范围是-127~+127。因此在混音计算时,m(t)=ΣXi(t)必须考虑其溢出的情况。简单的处理溢出的方法是m(t)=(ΣXi(t))/n, 其中n表示参与混音的路数,这样即可以保证每个采样点都不会溢出。
但这种算法的缺点也很明显,即每路音频的音量都被缩小了n倍,没有使每路的音频在不溢出的情况下达到最大的输出(与混音前的每路音频尽量接近)。要达到这种效果,就需要使用另外一种比较复杂的算法: 使用衰减因子f, m(t)=Σ(Xi(t)*f)。其中 (1/n)<= f <= 1, n为混音的路数。
如上面所说,一个语音帧是一个处理单元。初始化时令f=1,每次开始处理一个新的语音帧时,任何一个合成值m(t)超过了范围,将m(t)箝位,并且求得对应的新的f,在时序上位于此点之后的样本都采用新的f。可以看出这样一来,f有越来越小的趋势。为了避免语音不必要的被衰减,因此需要有让f变大的地方,这发生在每个新的语音帧开始处理的入口。新的语音帧样本仍然需要衰减的可能性是很大的,所以f不能每次都又从1开始,而是应该在某种程度上继承过去的值。即在每个新的样本缓冲区的入口处,只要f不等于1,就将其调整为比f稍大一些的值,让它成为新的衰减因子。若样本的确不需要衰减,经过若干帧后f会慢慢变回1。