总结一下我对混音算法的学习,大概有以下几种方式:
1. 直接加和: 缺点:极易产生溢出;
2. 加和后再除以混音通道数,防止溢出
优点:不会产生溢出,噪音较小;
缺点:衰减过大,影响通话质量;
3. 加和并箝位,如有溢出就设最大值(当发生上溢时,箝位以后的值为所能表示的最大值,当发生下溢时,箝位后的值为所能表示的最小值)
缺点:在溢出的地方引入了严重的噪音
4. 饱和处理,接近最大值时进行扭曲(“软件混音的实现”一文算法就是这类)
5. 归一化处理,全部乘个系数,使幅值归一化。(只适用于文件)
6. 衰减因子法,用衰减因子限制幅值[1]。自适应加权混音算法
思路:使用更多的位数(32 bit)来表示音频数据的一个样本,混完音后在想办法降低其振幅,使其仍旧分布在16 bit所能表示的范围之内,这种方法叫做归一法;
方法:为避免发生溢出,使用一个可变的衰减因子对语音进行衰减。这个衰减因子也就代表语音的权重,衰减因子随着音频数据的变化而变化,所以称为自适应加权混音。当溢出时,衰减因子较小,使得溢出的数据在衰减后能够处于临界值以内,而在没有溢出时,又让衰减因子慢慢增大,使数据较为平缓的变化。
直接加和,或除以通道数的混音方法有严重缺陷,效果可能很差。箝位法最大混音数大约是4个,饱和处理最大混音数可能再高几个。对于大量的混音,应该采用衰减因子法。
文献[2]提出了一个自对齐权重法(align-to-self weighted,简称ASW),以一个时间帧为单位进行衰减,可能在帧之间有断续,效果应该不如平滑的衰减。
如果[1]中的衰减因子计算时能考虑整个时间片的数据,而不仅仅是当前点,那样效果会更好吧。