首页 > 编程语言 >混音算法记录

混音算法记录

时间:2022-10-06 18:00:39浏览次数:98  
标签:叠加 记录 pow 算法 混音 衰减 溢出

因项目需求实现混音效果,故学习记录了一下。

算法调研

常见混音方式:

  1. 加和后再除以混音通道数,防止溢出
  2. 加和并箝位,如有溢出就设最大值
  3. 饱和处理,接近最大值时进行扭曲(“软件混音的实现”一文算法就是这类)
  4. 归一化处理,全部乘个系数,使幅值归一化。(只适用于文件)
  5. 衰减因子法,用衰减因子限制幅值。
  6. newlc 算法

音频混音算法原理

混音原理简单说一下:声音是由于物体的振动对周围的空气产生压力而传播的一种压力波,转成电信号后经过抽样,量化,仍然是连续平滑的波形信号,量化后的波形信号的频率与声音的频率对应,振幅与声音的音量对应,量化的语音信号的叠加等价于空气中声波的叠加,所以当采样率一致时,混音可以实现为将各对应信号的采样数据线性叠加。而问题的关键就是如何处理叠加后溢出问题。

混音的原理其实很简单,只要多路语音数据做线性叠加即可,但是叠加后的音频数据容易产生溢出,而且混合的路数越多,溢出的可能性越大,所以要做溢出处理,其实如何完美的处理混音叠加后溢出问题才是混音算法的关键;以下是常见算法:

1、平均权重算法

叠加以后再取平均值(除以混音路数),这样不容易产生溢出,但是会造成音质衰减过大,各路音量会逐步变小,影响通话质量,所以一般不采取求平均这种方式;但是可以扩展一下,考虑参与混音的多路音视频信号自身特点,以它们自身的比例作为权重,比如如果是背景音乐可以适当权重低一些,领导讲话可以适当权重高一些,这样混合后的效果也会随着场景的应用会更合适一些。

2、边界值法

将每一路的语音线性相加进行溢出检测,如果溢出,以最大值或最小值来替代。这样会造成声音波形的人为削峰,在破坏语音信号特性;

3、自适应混音加权(衰减因子)

为了更好的解决溢出问题,可以使用一个衰减因子, 对音频数据进行逐渐衰减, 衰减因子会随着数据而变化.当数据溢出时,则相应的使衰减因子变小,使后续的数据在衰减后处于临界值以内,没有溢出时,让衰减因子慢慢增大,使数据变化相对平滑。(随着会话成员增多也会出现溢出问题);采用衰减因子的方式进行调整以后, 混音的数据从听觉上基本感觉不到背景噪音,会感觉很舒适,也基本上不会出现爆破音,这种方式比较推荐

4、自动对齐算法

考虑参与混音的多路音视频信号自身特点,以它们自身的比例作为权重,从而决定它们在合成后的输出中所占比重。(测试发现高频信号损失严重)

5、箝位算法

时域叠加,进行溢出检测,然后进行饱和运算.(一般通用使用,但是容易溢出).

6、newlc算法

网上普遍提到 newlc 算法,但【1】中提到,该算法并没有什么数学根据,而且从两路扩展到多路效果并不好。一篇论坛帖子(但与原文中引文并不一致)回贴的没有一个赞同这一算法的。

该算法的出处:http://newlc.com/topic-10064 作者自己说,该算法对于5个通道以上就不太好,算法的好处是不会溢出。但有人反映声音有饱和的趋向。

【算法原型】
Y = A + B - (A * B / (-(2 pow(n-1) -1)))
Y = A + B - (A * B / (2 pow(n-1))
【算法简述】

算法简述如下:

For n-bit sampling audio signal
   If both A and B are negative       Y = A + B - (A * B / (-(2 pow(n-1) -1)))
   Else                               Y = A + B - (A * B / (2 pow(n-1))

注意具体实现与算法稍有不符。实现中两种情况都除以(-(2 pow(n-1) -1))),根据算法,大部分情况下都应该除以(2 pow(n-1))。是否减1有什么作用?如果不必减1,对于整数运算就可以用移位实现。

参考文献

1、混音算法的学习与研究

2、高质量音频混音算法及应用

3、pcm音频混音

标签:叠加,记录,pow,算法,混音,衰减,溢出
From: https://www.cnblogs.com/zjacky/p/16757915.html

相关文章

  • 算法学习笔记(数学):数论分块 + 容斥原理 + 莫比乌斯函数
    算法学习笔记(数学):数论分块+容斥原理+莫比乌斯函数这篇文章主要是要讲一道题目(链接在这里)以及梳理一下数论分块,莫比乌斯函数,容斥原理这些知识。先介绍下知识点吧qwq......
  • 人脸对齐之GBDT(ERT)算法解读
    1.概述文章名称:OneMillisecondFaceAlignmentwithanEnsembleofRegressionTrees 文章作者:VahidKazemi,JosephineSullivan 简要介绍:OneMillisecondFaceAlignme......
  • 最短路径问题---Dijkstra算法详解
    0.最短路径问题介绍问题解释:从图中的某个顶点出发到达另外一个顶点的所经过的边的权重和最小的一条路径,称为最短路径1.Dijkstra算法介绍算法特点:迪科斯彻算法使用......
  • 【算法-简单01】合并2个有序数列
    合并2个有序数列结果:时间复杂度:O(N)空间复杂度:O(N)比较抽象的点结论:Node对象有3个属性:Node本身、val,以及Node.nextNode本身判空,结合while来进行遍历查询val......
  • 算法上亟待解决的问题
    这就是某市第一高中与某市“第二”高中的差距。被文化课扫地出门后去好学校见了见世面,我什么都不会。而且问题甚至不在代码实现这一环,而是我根本不知道这一堆知识点。列......
  • 算法竞赛备赛之浅谈递归
    递归递归需要有基例、递归前进段和递归返回段(return语句),是一种程序设计技巧,可以使程序编写简单,但实际上要付出低效率的代价计算时间复杂度常用数据的记忆(程序设计基本功,......
  • 程序员必备的基本算法:递归详解
    前言递归是一种非常重要的算法思想,无论你是前端开发,还是后端开发,都需要掌握它。在日常工作中,统计文件夹大小,解析xml文件等等,都需要用到递归算法。它太基础太重要了,这也是为......
  • Tarjan算法
    二、无向图的割点与桥什么是无向图?简单来说,若一个图中每条边都是无方向的,则称为无向图。割点若从图中删除节点x以及所有与x关联的边之后,图将被分成两个或两个以上的......
  • 记录一个 Full of accomplishment & 纯手调了一天 的题目
    P1018乘积最大艰辛历程AC&未去除调试注释(不用你数,141行)#include<iostream>#include<cstdio>#include<string>#include<cstring>#definelllonglong......
  • 1098. 城堡问题 flood fill算法 注意:第x行第y列对应的坐标为 (y,x) 与坐标为(x,y)
      1234567#############################1#|#|#||######---#####---#---#####---#2##|......