音频音量调整中的ramp up down

news2024/11/15 15:38:50

在日常生活中不管是打电话还是听音乐,都会遇到音量不合适而去调整音量的情况。如果音量调整软件处理不好,就会听到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 = 10^{dB/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^{\Delta /20} ,     g2 = g1 *  10^{\Delta /20}     (4)

这样就得到了下个采样点的gain(g2)与当前采样点的gain(g1)的数学表达式(式4)。当g2的值到达目标gain时就不再更新。10^{\Delta /20}可以称为ramp factor,事先把这个值算好,在软件中做定值用。在不同的指标和采样率下有不同的值。例如dBPerMS = 0.5,samplesPerMS = 48,则Δ/20 = 0.0005208,rampUpFactor =  10^{\Delta /20} = 1.0012,rampDownFactor = 10^{-\Delta /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的过程。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/165857.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

select for update是行锁还是表锁,还真得看情况

背景 看到许多写select for update是行锁还是表锁的文章,但每篇文章的结论好像都不太一样。同时,是行锁还是表锁的问题直接影响着系统的性能,所以特意为大家调研一番,也就有了本篇文章,一共为大家汇总验证了20个场景下…

MES系统选型攻略,优秀MES系统应具备哪些性质

在众多MES系统中,企业怎样才能找到最适合自己的产品?那么,一套高质量的MES系统,究竟有什么特点?随着全球经济一体化的发展,中美两国之间的贸易战争日趋白热化,中国作为一个生产大国,…

行为型模式 - 迭代器模式iterator

模式的定义与特点 迭代器模式(iterator Pattern),为的提是可以顺序访问一个聚集中的元素而不必暴露聚集的内部表象。多个对象聚在一起形成的总体称之为聚集,聚集对象是能够包容一组对象的容器对象。迭代子模式将迭代逻辑封装到一个…

ffmpeg源码编译vs2013版本

完整版安装ffmpeg 一、安装choco 1.Set-ExecutionPolicy AllSigned 2.Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.N…

链队基本操作(笔记版)

本节主要针对链栈的基本操作进行解析。 # coding:___utf-8___ # author:Guoxuan Sun time:2023/1/12 #链栈的基本操作 #链栈的创建与顺序栈的区别就是每个结点都有一个指针域 #同时链栈也是有两个指针front和rear #链栈中的front指针指向的结点是第一个结点,不是空…

关于MySQL中的存储引擎

存储引擎:(了解内容) 1、什么是存储引擎,有什么用? 存储引擎是mysql中特有的一个术语,其他数据库中没有。 存储引擎就是一个表存储/组织数据的方式。不同的存储引擎,表存储数据的方式不同。 目前…

基于Androidstudio的宠物交友app

需求信息: 客户端: 1:登录注册:用户可以通过自己的信息进行账号的注册 2:宠物信息:列表显示发布的宠物想,可以通过条件对宠物信息进行筛选,以及沟通意向点亮 3:宠物圈&am…

java调用python文件的几种方式

java调用python的契机来自于一个项目需要用到算法,但是算法工程师们写的python,于是就有了java后端调用python脚本的需求,中间遇到了许多问题,特此记录整理了一次。1、java调用python的方式有哪几种1.1 方法一:jpython…

选择排序.

一、简单选择排序 void select_sort(int a[], int len){ //len为数组长度for (int i 0; i < len-1; i){//n个数需要比较n-1趟int min i;//记录最小值的位置for (int j i1; j < len-1; j){if (a[j] < a[min]) min j;//更新最小值的位置} if (min ! i) swap(a[i], …

vue3 项目篇商场 之 初始化项目

目录vue3 项目篇商场 之 初始化项目1&#xff1a;安装 rem 适配src 同级目录下创建 postcss.config.jsmain.ts2 :使用字体图标加字体图标 &#xff08; Symbol 这个选项&#xff09;public / index.html使用效果3 sass4&#xff1a;vant3引入 按需引入 ( 非 vite )4-1 babel.co…

2022年,开源社最亮的星

开源社成立于 2014 年&#xff0c;是由志愿贡献于开源事业的个人成员&#xff0c;依 “贡献、共识、共治” 原则所组成&#xff0c;始终维持厂商中立、公益、非营利的特点&#xff0c;是最早以 “开源治理、国际接轨、社区发展、开源项目” 为使命的开源社区联合体。本次年度评…

常用的专业数据恢复软件有哪些?恢复数据就看这10个!

互联网时代&#xff0c;我们都习惯使用电脑来进行办公&#xff0c;电脑里面都保存着我们很多数据。数据的日积月累&#xff0c;会导致电脑的运行速度减缓&#xff0c;为此我们都会定期对电脑进行清理。 如果在清理过程中&#xff0c;不小心误删或者格式化了数据&#xff0c;有…

漏洞挖掘之信息收集

简介 对单一指定目标网站进行黑盒测试&#xff0c;最重要的就是信息收集&#xff0c;因为网站管理员肯定会在用户经常访问的主网站进行经常维护&#xff0c;而那些子域名&#xff0c;没有什么人访问的&#xff0c;可能就会忘记维护&#xff0c;挖洞的突破点大都在于子域名上&am…

Android/Linux 子系统Graphics图形栈入门普法介绍

Android/Linux 子系统Graphics图形栈入门普法介绍 写在最前面 由于工作原因&#xff0c;最近在公司做了一个关于Android/Linux 子系统Graphics图形栈入门相关知识的培训介绍&#xff0c;个人感觉对于想要了解入门这块的朋友还是有一定帮助的。由于博客不能直接放入ppt&#xff…

Spring AOP源码:代理的创建过程

前言 上篇文章讲解了AOP解析工作&#xff0c;将配置文件解析并封装成beanDefinition&#xff0c;由于配置文件中有5个通知方法&#xff0c;before、after、around、after-returning、after-throwing&#xff0c;这里会将其解析成5个advisor通知类。 <?xml version"1…

opencv——图像阈值设定及常见的滤波操作

1、图像阈值ret,dstcv2.threshold(src,thresh,maxval,type)src:输入图&#xff0c;只能是单通道图&#xff0c;也就是灰度图。thresh:阈值。maxval:当像素超过了阈值&#xff0c;所赋予的值。type:二值化操作的类型&#xff0c;包括binary&#xff0c;binary_iny,trunc,tozero,…

Python编程 闭包

作者简介&#xff1a;一名在校计算机学生、每天分享Python的学习经验、和学习笔记。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;b网络豆的主页​​​​​​ 目录 前言 一.闭包 1.什么是闭包 前景引入&#xff1a; 2.闭包的定义需要满足以下…

Redis序列化、乱码问题

Redis序列化问题 每当初学者学习Redis&#xff0c;并且使用SpringBoot整合Redis的时候&#xff0c;总会看到别人使用这种东西—配置类&#xff0c;然后自己又看不懂&#xff0c;oh&#xff0c;fuck&#xff01;&#xff01; 这是为什么&#xff0c;为什么要有这个配置类&…

Pytorch优化器全总结(四)常用优化器性能对比 含代码

目录 写在前面 一、优化器介绍 1.SGDMomentum 2.Adagrad 3.Adadelta 4.RMSprop 5.Adam 6.Adamax 7.AdaW 8.L-BFGS 二、优化器对比 优化器系列文章列表 Pytorch优化器全总结&#xff08;一&#xff09;SGD、ASGD、Rprop、Adagrad Pytorch优化器全总结&#xff08;二…

设计模式学习(七):Factory Method工厂模式

目录 一、什么是Factory Method模式 二、Factory Method示例代码 2.1 类之间的关系 2.2 Product类 2.3 Factory类 2.4 IDCard类 2.5 IDCardFactory类 2.6 用于测试的Main类 2.7 运行结果 三、拓展思路的要点 3.1 框架与具体加工 3.2 使用模式与开发人员之间的沟通 …