Android音量曲线分析

前段时间仔细研究了一下音量曲线的问题。众所周知,人耳对声音强度的感知不是线性的,而是具有对数关系。所以理想的音量曲线应该是音量级数调节与音量大小的对数成线性关系。即:

-20lg(y) = a * (x - b) 

 

假设音量级数为M,则有: x = M 时 -20lg(y) = 0dB ==> b = M  

 

由此得到: -20lg(y) = a * (x - M)

 

假设最大音量范围为N dB, 则有: x = 0时, -20lg(y) = -NdB ==> a =  N / M


由此得: -20lg(y) = (N/M) * (x - M)

 

从上面的计算,我们得到两个有趣的系数: 

 

    1. a = N / M
    2. a * ln(10) / 20

 

阅读Android代码发现M = 100, N = 50

 

由此得到: a = 0.5     a * ln(10) / 20 = 0.5 * 2.302585093 / 20  

 

以下是Android中用于计算音量的函数:

 

//  convert volume steps to natural log scale 
//  change this value to change volume scaling
static  const  float dBPerStep =  0.5f;
//  shouldn't need to touch these
static  const  float dBConvert = -dBPerStep *  2.302585093f /  20.0f;
static  const  float dBConvertInverse =  1.0f / dBConvert;

float AudioSystem::linearToLog( int volume)
{
     //  float v = volume ? exp(float(100 - volume) * dBConvert) : 0;
    
//  LOGD("linearToLog(%d)=%f", volume, v);
    
//  return v;
     return volume ? exp( float( 100 - volume) * dBConvert) :  0;
}

 

 

转载于:https://www.cnblogs.com/magic-chen/archive/2012/03/16/2400719.html

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值