转载

混音:

Mix的意思是混音,无论在自然界,还是在音频处理领域这都是非常普遍的现象。自然界里你能同时听到鸟鸣和水声,这是因为鸟鸣和水声的波形在空气中形成了叠加,耳朵听到后能区分鸟鸣和水声这两种波形。
在数字音频领域也是一样,比如你也可以一边打CS一边听歌,这是因为计算机把两个声音波形做了叠加。但是不同的是,计算机中的叠加,很容易造成越界。
比如
          int plus1(int num0, int num1){
                                                        return num0+num1;
                                                        }
如果赋值int num0=0x70000000和int num1=0x70000000,运行后的result是0xE0000000,变换为十进制为-536870912。两个正数相加得到了负数,结果自然是错的。
我们知道,一个char的补码所能表示的数值范围是[-128, 127],写成16进制是[0x80,0x7F]。而一个int的补码的范围是[0x80000000,0x7FFFFFFF]。超出这个范围就是溢出。
如何防止溢出呢?最简单的做法是拓宽存储数据的容器,比如:
                    long long plus1(int num0, int num1){
                                                                   return (long long)num0+(long long)num1;
                                                                           }
赋值int num0=0x70000000和int num1=0x70000000,运行后的result是0xE0000000,变换为十进制为3758096384。这次没有溢出。

 公式
怎么能做到不溢出呢?考虑这个公式
          Z=A+B−AB,
如果A和B都在[0,1]范围内,那么:
    0<=(1-A)(1-B)=1-A-B+AB<=1,那么
          0<=Z<=1
这样,如果我们把A,B看做是两个输入波形,Z看做是一个输出波形的话,Z的上界和下界也在A和B的上界和下界内。也就是说,Z是不会溢出的。
对于3个输入信号来说,按照(1-A)(1-B)(1-C)运算,易得
      Z=A+B+C−AB−AC−BC+ABC.
而对于取值范围不在[0,1]的信号,可以先转化为[0,1]来做。
比如A,B均在[0,255]范围内,则A/255在[0,1]内,则
          Z/255=A/255+B/255-(A/255)*(B/255),那么
                  Z=A+B-AB/255
对于有符号的数,取值范围在[-128,127],则A’=(A+128)/255取值在[0,1]内,则
Z’=A’+B’−A’*B’,代入可得
(Z+128)/255=(A+128)/255+(B+128)/255-(A+128)/255*(B+128)/255,则
Z=A+B-(A+128)(B+128)/255+128
这种算法可以认为是简单的对输入信号进行了相加,并为了避免溢出,压缩了两个信号的和的波形。但是这种算法有个致命的缺点,那就是当两个信号相加没有溢出时,这种算法仍然压缩了波形,导致音质受损。而且过多的加减乘除的运算,会提升整个系统的功耗和复杂性,也会在四舍五入中降低数据的精度。
说句题外话,为了避免运算中声音信号精度的丢失,目前业界高端音频处理系统里都是用32位float采样来进行运算的,而输出的时候转化为16bit。
————————————————
版权声明:本文为CSDN博主「我把葡萄酿成酒」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/ffmpeg4976/article/details/45599467

pcm混音的一种方式的更多相关文章

  1. [转]php和html混编的三种方式

    php和html混编的三种方式 以下内容转自:http://blog.i1728.com/post/110.html 原文标题是:<PHP的(<<>,新标题是我加的,文章里的红 ...

  2. PHP/HTML混写的四种方式总结

    PHP/HTML混写的四种方式总结 一.总结 一句话总结: 注意点: 1.双引号里面解析变量:echo "$Content" 2.HEREDOC和NOWDOC的关系:类似于双引号包 ...

  3. PHP/HTML混写的四种方式

    [整理]PHP/HTML混写的四种方式   PHP作为一款后端语言,为了输出给浏览器让浏览器呈现出来,无可避免的要输出HTML代码,下文介绍下我用过的三种PHP/HTML混编方法 1.单/双引号包围法 ...

  4. python和C语言混编的几种方式

    Python这些年风头一直很盛,占据了很多领域的位置,Web.大数据.人工智能.运维均有它的身影,甚至图形界面做的也很顺,乃至full-stack这个词语刚出来的时候,似乎就是为了描述它. Pytho ...

  5. iOS图文混排的几种方式

    最近优化升级了之前做的一个项目,现在这一期已接近尾声了,今天可以腾出些时间总结一下最近项目中用的比较多的图片文字混排显示的内容.现在遇到比较多的图文混排的基本有三种:一种是在标签中显示 价格符号+价格 ...

  6. [整理]PHP/HTML混写的四种方式

    PHP作为一款后端语言,为了输出给浏览器让浏览器呈现出来,无可避免的要输出HTML代码,下文介绍下我用过的三种PHP/HTML混编方法 1.单/双引号包围法 这是最初级的方法了,用法就像下面这样 &l ...

  7. Android 音视频开发(一) : 通过三种方式绘制图片

    版权声明:转载请说明出处:http://www.cnblogs.com/renhui/p/7456956.html 在 Android 音视频开发学习思路 里面,我们写到了,想要逐步入门音视频开发,就 ...

  8. Java使用基本字节流OutputStream的四种方式对于数据复制(文本,音视频,图像等数据)

    //package 字符缓冲流bufferreaderDemo; import java.io.BufferedOutputStream; import java.io.FileInputStream ...

  9. 【转】Android播放音频MediaPlayer的几种方式介绍

    接下来笔者介绍一下Android中播放音频的几种方式,android.media包下面包含了Android开发中媒体类,当然笔者不会依次去介绍,下面介绍几个音频播放中常用的类: 1.使用MediaPl ...

随机推荐

  1. 在linux上安装taiga

    # taiga 安装配置 1.简介 本文档介绍了如何部署完整的Taiga服务(每个模块都是Taiga平台的一部分). Taiga平台由三个主要组件组成,每个组件在编译时和运行时都有自己的依赖关系: t ...

  2. [转帖]Linux监测某一时刻对外的IP连接情况

    Linux监测某一时刻对外的IP连接情况 https://blog.csdn.net/twt326/article/details/81454171 公司机器有病毒 需要分析一下. 之前有需要,在CS ...

  3. java跳出循环break;return;continue使用

    for(int i=0;i<5;i++){ if(i==2){ System.out.println("i==2时忽略了"); continue;//忽略i==2时的循环 } ...

  4. pytest_demo_实战1

    1.根目录配置 pytest.ini [pytest] addopts = -p no:warnings 2.更改运行手势,系统配置 file -> setting -> Tools -& ...

  5. C++ 中 string和char* 的区别

    C++ 中 string和char* 的区别 1.定义: string:string是STL当中的一个容器,对其进行了封装,所以操作起来非常方便. char*:char *是一个指针,可以指向一个字符 ...

  6. Mac下Homebrew将程序文件存在什么位置

    一般情况是这么操作的: 1.通过brew install安装应用最先是放在/usr/local/Cellar/目录下. 2.有些应用会自动创建软链接放在/usr/bin或者/usr/sbin,同时也会 ...

  7. 在Go1.11.1中使用go module管理依赖

    今天试验了一下go的版本管理Go moule,只是安装了下,由于目前还没有进行大的项目开发,暂时没有碰到坑. 使用了模块后,可以不用在GOPATH中再建立src目录了,直接在GOPATH中就行 另外, ...

  8. ASP.NET Core使用EPPlus导入导出Excel

    开发过程中,经常会遇到导入导出数据的需求,本篇博客介绍在.NET Core中如何使用EPPlus组件导入导出Excel EPPlus: EPPlus是使用Open Office XML格式(xlsx) ...

  9. echarts 折线图百分比 tooltip 实例 两种方法

    方法一 在知道有几个类型时:下面有五个类型 tooltip : { show : true, trigger: 'axis', formatter: '{b0}<br/>{a0}: {c0 ...

  10. 【案例】电子生产中的排程问题如何解决?APS助力智能化排产

    共进电子是典型的消费类电子制造企业,以ODM业务为主,立足双O(OEM/ODM),发展自主品牌.其中,生产模式特点包括: 批量制造.多品种小批量.面向订单生产: 产品结构复杂,设计变更频繁:生产计划复 ...