echo cancelling原理

echo cancelling

一.现象
打电话或语音时,远端 speaker 播放的声音被远端mic 录取,并经过网络传回到local端,在local播放出来,那末local 端就会听到自己的声音,就像回声一样。

echo cancelling原理_第1张图片
Paste_Image.png

二.原因
远端 mic录取的声音中有包含local 在 远端播放的声音,再传回到local

三.消除echo
通过消除或者移除本地话筒中拾取到的远端的音频信号来阻止远端的声音返回
去的一种处理方法
path 分类:voice path,audio path
应用分类:voice call, 和voip call

3.1 Voice Call
qcom 內部本身就會幫voice path 打開 EC 除非你是走外部的 spk amp / codec 像這次600KL project
如果使用外不得spk amp 那么我们需要将tx 拉到spk,处理加下面code部分

3.2 Voip Call
Voip 通话可以根据 use.voice.path.for.pcm.voip 和format type,sample rate,channel number来选择Voice path 或audio path
1)当use.voice.path.for.pcm.voip 是false时,且mode== MODE_IN_COMMUNICATION && format == AMR-NB/AMR-WB/EVRC//EVRC-B/EVRC-WB/EVRC-NW && Stream type == AUDIO_STREAM_VOICE_CALL && Sampling rate==8 or 16kHz && no. of channels == mono会选voice path ,其他的情况都会选 Audio Path
2)当use.voice.path.for.pcm.voip 是true,且mode== MODE_IN_COMMUNICATION && format == AMR-NB/AMR-WB/EVRC//EVRC-B/EVRC-WB/EVRC-NW && Stream type == AUDIO_STREAM_VOICE_CALL && Sampling rate==8 or 16kHz && no. of channels == mono会选voice path ,其他的情况都会选 Audio Path

当Voip 使用 Audio Path:需要为Voip call打开recording path ,input source使用 AUDIO_SOURCE_VOICE_COMMUNICATION ,基于 input source, 选择TX EC device 用于录音,并设置基于playback device 的 EC reference path。
use.voice.path.for.pcm.voip 為 true , 只是讓本來應該被判斷成選擇 voice path 的 app 選擇到正確的 path
如果本身是走 voice path 的 VOIP app , qcom 內部本身就會幫voice path 打開 EC 除非你是走外部的 spk amp / codec 像這次Scorpio

Code
Scorpio voice path with ext spk amp
电话:










QQ/微信:





Scorpio打开Audio Path EC:
有三个部分, mixer xml,audio hal,kernel
当VOIP APP 走 audio path , 而 audio path 的 EC 預設是沒打開的 , 猜測應該是 qcom 讓 OEM 廠商自己決定什麼情況要開 audio path 的 EC , 所以 audio tuning team 有要求要對 VOIP app 打開 EC
走Audio path的app 是 如skype

配置mixer:
skype 选的是low-latency-record or audio-record 兩種 use case,
以这两个path的设定看,他们分别对应到 MultiMedia5 跟MultiMedia1
其对应的 mixer path 下面看到echo-reference 的 path ,
AUDIO_REF_EC_UL1 MUX 這個 control ,其中數字 1 對應的就是 MultiMedai1,UL 表示录音
AUDIO_REF_EC_UL1 MUX 這個 control ,其中數字 1 對應的就是 MultiMedai5

8937 Scorpio speaker amp使用的是Quaternary i2s
Sorpio的 speaker 要打開 audio path EC 的功能 需要設定 兩種 EC path control

code:















Audio hal
void platform_set_echo_reference(struct audio_device *adev, bool enable,
audio_devices_t out_device)
{
struct platform_data *my_data = (struct platform_data *)adev->platform;
struct audio_usecase *usecase = NULL;
if (enable)
{
//if (adev->snd_dev_ref_cnt[out_device] > 0)
{
if(usecase->id == USECASE_AUDIO_RECORD) {
strcpy(my_data->ec_ref_mixer_path,"echo-reference-audio-record");
}
else if(usecase->id == USECASE_AUDIO_RECORD_LOW_LATENCY) {
strcpy(my_data->ec_ref_mixer_path,"echo-reference-low-latency-record");
}
if (out_device == AUDIO_DEVICE_OUT_SPEAKER &&( (getprojectid() == ASUS_ZD552KL) || ( getprojectid() == ASUS_ZS550KL) ))
{
if(usecase->id == USECASE_AUDIO_RECORD) {
strlcat(my_data->ec_ref_mixer_path," speaker",sizeof(my_data->ec_ref_mixer_path));
}
else if(usecase->id == USECASE_AUDIO_RECORD_LOW_LATENCY) {
strlcat(my_data->ec_ref_mixer_path," speaker",sizeof(my_data->ec_ref_mixer_path));
}
}
ALOGD("%s: enabling %s", func, my_data->ec_ref_mixer_path);
audio_route_apply_and_update_path(adev->audio_route, my_data->ec_ref_mixer_path);
}
}
else
{
ALOGV("%s: disabling %s", func, my_data->ec_ref_mixer_path);
audio_route_reset_and_update_path(adev->audio_route, my_data->ec_ref_mixer_path);
strcpy(my_data->ec_ref_mixer_path, "");

}

}
platform_get_input_snd_device -> platform_set_echo_reference
听筒,耳机和speaker 都需要call 到 platform_set_echo_reference 才会打开echo canceller
kernel :

define EC_PORT_ID_QUATERNARY_MI2S_TX 4

define EC_PORT_ID_QUINARY_MI2S_TX 6

static const char *const ec_ref_rx[] = { "None", "SLIM_RX", "I2S_RX",
"PRI_MI2S_TX", "SEC_MI2S_TX",
"TERT_MI2S_TX", "QUAT_MI2S_TX", "SEC_I2S_RX", "PROXY_RX",
"SLIM_5_RX", "SLIM_1_TX", "QUAT_TDM_TX_1",
"QUAT_TDM_RX_0", "QUAT_TDM_RX_1", "QUAT_TDM_RX_2", "SLIM_6_RX",
"TERT_MI2S_RX", "QUAT_MI2S_RX", "TERT_TDM_TX_0", "QUIN_MI2S_TX"}; //max index=19

static const char * const ext_ec_ref_rx[] = {"NONE", "PRI_MI2S_TX",
"SEC_MI2S_TX", "TERT_MI2S_TX",
"QUAT_MI2S_TX", "QUIN_MI2S_TX","SLIM_1_TX"};
"QUAT_MI2S_TX", "SLIM_1_TX", "QUIN_MI2S_TX"};

static int msm_routing_ext_ec_put(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_value *ucontrol)
{
…....
case EC_PORT_ID_QUATERNARY_MI2S_TX:
msm_route_ext_ec_ref = AFE_PORT_ID_QUATERNARY_MI2S_TX;
state = true;
break;
case EC_PORT_ID_QUATERNARY_MI2S_TX:
msm_route_ext_ec_ref = AFE_PORT_ID_QUATERNARY_MI2S_TX;
state = true;
break;
…....
}
static int msm_routing_ec_ref_rx_put(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_value *ucontrol)
{
case 17:
msm_route_ec_ref_rx = 17;
ec_ref_port_id = AFE_PORT_ID_QUATERNARY_MI2S_RX;
break;
case 19:
msm_route_ec_ref_rx = 19;
ec_ref_port_id = AFE_PORT_ID_QUINARY_MI2S_TX;
break;
}
static const struct snd_kcontrol_new voc_ext_ec_mux =
SOC_DAPM_ENUM_EXT("VOC_EXT_EC MUX Mux", msm_route_ext_ec_ref_rx_enum[0],
msm_routing_ext_ec_get, msm_routing_ext_ec_put);
static const struct snd_kcontrol_new ext_ec_ref_mux_ul1 =
SOC_DAPM_ENUM_EXT("AUDIO_REF_EC_UL1 MUX Mux",
msm_route_ec_ref_rx_enum[0],
msm_routing_ec_ref_rx_get, msm_routing_ec_ref_rx_put);
static const struct snd_kcontrol_new ext_ec_ref_mux_ul5 =
SOC_DAPM_ENUM_EXT("AUDIO_REF_EC_UL5 MUX Mux",
msm_route_ec_ref_rx_enum[0],
msm_routing_ec_ref_rx_get, msm_routing_ec_ref_rx_put);

static const struct snd_soc_dapm_widget msm_qdsp6_widgets[] = {
…...
SND_SOC_DAPM_MUX("VOC_EXT_EC MUX", SND_SOC_NOPM, 0, 0,
&voc_ext_ec_mux), // voc_ext_ec_mux control function
SND_SOC_DAPM_MUX("AUDIO_REF_EC_UL1 MUX", SND_SOC_NOPM, 0, 0,
&ext_ec_ref_mux_ul1),
SND_SOC_DAPM_MUX("AUDIO_REF_EC_UL5 MUX", SND_SOC_NOPM, 0, 0,
&ext_ec_ref_mux_ul5),
…...
}

static const struct snd_soc_dapm_route intercon[] = {
snd_soc_dapm_route intercon
{"AUDIO_REF_EC_UL1 MUX", "QUAT_MI2S_TX" , "QUAT_MI2S_TX"},
{"AUDIO_REF_EC_UL1 MUX", "QUIN_MI2S_TX" , "QUIN_MI2S_TX"},
{"AUDIO_REF_EC_UL5 MUX", "QUAT_MI2S_TX" , "QUAT_MI2S_TX"},
{"AUDIO_REF_EC_UL5 MUX", "QUIN_MI2S_TX" , "QUIN_MI2S_TX"},
……
}

六.验证
Windows PC ,QXDM ,QXDM professional ,工具包QXDM_Vocoder_Tool

QXDM
File -> lode configuration -> Back door.dmc
手机连上 PC ->Options -> communication...-> connet
操作 比如打电话、视频通话 ->File → Save items 保存成isf档

QXDM professional
Tools->ISF file Converter → 选择保存过的isf档,将其转换成dlf档
打开文件夹 QXDM_Vocoder_Tool
将转换后的dlf 档拖到QXDM_Vocoder_Tool /getpkt_v3.0.exe
查看ectx_farend_in_pcm_XXX.wav 檔 ,如果有聲音應該是有成功打開EC 。

民用航空局

http://www.caac.gov.cn/INDEX/HLFW/DZKPYZ/

你可能感兴趣的:(echo cancelling原理)