混音算法——精选推荐

混⾳算法
⼀、最简单的混⾳算法现在⼀般的软件混⾳算法是对输⼊的⾳频数据进⾏线性叠加, 即: (1) 或者叠加以后再取平均值: (2) 其中, m 为输⼊⾳频流的个数, n 为⼀帧的样本数⽬, ·[i] 为⼀帧中的第i 个样本, ·[j] 为第j 个⾳频流, 所以, output[i] 为混⾳后的⼀帧中第i 个样本, input[j][i] 为第j 个输⼊⾳频流当前帧的第i 个样本(若经过编码则输⼊⾳频流应在混⾳前通过解码等还原成线性的PCM⾳频流).通常的语⾳数据为16 bit(或者更少, 如8 bit),即可以⽤C 语⾔中的short 类型表⽰, 其取值范围是?32768 ≤ 采样值≤ 32767, 可以预想到多个⾳频流直接线性叠加以后就有可能溢出, 所以式(1) 最后的结果可能会有溢出, 产⽣噪⾳. 两个连续平滑的波形叠加, 其结果也应该是平滑的. 所以产⽣噪⾳的地⽅就是由叠加溢出的地⽅引⼊的. 我们需要采⽤滤波来处理这些溢出部分, 改善由于溢出所造成的质量下降.为了解决溢出的问题, ⼀个常⽤的⽅法就是使⽤更多的位数来表⽰⾳频数据的⼀个样本, 在混⾳完毕以后,再使⽤⼀些算法来降低其振幅, 使其分布在16 bit 所能表⽰的范围之内, 这种⽅法叫做归⼀化(Normalize). 通常使⽤32 bit 来表⽰线性叠加以后的数据, 也就是C 语⾔中的int 类型, 实现简单, 运算也⽐较快, 更能满⾜很多路⾳频同时进⾏混⾳的需要. 式(2)对叠加的和值作平均, 解决了溢出的问题, 但是混⾳以后的声⾳会总体衰减,特别是某⼀路⾳频流的能量与其他路⾳频流的能量反差很⼤的情况下, ⾳量⾮常⼩, 效果⾮常不理想. 进⾏滤波处理的另外⼀种常⽤⽅法就是“箝位”, 当发⽣上溢时, 箝位以后的值为所能表⽰的最⼤值, 当发⽣下溢时, 箝位后的值为所能表⽰的最⼩值, 如式(3) 所⽰: (3) 其中, sample 为叠加以后的样本值, 为32 bit, MAX 是最⼤输出值, 这
柯尔特一家
咸阳师范学院学报⾥为32767, MIN 为最⼩输出值, 为?32768. 现在很多现有的论⽂和系统都是采⽤箝位⽅法, 因为实现简单, 快速, 效率很⾼. 但是可以看出, 这种箝位⽅法相当于在最⼤和最⼩的临界值处切强⾏切断波形, ⾮常⽣硬, 会造成较⼤的波形失真, 听觉上引起如嘈杂, 出现突发刺⽿的爆破⾳等.采⽤时域叠加作为基本的处理⼿段, 由于数字⾳频信号存在量化上限和下限的问题,则因叠加运算肯定会造成结果溢出. 通常的处理⼿段是进⾏溢出检测, 然后再进⾏饱和运算(如 4 式的⽅法), 即超过上限的结果被置为上限值, 超过下限的值置为下限值. 这种运算本⾝破坏了语⾳信号原有的时域特征, 从⽽引⼊了噪声. 这就是出现爆破声和语⾳不连续现象的原因. 同时, 随着参与混⾳的⼈数增加, 出现溢出的频率也不断上升, 所以这类⽅法存在⼀个上限, ⽽且这个上限值很低, 实验证明, 采⽤这种时域直接叠加的⽅式进⾏混⾳, ⼀般不能突破 4 路输⼊⾳频流的限制, 否则将⽆法分辨语⾳流的内容了.
豆饼钩⼆、改进的混⾳算法混⾳的时候, 还需要屏蔽某⼀路的本地⾳频数据, 这样就不会听到本地的声⾳, 只能听到其他 n ? 1 路的声⾳, 也就是说, 对于第 t 路⾳频, 要发送给这个终端的混⾳后的数据如式(4): (4) 以下提出的算法主要思想就是使⽤⼀个衰减因⼦, 对⾳频数据进⾏衰减, 衰减因⼦会随着数据⽽变化. 当溢出时, 衰减因⼦⽐较⼩, 使溢出的⾳频数据衰减以后处于临界值以内, 当没有溢出时, 衰减因⼦会慢慢增加, 尽量保持数据的平滑变化. ⽽不是对于整帧使⽤同⼀个衰减因⼦来进⾏, 这是不同于式(2) 和式(3) 的地⽅, 既保证了整体的声强不⾄于衰减太快, ⼜保证了较⼩的失真度. 算法如下所述:
1. f 初始化为1.
企业供求2. 对于⼀帧中的样本按顺序处理: (a) output[i] = mixing[i] × f. (b) 如果output[i] > MAX, 求得最⼤的 f0 满⾜output[i] × f0 < MAX, 然后 f = f0, output[i] = MAX. (c) 如果output[i] < MIN, 求得最⼤的 f0 满⾜ output[i]×f0 > MIN, 然后 f = f0, output[i] = MIN.
3. 如果f < 1, 则f = f + STEPSIZE. 继续处理下⼀帧, 转2. 其中f 为衰减因⼦, f0 为新的衰减因⼦; mixing[] 为所有⾳频流的某⼀帧线性叠加值, 实际实现的时候如式(4) 所⽰; output[] 为归⼀化以后的输出帧. MAX 为正的最⼤值; MIN 为负的最⼤值. STEPSIZE 为f 变化的步长, 通常取为 (1 ? f)/16 或者 (1 ? f)/32. 特别的, 就是在衰减以后的值溢出的情况下, 求新的衰减因⼦ f0 的⽅法不同, 新的 f0 需要满⾜ output[i] × f0 <  MAX 或者 output[i]× f0 > MIN, ⽽不是直接使⽤mixing[i]. 也就是说, 使⽤衰减以后的值output[i] 来计算f0, ⽽不是原始值mixing[i],这样将使得衰减因⼦的变化更为平滑. ⽤数学来表达, S 为溢出的⼀个样本值, 在S × f 仍然溢出的情况下, 可以⽐较⼀下计算出来的新衰减因⼦的⼤⼩:假设是上溢, forig 是原始算法计算出的新的衰减因⼦, 则f`orig < (MAX/S) , 我们改进的算法得出的新衰减因⼦ f`new < (MAX/(S×f)) , 因为 S > (S × f), 所以(MAX/S) < (MAX/(S×f)) , 那么 f`new 很⼤程度上要⼤于f`orig. 衰减因⼦⼤了(更接近1), 相邻的数据变化不会特别⼤, 所以跳跃的现象不会特别明显. 上述改进过的混⾳⽅案在实测中,与常规的混⾳算法(直接线性叠加的⽅式)⽐较, 常规算法在混⼊ 4 路⾳频流的结果, 已经明显听到背景噪⾳, 波形会突变失真, 出现⽐较轻微的爆破⾳, 少量出现语⾳不可以辨认的情况; 如果混⼊ 5 路或者 5 路以上的⾳频流, 则输出的⾳频流质量已经不能从听觉上接受,
安徽大学学报我们来自未来2电影
语声模糊并且爆破⾳明显, 噪⾳⼤, 难以辨别语⾳内容. 采⽤衰减因⼦的⽅式进⾏调整以后, 混⼊ 4 路⾳频流从听觉上基本感觉不到背景噪⾳, 混⼊ 5 路的情况下, 仍然能清晰辨别各路的语⾳内容, 不出现爆破⾳; 混⼊ 6 路到 9 路的情况下仍然能保证语⾳质量, 不会发⽣突变的爆破⾳, 能够满⾜视频会议的要求. 从算法执⾏效率上看, 与常规的混⾳算法⽐较, 其时间复杂度并没有增加⽽具有同等的时间复杂度, 只是调和系数法在计算过程中叠加时需要进⾏⼀次额外的乘法运算(如上述算法描述的 2.a), 并且发⽣溢出的情况下需要重新计算新的调和
系数(整数除法运算), 最后在算法的第三步需要进⾏⼀次加法运算(浮点数加法). 因为涉及的数值不会很⼤, 同时⾳频流的数据量较之视频等要⼩得很多, 在视频会议的应⽤中, 采⽤调和系数⽅法进⾏混⾳完全在 MCU 承载的能⼒范围内, 实测与常规混⾳算法⽐较, 格式为 linear PCM raw, 16 bit, 单声道, 采样率为8000 HZ, 时间30 秒, 帧长30 毫秒的情况下, 其差别不会超过 17ms , 并不会由此产⽣很⼤的延迟, 其实时性仍然得到保证, ⽽从混⾳的质量来说较常规混⾳算法要好很多.

本文发布于:2024-09-22 20:22:10,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/202166.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:溢出   算法   叠加   频流   衰减   运算   箝位
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议