HengFeng

--博观而约取,厚积而薄发
  博客园  :: 首页  :: 新随笔  :: 联系 :: 管理

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

Posted on 2009-07-19 12:14  hengfeng  阅读(9298)  评论(5编辑  收藏  举报

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