一、音频算法和原理简介
在视频会议系统中,音频模块有着很大的重要性,也是评测一个视频会议系统质量的重要方面,相比起视频模块来说,音频质量的好坏涉及到会议内容,有可能会影响到交流的准确性,而质量稍微差一点的视频则是可以承受的.在音频模块中,传统上是使用控制发言权的方法,即某一时刻只允许一个人发言,发言前需要向会议主席申请发言权,发言结束以后释放发言权。这种方法限制了会议成员之间的交流。因此,音频的混合也是一个不可或缺的特性。
我总结了几种音频流混合的方法:
1.直接混合法
就是将两端音频直接相加。
2.平均调节权重法
将每一路的语音线性相加,再除以通道数,该方法虽然不会引入噪声,但是随着通道数成员的增多,各路语音的衰减将愈加严重。具体体现在随着通道数成员的增多,各路音量会逐步变小。
3.自适应混音加权法(改进后的归一化算法)
使用可变的衰减因子对语音进行衰减,该衰减因子代表了语音的权重,该衰减因子随着数据的变化而变化,当数据溢出时,则相应的使衰减因子变小,使后续的数据在衰减后处于临界值以内,没有溢出时,让衰减因子慢慢增大,使数据变化相对平滑。
今天作者做的就是一个方法三:自适应混音加权法(改进后的归一化算法)。
算法如下所述:
1.广初始化为f=1
2.对于一帧中的样本按顺序处理:
(A)输出 output=mix*f
(b)如果 output[i]>MAX,求得最大的f满足: output[i] xf<MAX,然后f=f,output[i]=MAX.
(c)如果output[i]<MIN,求得最大的f满足 output[i]xf>MIN,然后f=f,output[i]=MIN.
3.如果f<1,则f=f+步长。继续处理下一帧,转2.
其中f为衰减因子,f为新的衰减因子;混合为所有音频流的某一帧线性叠加值,实际实现的时候如式(4)所示;output0为归一化以后的输出顿.MAX为正的最大值:MIN为负的最大值.STEPSIZE为f变化的步长,通常取为(1-f)/16或者(1-f)/32.
我们对所做的改进只有一个地方,就是在衰减以后的值溢出的情况下,求新的衰减因子f的方法不同,新的f需要满足output[i]xf'<MAX 或者output[xf>MIN,而不是使用mixing.也就是说,使用衰减以后的值output来计算f,而不是原始值mix.
用数学来表达,S为溢出的一个样本值,在S*f仍然溢出的情况下,我们比较一下计算出来的新衰减因子的大小。
二、代码实现
以下是功能函数实现代码(不齐全):
void adaptiveWeightingMixing(int frame_length,int16_t SpeechOut[],int16_t SpeechIn1[],int16_t SpeechIn2[])
//NEWLC();
{
int MAX = 32768;
int MIN = -32768;
float f = 1;
int i;
for(i=1;i<frame_length;i++)
{
// (float)(SpeechOut[i])= (SpeechIn2[i] + SpeechIn2[i]) * f;
SpeechOut[i]= (SpeechIn1[i] + SpeechIn2[i]) * f;
if(SpeechOut[i]>MAX)
{
f = MAX/SpeechOut[i];
SpeechOut[i] = MAX;
}
if(SpeechOut[i]<MIN)
{
f = MIN / SpeechOut[i];
SpeechOut[i] = MIN;
}
if(f<1)
{
f += (1-f) / 32;
}
}
// SpeechOut[frame_length] = (int16_t)(SpeechOut[frame_length]);
}
输出效果还算可以。
标签:MIN,MAX,音频,算法,因子,混音,output,衰减 From: https://blog.csdn.net/weixin_66072154/article/details/137522076