平台: QSC60X0
参考文档: 80-V9137-1, 80-VH828-1, CL93-V6321-1, 80-VA552-11
参考代码: msmaud.h, sndcal.c , voccal.c
工具: FIR/IIR滤波器调节工具---QFILT
本文主要是针对QSC60X0的音频调试,但是高通音频部分的原理都是大同小异的,所以对于其他平台也有借鉴作用。首先我们要熟悉平台的音频通路:
![](https://images.cnblogs.com/cnblogs_com/hengfeng/audiopath.png)
一,音频通路说明
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