常见的一个错误音频混音算法

最近看到一个混音算法 算法是对16位的两路音频进行混音其效果和归一化混音算法相比并没有

归一化混音算法效果好,但是一直不明白为什么有这么多的文章在介绍混音算法时总会有此算法。

算法的出处也给出。

具体算法如下:

/** 平均值 */
static void pcmAudioMix(short *mixPoint, short *originPoint, UInt32 bufferLength){
    for (int j = 0; j < bufferLength ;j++) {
        short origin = *(originPoint + j);
        short mix = *(mixPoint + j);
        int value = (origin + mix);
        *(originPoint + j) = (short)(value/2);
    }
}

//#define INT16_MIN         -32768
//#define INT16_MAX        32767
//此算法为最垃圾的算法 能不用就不要用 A*B直接引入噪声
static void pcmAudioMix(SInt16 *bufferA, SInt16 *bufferB, UInt32 bufferLength){
    SInt16 *outputBuffer = bufferB;
    for ( NSInteger i = 0; i < bufferLength; i++ ) {
        if ( bufferA[i] < 0 && bufferB[i] < 0 ) {
            // If both samples are negative, mixed signal must have an amplitude between
            // the lesser of A and B, and the minimum permissible negative amplitude
            outputBuffer[i] = (bufferA[i] + bufferB[i]) - ((bufferA[i] * bufferB[i])/INT16_MIN);
        } else if ( bufferA[i] > 0 && bufferB[i] > 0 ) {
            // If both samples are positive, mixed signal must have an amplitude between the greater of
            // A and B, and the maximum permissible positive amplitude
            outputBuffer[i] = (bufferA[i] + bufferB[i]) - ((bufferA[i] * bufferB[i])/INT16_MAX);
        } else {
            // If samples are on opposite sides of the 0-crossing, mixed signal should reflect
            // that samples cancel each other out somewhat
            outputBuffer[i] = bufferA[i] + bufferB[i];
        }
    }
}



查询资料后发现 已经有前辈对此算法提出了质疑。

http://www.cppblog.com/jinq0123/archive/2007/10/31/audiomixingstudy.html


其中的评论明确指明 A*B会直接引入噪音

算法并没有什么数学根据,而且从两路扩展到多路效果并不好。回贴的没有一个赞同这一算法的。

看来不能盲目照搬没有根据的算法。

对改算法进行实际测试发现 改算法确实比 相加求均值效果好,但是该算法的噪声问题确实很严重。

建议能不用此算法就不用此算法!建议还是老老实实用改进的归一化混音算法为秒。

后面文章介绍 改进型归一化音频算法

对此算法的参考链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值