zoukankan      html  css  js  c++  java
  • 【原创】高通平台音频调试心得


    平台: 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



                
  • 相关阅读:
    D. Babaei and Birthday Cake--- Codeforces Round #343 (Div. 2)
    Vijos P1389婚礼上的小杉
    AIM Tech Round (Div. 2) C. Graph and String
    HDU 5627Clarke and MST
    bzoj 3332 旧试题
    codeforces 842C Ilya And The Tree
    codesforces 671D Roads in Yusland
    Travelling
    codeforces 606C Sorting Railway Cars
    codeforces 651C Watchmen
  • 原文地址:https://www.cnblogs.com/hengfeng/p/1526489.html
Copyright © 2011-2022 走看看