首页 > 其他分享 >音频音量调整中的ramp up & down

音频音量调整中的ramp up & down

时间:2023-01-16 08:22:05浏览次数:40  
标签:20 ramp dB up down 音量 gain

在日常生活中不管是打电话还是听音乐,都会遇到音量不合适而去调整音量的情况。如果音量调整软件处理不好,就会听到pop noise。产生pop noise的原因是音量直接从当前值骤变到目标值,而不是缓慢的变。如果缓慢的变就不会有pop noise了。图1显示的是音量变大时骤变和缓慢变的示意图。图2显示的是音量变小时骤变和缓慢变的示意图。

在技术上音量缓升叫ramp up,音量缓降叫ramp down。本文就讲讲如何处理好ramp up & ramp down。

 

音量调整也叫增益(gain)调整。音量的单位是dB,计算公式是dB = 20*log(gain) 。gain = Y/X ,X是原始PCM值,Y是音量变后的PCM值。当音量不变时,即Y = X或者gain = 1,就是0 dB(20 *log(1) = 0 dB)。通常每增加6dB音量就翻倍,即Y = 2X或者gain = 2,(20 *log(2) = 6.02 dB)。通常音量变化范围是-88dB~12dB。软件实现时用的却是gain,因此要从dB换算成gain。由上面的计算dB的公式可以得到gain,gain = 10dB/20。为了减少运行时的运算量,就把音量(dB)和gain之间的mapping做成table。运行时只要根据dB值查表得到gain值。下表做了一个简单的示例。

float gain[101] = {

        0.0000398,  // -88 dB

        0.0000447,    // -87 dB

        …..

        1.0,               // 0 dB

        …..

        2.0,              // 6 dB

        …..

};

原始PCM值乘以gain就是变化后的PCM值了,即 Y = X * gain。

音频处理算法通常都是定点实现的,这样就需要把gain table定点化,以Q4.27为例,得到下表的示例。

Int gain[101] = {

        5343,            // -88 dB

        5995,            // -87 dB

        …..

        134217728 ,  // 0 dB

        …..

        267799575,  // 6 dB

        …

};

在音量ramp过程中,要想做好ramp up & down,ramp过程中每个采样点的gain都是不一样的,从当前的gain值逐渐变到目标gain值。首先得定好指标:1ms变化多少dB(定义为dBPerMS), 这个确定了就可算出需要多少毫秒从当前音量变到目标音量。例如指标是1ms变化1dB,那么音量要从0dB变到12dB就需要12ms。采样率不同,1ms内的采样点数也不一样(定义为samplesPerMS)。以8K采样率为例,1ms内有8个采样点,即samplesPerMS = 8。知道了dBPerMS和samplesPerMS,就可算出每个采样点变化的dB,即 dBPerMS/samplesPerMS,记为ΔdB。上面算出的是ramp up时的值,当ramp down时,就是-ΔdB。

 

在ramp过程中假设当前采样点的音量为N dB,对应的gain记为g1,则下个采样点的音量为(N + Δ) dB,对应的gain记为g2。可以得到如下两个表达式:

     N  =  20 * log(g1)           (1)

     N +  Δ = 20 * log(g2)      (2)

(2)式 - (1)式得式(3)

    Δ = 20 * log(g2) - 20 * log(g1) = 20 * log(g2/g1)        (3)

所以

    log(g2/g1) = Δ/20 ,    g2/g1 =  10Δ/20 ,     g2 = g1 *  10Δ/20     (4)

这样就得到了下个采样点的gain(g2)与当前采样点的gain(g1)的数学表达式(式4)。当g2的值到达目标gain时就不再更新。10Δ/20可以称为ramp factor,事先把这个值算好,在软件中做定值用。在不同的指标和采样率下有不同的值。例如dBPerMS = 0.5,samplesPerMS = 48,则Δ/20 = 0.0005208,rampUpFactor =  10Δ/20 = 1.0012,rampDownFactor = 10-Δ/20 = 0.9988。Ramp factor确定后就可去做gain更新了。以从0dB ramp up到6dB ramp factor是1.0012为例,0 dB时gain是1,6dB时目标gain是2。算每个采样点时当前采样点的gain都是前一个采样点gain的1.0012倍,一直到gain达到2后保持不变。

 

 图3和图4是以正弦波为例做ramp up & down的原PCM和ramp后的PCM。

                                               图3 原PCM波形和频谱

                                          图4  ramp up & down后的波形和频谱

对上两图做一下解释。处理的是双声道的48k 采样的正弦波。通常声音刚开始播放时为了避免pop noise,会做一个ramp up,把音量从-88dB逐渐调整到0dB。30帧(每帧10ms)时,把音量调整到3dB,是个ramp up的过程。60帧时设成mute(mute是常见的一个场景,它可以算是音量调整中一个特例。mute时相当于把音量从当前值变为-88dB,unmute时就相当于把音量从-88dB变回去),是个ramp down的过程,几乎就听不到声音了。90帧时把音量设成0dB, 由于这时还处于mute,不生效,但音量值记住了。120帧时设成unmute,是个ramp up的过程,音量逐步变成0dB。150帧时把音量设成-6dB,是个ramp down的过程。

 

 

 


 

标签:20,ramp,dB,up,down,音量,gain
From: https://www.cnblogs.com/talkaudiodev/p/17048134.html

相关文章

  • Execution failed for task ':app:checkDebugDuplicateClasses'解决办法
    Afailureoccurredwhileexecutingcom.android.build.gradle.internal.tasks.CheckDuplicatesRunnable >Duplicateclassandroid.support.v4.app.INotificationSi......
  • markdown 语法,md 语法
    markdown语法,md语法1。插入图片,语法:在md文件中输入![***](***),[ ]中为图片显示出出来时,会显示的文字,()为图片的远程地址,或者本地地址。例如:![xx](https://ai-studio......
  • css面试总结[updating]
    1.visibility=hidden,opacity=0,display:none都是隐藏元素,让元素消失display=none重排,元素消失,会改变页面布局,可以理解成在页面中把该元素删除。visibility=hidden重绘......
  • [disruptor]02-disruptor代码阅读
    环形队列这个环形队列的原理很简单,前面已经介绍过,再次进行简略说明:​​cap​​大小必须是​​2​​的​​N​​次方索引可以一直递增访问元素时索引需要对​​cap​​取模实......
  • [disruptor详解]01-disruptor原理
    ​​disruptor详解​​​​disruptorCpp-IPC​​disruptor原理使用循环队列,且要求队列大小为2的N次方,以满足位运算快速计算索引的要求(比取模速度快)使用原子变量记录生产者......
  • (已解决)Mybatis逆向生成时,没有生成根据主键的select、update和delete方法
    使用mybatis逆向生成时,发现mapper接口中没有生成...ByPrimaryKey的方法,在generatorConfig.xml配置文件的数据库连接,即jdbcConnection标签中加入<propertyname="useInf......
  • 和菜鸟一起学linux之upnp协议的学习记录
    UPnP全名是UniversalPlugandPlay,主要是微软在推行的一个标准。简单的来说,UPnP最大的愿景就是希望任何设备只要一接上网络,所有在网络上的设备马上就能知道有新设备加入,这......
  • upload-labs通关详解
    upload-labs通关详解一、Pass-01查看源码,发现变量前有var,可以代码语言是JSsubstring():裁剪字符串lastIndexOf():返回某个子字符串在字符串中最后出现的位置varext_name=......
  • Markdown最基础语法内容
    基础常用语法(大多符号后都要跟一个空格)一、标题1.使用#号可表示1-6级标题,一级标题对应一个#号,二级标题对应两个#号,以此类推。#不要漏了符号和内容之间的空格一......
  • 第十九节:Pinia简介及state、getter、action详解、常用Api、setup简化写法
    一. 简介       二.state       三.getter     四.action   五.常用Api    六.setup简化写法   ......