• 【原创】高通平台音频调试心得



    平台: QSC60X0
    参考文档: 80-V9137-1, 80-VH828-1, CL93-V6321-1, 80-VA552-11
    参考代码: msmaud.h,  sndcal.c ,  voccal.c
    工具: FIR/IIR滤波器调节工具---QFILT  

          本文主要是针对QSC60X0的音频调试,但是高通音频部分的原理都是大同小异的,所以对于其他平台也有借鉴作用。首先我们要熟悉平台的音频通路:






    一,音频通路说明
    1.发送通路(TX)---表示本地到远端,即发送给对方的声音通路
          声音一开始是从MIC 进入,这里有2个MIC ,默认MIC1用于手机(handset),MIC2用于耳机(headset)。之后声音进过2个可选增益的AP,注意第一个AP只能选择0db或+24db,而第二个AP的增益范围就大了很多,从-6db~+24db,步长1.5db。通过codec的寄存器,可以选择AP的增益,以及使用哪个AP(全选,全不选,或则只用一个,另一个bypass)。经过ADC之后,有两个滤波器HPF和SLOPE,HPF滤出120Hz以下信号,SLOPE会增强1kHz以上的高频信号。在进入QDSP前,有一个可编程增益CodecTxGain,范围-84dB~12dB。这里还有直连到RX后级的侧音增益控制side_tone_gain。进入QDSP后,首先经过EC(回声消除器),然后经过NS(噪声抑制器)和TX AGC,到这里声音信号已经达到最大信噪比。然后通过Tx PCM Filter,这是个FIR滤波器,根据自身的幅频和相频特性影响SFR(发送频响)。最后还有一级可编程增益TxVolume,也会影响到SLR(发送响度)。

    1.接收通路(RX)---表示远端到本地,即本地听到声音的通路
          与TX部分类似。需要补充一点,除图中所示外,SPEAKER还会在PMIC中进行最后一级放大,声音从MIC进来以后,流到CODEC,然后从AUXOP,AUXON输出,流到SPKR_IN_M,SPKR_IN_P, 即进入PMIC,这时可以通过PMIC的API pm_set_speaker_gain(PM_SPKR_GAIN_PLUS12DB)定义增益大小(在sndhw_init()中),放大增益范围为[-16,-12,-8,-4,0,4,8,12]dB ,最后通过SPKR_OUT_P,SPKR_OUT_M输出到喇叭。

    二,音频校准
    主要修改2个文件 sndcal.c ,voccal.c


    1.先要理解两个常量,一个是voccal.c中的常量voc_pcm_on_chip_0_gsm_cal,结构如下:
    typedef struct {
      voc_ec_type ec_mode;   /* Echo Cancellation mode    */
      voc_ns_type ns_enable;  /* Noise suppressor enable   */
      uint16 tx_gain;    /* TX Voice Volume           */
      uint16 dtmf_tx_gain;   /* TX DTMF gain              */
      uint16 codec_tx_gain;   /* CODEC TX gain             */
      uint16 codec_rx_gain;   /* CODEC RX gain             */
      uint16 codec_st_gain;   /* CODEC ST gain             */
      qdsp_cmd_pcm_filter_type tx_filter; /* TX PCM filter coefficients*/
      qdsp_cmd_pcm_filter_type rx_filter; /* RX PCM filter coefficients*/
      sint15 rx_dbm_offset;     /* RX offset in dBm          */
      qdsp_cmd_agc_param_type agc_param; /* AGC/AVC parameters        */
    ……
    ……
    }voc_pcm_path_cal_type;
    根据注释,很容易找到Tx Codec Gain, Tx Volume, Rx Codec Gain, ST Codec Gain, Tx PCM Filter, Rx PCM Filter。这里找到的Gain和Volume增益计算公式为:Gain(dB) = 20*LOG(Value/16384)。

    2.另一个是Sndcal.c中的snd_cal_handset_voice_vol。平台默认为四级音量,数组的第一竖列就是每级音量对应Rx Volume的大小。
    VOL_MEMORY snd_gen_level_voc_type snd_cal_handset_voice_vol[] = {
    { VOC_VOL_SILENCE , VOC_VOL_SILENCE ,  0 },
    {    -1100  ,    -3400 ,  0 },
    {     -500  ,     -3300 ,  0 },
    {      100  ,     -3200 ,  0 },
    {      700  ,     -3100 ,  0 }
    };
    Rx volume计算公式为:Value = 100* Gain(dB)。上例四级音量分别为-11,-5,1,7dB,最大音量7dB。需要说明的是每级音量至少间隔4dB,才能被人耳区分出来。

    3. 对照音频的款图可以发现,以下参数可以调节:
    Tx Volume     ---------voccal.c
    Tx Codec Gain  ---------voccal.c
    Rx Codec Gain  ---------voccal.c
    ST Codec Gain  ---------voccal.c
    Tx PCM Filter  ---------voccal.c
    Rx PCM Filter ---------voccal.c
    Rx Volume(max)  ---------snddcal.c



                
  • 相关阅读:
    java集合
    移动web页面给用户发送邮件的方法
    如何用CSS和jQuery实现一个侧滑导航菜单
    基于jq的表单填充
    使用JS代码实现点击按钮下载文件
    变量,作用域和内存问题
    如何实现单行/多行文本溢出的省略(...)
    CSS中浮动和定位对元素宽度/外边距/其他元素所占空间的影响
    【javascript】函数中的this的四种绑定形式
    前端开发利器webStorm
  • 原文地址:https://www.cnblogs.com/hengfeng/p/1526489.html
Copyright © 2020-2023  润新知