最近看到一个混音算法 算法是对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会直接引入噪音
算法并没有什么数学根据,而且从两路扩展到多路效果并不好。回贴的没有一个赞同这一算法的。
看来不能盲目照搬没有根据的算法。
对改算法进行实际测试发现 改算法确实比 相加求均值效果好,但是该算法的噪声问题确实很严重。
建议能不用此算法就不用此算法!建议还是老老实实用改进的归一化混音算法为秒。
后面文章介绍 改进型归一化音频算法