• pcm混音的一种方式


    转载

    混音:

    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

  • 相关阅读:
    恶意代码 第三章作业3
    openGauss使用指南
    Latex从入门到入门(不再更新,原因是博客园不支持latex语法,写的太累了)
    《网络对抗技术》Exp4 恶意代码分析
    恶意代码 第三章作业2
    《网络对抗技术》Exp5 信息搜集与漏洞扫描
    第三章作业数据查询
    实验一密码引擎商用密码算法实现1中遇到的问题
    buuctf学习笔记
    网页设计中的默认字体样式详解
  • 原文地址:https://www.cnblogs.com/8335IT/p/11636761.html
Copyright © 2020-2023  润新知