视频会议中混音后溢出问题的研究及解决方法

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

j = t, i = 0, . . . , n − 1
(4)
我们在实际系统中对文 [4] 提出的“归一化定标”算法进行了改进. 主要思想就是使用一个衰减因子, 对音 频数据进行衰减, 衰减因子会随着数据而变化. 当溢出时, 衰减因子比较小, 使溢出的音频数据衰减以后处于 临界值以内, 当没有溢出时, 衰减因子会慢慢增加, 尽量保持数据的平滑变化. 而不是对于整帧使用同一个衰 减因子来进行, 这是不同于式 (2) 和式 (3) 的地方, 既保证了整体的声强不至于衰减太快, 又保证了较小的失真 度. 算法如下所述: 1. f 初始化为 1. 2. 对于一帧中的样本按顺序处理: (a) output[i] = mixing [i] × f . (b) 如果 output[i] > M AX , 求得最大的 f 满足 output[i] × f < M AX , 然后 f = f , output[i] = M AX . (c) 如果 output[i] < M IN , 求得最大的 f 满足 output[i] × f > M IN , 然后 f = f , output[i] = M IN . 3. 如果 f < 1, 则 f = f + ST EP SIZE . 继续处理下一帧, 转 2. 其中 f 为衰减因子, f 为新的衰减因子; mixing [] 为所有音频流的某一帧线性叠加值, 实际实现的时候如 式 (4) 所示; output[] 为归一化以后的输出帧. M AX 为正的最大值; M IN 为负的最大值. ST EP SIZE 为 f 变 化的步长, 通常取为 (1 − f )/16 或者 (1 − f )/32. 我们对所做的改进只有一个地方, 就是在衰减以后的值溢出的情况下, 求新的衰减因子 f 的方法不同, 新 的 f 需要满足 output[i] × f < M AX 或者 output[i] × f > M IN , 而不是使用 mixing [i]. 也就是说, 使用衰 减以后的值 output[i] 来计算 f , 而不是原始值 mixing [i]. 用数学来表达, S 为溢出的一个样本值, 在 S × f 仍然溢出的情况下, 我们比较一下计算出来的新衰减因 AX , 我们改进的算法得出的新 子的大小. 假设是上溢, forig 是原始算法计算出的新的衰减因子, 则 forig < M S M AX M AX M AX 衰减因子 fnew < S ×f , 因为 S > S × f , 所以 S < S ×f , 那么 fnew 很大程度上要大于 forig . 衰减因子大 了(更接近 1), 相邻的数据变化不会特别大, 所以跳跃的现象不会特别明显.
∗ 国家自然基金项目(60173062),
北京市自然基金项目(4012008). 联系作者, Email:mx@graphics.pku.edu.cn.
常使用 32 bit 来表示线性叠加以后的数据, 也就是 C 语言中的 int 类型, 实现简单, 运算也比较快, 更能满足很 多路音频同时进行混音的需要. 式 (2) 对和值作平均, 解决了溢出的问题, 但是混音以后的声音非常小, 效果非常不理想. 论文 [2] 中提出对于式 (2) 的改进算法, 着眼点在于不同路对于混音结果的贡献平衡, 对于溢出没有进行 很好的控制. 进行滤波处理的另外一种常用方法就是“箝位”, 当发生上溢时, 箝位以后的值为所能表示的最大值, 当发 生下溢时, 箝位后的值为所能表示的最小值, 如式 (3) 所示: if sample > M AX, M AX N ormalize(sample) = M IN (3) if sample < M IN , sample 其他情况. 其中, sample 为叠加以后的样本值, 为 32 bit, M AX 是最大输出值, 这里为 32767, M IN 为最小输出值, 为 −32768. 现在很多现有的论文和系统都是采用箝位方法, 因为实现简单, 快速, 效率很高. 但是可以看出, 这种箝位 方法相当于在最大和最小的临界值处切了一刀, 非常生硬, 会造成较大的波形失真. 在 4.1 节中, 我们可以看到 比较的结果.
源自文库
(2)
其中, m 为输入音频流的个数, n 为一帧的样本数目, ·[i] 为一帧中的第 i 个样本, ·[j ] 为第 j 个音频流, 所 以, output[i] 为混音后的一帧中第 i 个样本, input[j ][i] 为第 j 个输入音频流当前帧的第 i 个样本. 通常的语音数据为 16 bit(或者更少, 为 8 bit, 我们的系统中使用 16 bit), 即 C 语言中的 short 类型, 取值范 围是 −32768 ≤ 采样值 ≤ 32767, 多个音频流直接线性叠加以后就有可能溢出, 所以式 (1) 最后的结果可能会 有溢出, 产生噪音. 两个连续平滑的波形叠加, 其结果也应该是平滑的. 所以产生噪音的地方就是叠加溢出的地方. 我们需要 采用滤波来处理这些溢出部分, 改善由于溢出所造成的质量下降. 为了解决溢出的问题, 一个常用的方法就是使用更多的位数来表示音频数据的一个样本, 在混音完以后, 再使用一些算法来降低其振幅, 使其分布在 16 bit 所能表示的范围之内, 这种方法叫做归一化(Normalize). 通
Average Method Result 30000 "data-avg.data" 30000 Cut Method Result "data-cut.data"
20000
20000
10000 Amplitude Amplitude
10000
0
0
-10000
-10000
-20000
-20000
-30000 13000 13200 13400 Time (ms) 13600 13800
-20000
-30000 13000 13200 13400 Time (ms) 13600 13800
-30000 14000 13000 13200 13400 Time (ms) 13600 13800 14000
Figure 3: 原始归一化定标结果
Figure 4: 新归一化定标结果
图 3 和图 4 是原始算法的结果以及我们改进以后的结果. 原始的归一化定标算法, 相对于箝位算法来讲, 在临界值处比较平滑. 但是在听觉测试中可以听到有比较 明显的跳跃, 失真度略微高一些, 整体的声强也有所减弱. 我们对其改进了以后的结果, 对于最后的混音质量 有明显提高, 整体过渡都比较平滑, 没有跳跃现象出现, 声强也比原来的要大一些, 相对来说更接近原始值. 这是因为, 原始算法中对一个样本值使用衰减因子 f 衰减以后, 如果还是溢出, 它采用原来的值来计算 f , 这样就会造成过多地衰减, 这也是造成有跳跃现象比较明显以及声强比较弱的原因. 而我们采用衰减以后的 值来计算新的衰减因子, 减小了绝对的衰减量, 仍然达到了归一化的目标, 相对来说声强要强, 并且变化比较 平滑, 整体质量有所提高.
视频会议中混音后溢出问题的研究及解决方法
马旋∗ 王衡 汪国平 董士海
北京大学计算机系人机交互与多媒体实验室 北京 100871
摘要: 本文对于桌面型视频会议系统音频模块中存在的混音以后质量不佳的问题, 提出一种改进的音频 混音算法, 使用随着音频数据的变化而变化的衰减因子来对音频数据进行衰减, 很好地解决了由于溢出所带 来的噪音, 并且变化更加平滑, 没有跳跃现象, 实际应用中有比较好的效果. 关键词: 视频会议; 音频; 混音; 多点控制器
1 引言
在视频会议系统中, 音频模块有着很大的重要性, 也是评测一个视频会议系统质量的重要方面. 相比起视 频模块来说, 音频质量的好坏涉及到会议内容, 有可能会影响到交流的准确性, 而质量稍微差一点的视频则是 可以承受的. 在音频模块中, 传统上是使用控制发言权的方法, 即某一时刻只允许一个人发言, 发言前需要向会议主席 申请发言权, 发言结束以后释放发言权. 这种方法限制了会议成员之间的交流. 因此, 音频的混合也是一个不 可或缺的特性. Hawwa S.[1] 总结了几种音频流混合的方法: 1. 混音器可能对每个流单独操作, 然后再转发给其他的参与者. 2. 混音器从不同的参与者接收流, 选择一个或者多个流转发给所有其他参与者. 3. 混音器从不同的参与者接收流, 把数据解码再混合, 然后再编码, 最后再发给所有的参与者. 第三种方法也就是我们真正意义上的混音, 因为多个音频流经过混合以后, 只剩一路, 大大减少了带宽的 需要, 对于视频会议系统是最优的, 本文所讨论的混音技术也就是这种意义上的混音. 在本文中我们改进了其中一种方法, 并和现有的一些混音技术进行了比较, 提高了混音的质量, 更有利于 会议成员之间的交流合作. 本文所讨论的视频会议系统为纯软件实现的桌面型视频会议系统, 采集的音频数 据格式为 Linear PCM, 16 bit, 单声道, 采样率为 8000 HZ.
Original Scale Result 30000 "data-orig-scale.data" 30000 New Scale Result "data-new-scale.data"
20000
20000
10000 Amplitude Amplitude
10000
0
0
-10000
-10000
-20000
4
实验结果
在此基础上, 我们的测试主要分为两部分, 一部分是静态测试, 主要是针对混音本身算法的效果, 不考虑其 他可能影响效果的因素. 另一部分是动态测试, 在实际的视频会议系统中进行整体测试, 主要针对与编解码器 的配合情况以及效率问题.
4.1
静态测试结果
实验数据是录制好的 4 路语音数据, 两路男声, 两路女声, 其中有一路女声声音比较小, 有一路男声相对 比较大, 格式仍然是 linear PCM raw, 16 bit, 单声道, 采样率为 8000 HZ, 时间 30 秒, 帧长 30 毫秒. 针对基于 式 (2), (3) 的算法以及我们使用的这种混音方法, 做了测试, 测试环境为 Windows 2000 系统, 主频 P-IV 1.6G, 内存 256M. 均值方法, 平均耗时 31 毫秒; 箝位方法, 平均耗时 31 毫秒; 归一化定标方法, 平均耗时 47 毫秒. 可以看出 在现在的主流 PC 配置中, 相差并不是很大, 30 秒的数据只有十几毫秒的差距, 还没有进行特别的优化. 所以从 这点来说, 复杂度并不高, 耗时也很少, 完全可以满足实际应用. 最后混音的波形图如下所示, 截取的音频数据为第 13 - 14 秒, 共 8000 个采样点.
3
改进的混音方法
混音的时候, 如 [3] 所提到的, 还需要屏蔽某一路的本地音频数据, 这样就不会听到本地的声音, 只能听到 其他 n − 1 路的声音, 也就是说, 对于第 t 路音频, 要发送给这个终端的混音后的数据如式 (4):
m−1
mixing [i] = (
j =0
input[j ][i]),
2 相关工作
现在一般的软件混音算法是对输入的音频数据进行线性叠加:
m−1
output[i] =
j =0
input[j ][i],
i = 0, . . . , n − 1
(1)
或者叠加以后再取平均值:
m−1
output[i] = (
j =0
input[j ][i])/m,
i = 0, . . . , n − 1
-30000 14000 13000 13200 13400 Time (ms) 13600 13800 14000
Figure 1: 均值混音结果
Figure 2: 箝位混音结果
从图 1 和图 2 中, 我们可以看出, 基于式 (2) 的均值算法结果明显振幅比较小, 大大低于原来各部分的振 幅, 声音变得比较小. 而基于式 (3) 的箝位算法在上下的临界值处一刀切, 比较僵硬, 可以明显感觉到这部分有 嘈杂声.
相关文档
最新文档