1.在做项目的过程中,对于volume 我们有一个volume curve,就是 0~63 step,每个step对应一个dB值,例如0step对应-90dB, 63 step对应0dB。关于这个0dB,是由客户规定的,最大的输出是9V,20W,阻抗4Ω。dB一般是负值,dBa是由分贝仪测出来的,dBa有一套专门的标准来测

2.Balance(左右) 和 Fader(前后)是用来调节左右前后音量的, 调节Balance,对左边或者邮编的dB进行减少,Fader调前后,可以见下图

3.Loudness,对于当前音量,有一个低频/高频的音量补偿,直接上代码,

 ;
 /*take care of this value, volume table boost 18db for each step,
 so when calculate the volume table + LoudnessOffset, need
 attentuate 18db, so define the init value to -18*/
 ;
 static float OffsetPoints[CalNofPoints] = {0.0F, -10.0F, -20.0F, -30.0F, -40.0F, -50.0F, -60.0F, -70.0F,-80.0F, -90.0F, -90.0F};
 static float BassBoostValues[CalNofPoints] = {0.0F, 0.0F, 0.0F, 2.0F, 5.0F, 6.0F, 7.0F, 12.0F, 13.5F, 15.0F, 15.0F};
 static float BassFilterFrequence[CalNofPoints] = {80.0F, 80.0F, 80.0F, 80.0F, 100.0F, 200.0F, 250.0F, 350.0F, 400.0F, 400.0F, 400.0F};
 static float TrebleBoostValues[CalNofPoints] = {0.0F, 0.0F, 0.0F, 1.0F, 1.5F, 2.5F, 3.5F, 4.0F, 4.5F, 5.0F, 5.0F};
 static float TrebleFilterFrequence[CalNofPoints] = {12000.0F, 12000.0F, 12000.0F, 12000.0F, 12000.0F, 11000.0F, 10000.0F, 9000.0F, 8000.0F, 7000.0F, 7000.0F};

 float interpolate(float const x, uint_t const nof, float const xValues[], float const yValues[])//return y
 {
     float yRetval = 0.0F;
     //yValues are expected to be constant rising or falling
     //nof at least 2 otherwise there is nothing to interpolate
     <=nof)
     {
         uint_t ;
         ] < xValues[last];
         //check lower limit
         ]))
             || ((!rising) && (x > xValues[]))
             )
         {
             yRetval = yValues[];
         }
         //check upper limit
         else if (   ( (rising) && (x > xValues[last]))
             || ((!rising) && (x < xValues[last]))
             )
         {
             yRetval = yValues[last];
         }
         else//interpolate
         {
             //find index for x value
             uint_t index = ;
             ;i<last;i++)
             {
                 ]) )
                     ||( (!rising) && (xValues[i] >= x) &&(x >= xValues[i+]) )
                     )
                 {
                     index = i;
                     break;
                 }
             }
             //interpolate
             ];
             ];
             //check xDiff not 0
             if (fabs(xDiff) <= FLT_EPSILON)
             {
                 yRetval = yValues[index];
             }
             else//xDiff not 0 -> calculate y
             {
                 const float gradient = yDiff / xDiff;
                 const float yOffset = (x-xValues[index]) * gradient;
                 yRetval = yValues[index] + yOffset;
             }
         }
     }//check nof
     return yRetval;
 }

 bool_t CavDiranaRoutingCfg::getLoudnessCurveBoost(uint16_t filterID, uint16_t cfgID, float volume, float& loudnessBoost) const
 {
     bool_t retval = true;
     if(m_isLoudnessEnable == true)
     {
         ;
         EFilterID filtertype = static_cast<EFilterID>(filterID);
         loudnessBoost = ;

         //volume -> loudnessBoost
         OverallOffset = LoudnessOffset + volume;
         if (filtertype == FILTER_LOUDNESS_BASS)
         {
             loudnessBoost = interpolate(OverallOffset, CalNofPoints, OffsetPoints, BassBoostValues);
         }
         else if (filtertype == FILTER_LOUDNESS_TREBLE)
         {
             loudnessBoost = interpolate(OverallOffset, CalNofPoints, OffsetPoints, TrebleBoostValues);
         }
     }
     else
     {
         retval = false;
     }

     return retval;
 }

 bool_t CavDiranaRoutingCfg::getLoudnessCurveFilterPrm(uint16_t filterID, uint16_t cfgID, float volume, float& frequency, float& quality) const
 {
     bool_t retval = true;
     if(m_isLoudnessEnable == true)
     {
         ;
         EFilterID filtertype = static_cast<EFilterID>(filterID);
         quality = ;
         frequency = ;

         //volume -> bass filterprm
         OverallOffset = LoudnessOffset + volume;
         if (filtertype == FILTER_LOUDNESS_BASS)
         {
             frequency = interpolate(OverallOffset, CalNofPoints, OffsetPoints, BassFilterFrequence);
         }
         else if (filtertype == FILTER_LOUDNESS_TREBLE)
         {
             frequency = interpolate(OverallOffset, CalNofPoints, OffsetPoints, TrebleFilterFrequence);
         }
     }
     else
     {
         retval = false;
     }

     return retval;
 }

4.Adjustable Bass, Midrange, and Treble tone controls. 是对低频中频高频的一个调节

The bass tone control shall have the following characteristics: 
fcenter = 80Hz
Filter: Shelving type, 1st order

The midrange tone control shall have the following characteristics: 
fcenter = 775Hz
Filter: Peaking type, 2nd order, Q value calibratable with initial value of 1.1

The treble tone control shall have the following characteristics:
fcenter = 8kHz
Filter: Shelving type, 1st order

5.Source Offset
按照需求,对于不同的source,有不同的音量输出要求,在原来的音量上面进行一个dB值的调整

Audio 的一些小笔记的更多相关文章

  1. 转:【iOS开发每日小笔记(十一)】iOS8更新留下的“坑” NSAttributedString设置下划线 NSUnderlineStyleAttributeName 属性必须为NSNumber

    http://www.bubuko.com/infodetail-382485.html 标签:des   class   style   代码   html   使用   问题   文件   数据 ...

  2. 小笔记:Timer定时间隔时间操作

    小笔记:Timer定时间隔时间操作,后面有时间再补充和完善: public class TimingSvc { /// <summary> /// 定时器,执行定时任务 /// </ ...

  3. 关于 linux中TCP数据包(SKB)序列号的小笔记

    关于  SKB序列号的小笔记 为了修改TCP协议,现在遇到了要改动tcp分组的序列号,但是只是在tcp_sendmsg函数中找到了SKB的end_seq  一直没有找到seq 不清楚在那里初始化了,就 ...

  4. Linux下postgres9.4 版本的单机版安装小笔记

    1.添加RPMyum install https://download.postgresql.org/pub/repos/yum/9.4/redhat/rhel-7-x86_64/pgdg-redha ...

  5. 深入剖析Nginx一点小笔记

    前几天在图书馆看书,恰好看到这本<深入剖析nginx>,花了快一周的时间看完了这本书,写点笔记心得便于以后复习. 以前对nginx的认识就只是停留在一个反向代理服务器上.百度了一下ngin ...

  6. HTML、CSS(小笔记)

    这是我自己在学习html.css时觉得要记的东西太多总结一些较为常用的标签. HTML <p></p>段落标签 <hn></hn>标题标签n数值为1~6 ...

  7. Angular开发小笔记

    一.父组件怎么覆盖子组件的样式呢 1./deep/(不建议这么做,以后angular会取消,因为这样写不利于组件的独立性) 在父组件的scss里面写: :host{ 子组件名 /deep/ label ...

  8. Git-rebase 小笔记

    转自: https://blog.yorkxin.org/posts/2011/07/29/git-rebase/ 最近刚好有个机会整理很乱的Git commit tree,终于搞懂了rebase 的 ...

  9. css通用小笔记03——浏览器窗口变小 div错位的问题

    我最近写网页的时候,经常碰到一个普遍的问题,经过我的查阅和尝试,终于解决了这一问题,这里有两种方法提供给大家,如果博友还有更好的方法,欢迎补充. 一.使用min-width属性: 我们先看看下面这段代 ...

随机推荐

  1. ubuntu samba 服务器设置

    安装 SAMBA 组件 sudo apt-get install samba smbfs smbclient ubuntu 14.04 使用以下方式安装: ? 1 2 3 4 5 6 7 若之前有安装 ...

  2. Android 学习第16课,java 包、类等相关的一些基础知识

    1.建议将类放在包中,不要使用无名包 2.建议包名都用小写单词组成,不要用大写 3.建议包名用“域名的倒写.项目名.模块名”的形式,以确保包名的唯一性 注意:类变量与实例变量.类方法与实例方法的区别 ...

  3. 在Visual Lisp中处理自动化错误

    Handling Automation errors in Visual LISP 翻译自原文Kean's blog:http://through-the-interface.typepad.com/ ...

  4. 【 D3.js 入门系列 --- 6 】 如何让图表动起来

    [5.1]节中制作了一个比较完善的图表,但它是静态的,想做出它的动态效果吗?在D3中只需要短短的几行代码即可. 这一节将涉及4个函数的使用. 1.transition() 启动转变效果只需要添加这个即 ...

  5. PHPMyAdmin弱口令猜解【Python脚本】

    PHPMyAdmin弱口令猜解 测试截图: 代码片段 #! /usr/bin/env python # _*_ coding:utf-8 _*_ import requests import time ...

  6. Codeforces Round #174 (Div. 2)

    A. Cows and Primitive Roots 暴力. B. Cows and Poker Game 模拟. C. Cows and Sequence 线段树维护. D. Cow Progra ...

  7. eclipse编辑器配置

    1.添加行号 在侧边空白处右键 勾选如图 2.改字体 window -> preferences 字体的常用配置 Consolas有一个问题是中文字体难以看清 解决方式有两种:一.把字体设置为C ...

  8. git submodule 使用

    这个是备忘录,原网页: https://medium.com/@porteneuve/mastering-git-submodules-34c65e940407 http://cncc.bingj.c ...

  9. new 与 malloc 的区别

    1, 申请内存所在的位置 new 操作符从自由存储区上为对象动态分配内存空间,而 malloc 函数从堆上动态分配内存.自由存储区是C++基于 new 操作符的一个抽象概念,而堆是操作系统中的术语,是 ...

  10. C#序列化与反序列化方式简单总结

    序列化和反序列化 相关类: System.SerializableAttribute特性(或称为属性), System.Runtime.Serialization.ISerializable(自定义序 ...