ap_module_config.mk文件中配置:
UAC_N_CHANNELS_IN := 8
输出8通道,通常作为debug模式看原始音频,
通道顺序默认为:mic1 mic2 mic3 mic4 aaa bbb ref cae
aaa bbb通道为定制的通道数据,默认空,(2mic用户,mic3、mic4通道为空)
(如果看到通道顺序不是该顺序排列,请联系聆思FAE协助调整通道顺序)
UAC_N_CHANNELS_IN := 1
输出单通道,通常作为release模式,默认输出cae通道。
ap_module_config.mk文件中
USB_UAC_MODE := 1
//0: 关闭uac 1:UAC上下行具有 2:UAC只保留UAC上行 3:只保留UAC下行
由于不同mic数量,对应的算法不同,需要与聆思fae提前沟通,输出对应mic数量的CP固件。
可支持单麦、2mic、4mic、5mic(4+1)(级联,带子麦功能)
AP改动主要在comm_service.c中配置
ap2cp_share_para结构体的相关通道数及ADC数量,具体可看下述的音频输入方式配置。
音频输入方式配置是指 mic的音源从哪里录入
rpc_user_call_interface.c中配置:
.record_source = INNER_ADC,
.amic_device_group = AON_CDC01,//使用第一个内置ADC,2mic
或
.amic_device_group = CP_CDC23,//使用第二个内置ADC,2mic
或
.amic_device_group = BOTH_CDC,//使用两个内置ADC,4mic
rpc_user_call_interface.c中配置:
.record_source = INNER_DMIC,
.amic_device_group = AON_CDC01,//使用第一个内置DMIC,2mic
或
.amic_device_group = CP_CDC23,//使用第二个内置DMIC,2mic
或
.amic_device_group = BOTH_CDC,//使用两个内置DMIC,4mic
rpc_user_call_interface.c中配置:
.record_source = EXTER_I2S,
.adc_count = 3,(使用外部ADC的数量,自行根据使用改动数量值)
I2S的配置可改动i2s_para结构体变量数据,如下所示
[e_i2s_type_in]{
.i2s_dev_port = e_i2s_dev_1, //表示使用csk的I2S1通道
.i2s_mode = e_i2s_master,
.i2s_protocol = CSK_I2S_PROTO_PCMMODE_A,(协议模式)
.i2s_data_format = I2S_DATA_32BIT_FORMAT,(位深)
.i2s_clock_source = I2S_CLKIN_24MHZ_DEF,(MCLK默认24M)
.i2s_chns = I2S_TRANS_6_CHNS,(根据实际需要改通道数,偶数)
.i2s_in_enable = I2S_ENABLE(使能I2S输入)
},
可通过改动结构体对应的数据,配置I2S标准格式、左对齐、右对齐、PCM格式及16、32bit。
外置ADC还需要配置I2S及I2C引脚:
[e_i2s_type_in]{
/*
*I2S0 没有MCLK或者部分场景下是不需要设置MCLK的,
*直接设置mclk的pad为CSK_IOMUX_PAD_INVALID,此时MCLK设置就会无效
*/
.mclk = {CSK_IOMUX_PAD_B,0,CSK_IOMUX_FUNC_ALTER14},
.bclk = {CSK_IOMUX_PAD_B,4,CSK_IOMUX_FUNC_ALTER14},
.lrclk = {CSK_IOMUX_PAD_B,3,CSK_IOMUX_FUNC_ALTER14},
.data = {CSK_IOMUX_PAD_B, 2, CSK_IOMUX_FUNC_ALTER14}
},
以及
.i2c = {
.scl = {CSK_IOMUX_PAD_B,3,CSK_IOMUX_FUNC_ALTER9},
.sda = {CSK_IOMUX_PAD_B,2,CSK_IOMUX_FUNC_ALTER9},
}
注意:以上pin脚及属性仅供参考,实际需要根据硬件及聆思提供的引脚映射表配置;
引脚映射表下载请点击跳转-> 60xx_iomux_v1.0.xlsx 。
rpc_user_call_interface.c中配置:
.record_source = INNER_ADC_WITH_I2S,(或INNER_DMIC_WITH_I2S)
.amic_device_group = AON_CDC01,(或CP_CDC23或BOTH_CDC)
.dmic_device_group = AON_CDC01,(或CP_CDC23或BOTH_CDC)
.adc_count = 1,
I2S的配置可改动i2s_para结构体变量数据,如下所示
[e_i2s_type_in]{
.i2s_dev_port = e_i2s_dev_1, //表示使用csk的I2S1通道
.i2s_mode = e_i2s_master,
.i2s_protocol = CSK_I2S_PROTO_PCMMODE_A,(协议模式)
.i2s_data_format = I2S_DATA_32BIT_FORMAT,(位深)
.i2s_clock_source = I2S_CLKIN_24MHZ_DEF,(MCLK默认24M)
.i2s_chns = I2S_TRANS_2_CHNS,(根据实际需要改通道数,偶数)
.i2s_in_enable = I2S_ENABLE(使能I2S输入)
},
可通过改动结构体对应的数据,配置I2S标准格式、左对齐、右对齐、PCM格式及16、32bit。
外置ADC还需要配置I2C引脚:
[e_i2s_type_in]{
/*
*I2S0 没有MCLK或者部分场景下是不需要设置MCLK的,
*直接设置mclk的pad为CSK_IOMUX_PAD_INVALID,此时MCLK设置就会无效
*/
.mclk = {CSK_IOMUX_PAD_B,0,CSK_IOMUX_FUNC_ALTER14},
.bclk = {CSK_IOMUX_PAD_B,4,CSK_IOMUX_FUNC_ALTER14},
.lrclk = {CSK_IOMUX_PAD_B,3,CSK_IOMUX_FUNC_ALTER14},
.data = {CSK_IOMUX_PAD_B, 2, CSK_IOMUX_FUNC_ALTER14}
},
以及
.i2c = {
.scl = {CSK_IOMUX_PAD_B,3,CSK_IOMUX_FUNC_ALTER9},
.sda = {CSK_IOMUX_PAD_B,2,CSK_IOMUX_FUNC_ALTER9},
}
注意:以上pin脚及属性仅供参考,实际需要根据硬件及聆思提供的引脚映射表配置;
引脚映射表下载请点击跳转-> 60xx_iomux_v1.0.xlsx 。
音频输出方式指的是降噪后的音频从哪里输出,聆思输出方式支持有UAC、DAC、I2S方式输出。
rpc_user_call_interface.c中配置:
.cp2ap_audio_enable = 1,
ap_module_config.mk文件中,
UAC_N_CHANNELS_IN := 8, (配置成1或8,输出到UAC的通道数)
通道顺序默认为:mic1 mic2 mic3 mic4 aaa bbb ref cae
aaa bbb通道为定制的通道数据,默认空,(2mic用户,mic3、mic4通道为空)
(如果看到通道顺序不是该顺序排列,请联系聆思FAE协助调整通道顺序)
audio_uac.c文件中,
UAC_CAE_CHN_ID,默认为7,输出cae通道,可自行更改输出的通道。
rpc_user_call_interface.c中配置:
.cae2dac_out_enable = DAC_OUT_ENABLE,
.cae2dac_ch_bmp = CH_BMP_LEFT或CH_BMP_RIGHT或CH_BMP_STEREO,
.uac2dac_ch_bmp需要与.cae2dac_ch_bmp一起改动,两个变量必须为DAC的不同声道。
如果单一通道配置成CH_BMP_STEREO,另一个通道不管有没有配置成ENABLE,都必须配置成0。
debug模式可以配置cp2ap_audio_enable = 1,可通过PC端录制查看原始音频,
release模式可将cp2ap_audio_enable = 0,UAC完全不输出音频数据。
或者把cp2ap_audio_enable = 1,UAC_N_CHANNELS_IN := 1,这样只会从UAC输出降噪后的cae音频。
rpc_user_call_interface.c中配置:
[e_i2s_type_out]{
.i2s_dev_port = e_i2s_dev_2, //表示使用csk的I2S2通道
.i2s_mode = e_i2s_master,
.i2s_protocol = CSK_I2S_PROTO_PHILIPS,(协议模式)
.i2s_data_format = I2S_DATA_32BIT_FORMAT,(位深)
.i2s_clock_source = I2S_CLKIN_12P288MHZ,(MCLK)
.i2s_chns = I2S_TRANS_2_CHNS,(根据实际需要改通道数,偶数)
.i2s_out_enable = I2S_ENABLE
}
可通过改动结构体对应的数据,配置I2S标准格式、左对齐、右对齐、PCM格式及16、32bit。
除此之外,还需要根据客户需求,通过指定IO口(IO口必须满足映射表属性)输出I2S信号,适配IO口如下所示:
[e_i2s_type_out]{
.mclk = {CSK_IOMUX_PAD_B,0,CSK_IOMUX_FUNC_ALTER14},
.bclk = {CSK_IOMUX_PAD_B,4,CSK_IOMUX_FUNC_ALTER14},
.lrclk = {CSK_IOMUX_PAD_B,3,CSK_IOMUX_FUNC_ALTER14},
.data = {CSK_IOMUX_PAD_B,5,CSK_IOMUX_FUNC_ALTER14}
}
注意:以上pin脚及属性仅供参考,实际需要根据硬件及聆思提供的引脚映射表配置;
引脚映射表下载请点击跳转-> 60xx_iomux_v1.0.xlsx 。
debug模式可以配置cp2ap_audio_enable = 1,可通过PC端录制查看原始音频,
release模式可将cp2ap_audio_enable = 0,UAC完全不输出音频数据。
或者把cp2ap_audio_enable = 1,UAC_N_CHANNELS_IN := 1,这样只会从UAC输出降噪后的cae音频。
ap_module_config.mk文件中
# 配置UAC上行采样率 ap端会将采样率传递给cp端,作为cp端录音的采样率,默认16000
UAC_IN_SAMP_FREQ := 16000或48000
# 配置UAC下行采样率 ap端会将采样率传递给cp端,作为cp端播音的采样率,默认48000
UAC_OUT_SAMP_FREQ := 48000或16000
上行采样率默认配置16K,如需改动为48K,还请需联系聆思FAE评估需求,且适配对应的CP固件。
增益值相关配置接口:
amic_adc_gain_set(内部ADC)(默认模拟增益12,数字增益0,最小-12,最大+36,单位db)
dmic_adc_gain_set(内部DMIC)(默认数字增益配置为0,最小-83,最大值+42,单位db)
dac_out_gain_set(内部DAC)(默认没配置,最小-24,最大+6,单位db)
set_es7243e_pga_gain(配置外部ADC-7243e的增益)(默认增益配置0x1D)
使用外部ADC的接口需要注意,调用set_es7243e_pga_gain传进去的增益值,需要根据ADC实际寄存器来配置,比如7243e的数据手册可查到,ADC增益值范围在0x10~0x1D,如下图所示:
示例:
#define MIC1 0X15
#define MIC2 0x18
set_es7243e_pga_gain(0x13, MIC1, MIC1); //配置7243e的ADC上的两个通道增益分别是0x15 0x18
#define ADC_PDM_BMP_LEFT CH_BMP_LEFT // (0x1 << 0)
#define ADC_PDM_BMP_RIGHT CH_BMP_RIGHT // (0x1 << 1)
#define ADC_PDM_BMP_STEREO CH_BMP_STEREO // (0x3 << 0)
amic_adc_gain_set(AON_CDC01, ADC_PDM_BMP_STEREO, 30, 0, 30, 0); //配置内置ADC的两个通道模拟增益为30,数字增益0;
dmic_adc_gain_set(AON_CDC01, ADC_PDM_BMP_STEREO, 4, 2); //内置dmic的两个通道数字增益配置为4和2;
//注意内部增益调节接口的增益值值都需要填入偶数,即30、28、26等等,不要是29或者27这种。
#define gain_a_val -8
#define gain_d_val -10
#define CH_BMP_LEFT (0x1 << 0)
#define CH_BMP_RIGHT (0x1 << 1)
dac_out_gain_set(CH_BMP_RIGHT,gain_a_val,gain_d_val); //dac右通道模拟增益-8,数字增益 -10
注意,配置增益值必须在algo_service_ctrl_init函数调用之后配置,在rpc_user_call_interface.c中,在algo_service_start函数中的最后已经调用了algo_service_ctrl_init接口,故配置增益值的接口可以放在algo_service_start最后调用即可,可自行参考调用。
一般建议只配置模拟增益即可,数字增益配置0,只有模拟增益无法满足需求的时候再调整数字增益,但是调整数字增益可能会引入底噪问题。
注意内部增益调节接口的增益值值都需要填入偶数,即30、28、26等等,不要是29或者27这种。
rpc_user_call_interface.c中
通过调用get_cp_soft_version函数之后,
通过cp2ap_data_procss的回调函数的
case cp2ap_cmd_soft_version中可以获取到版本号。有如下打印:
LOGI("version =V%d.%d.%d.%d"
, cp2ap_pack_t->version.ver_major
, cp2ap_pack_t->version.ver_minor
, cp2ap_pack_t->version.ver_resve
, cp2ap_pack_t->version.ver_build);
usb_descriptors.c中的结构体
desc_device中配置bcdDevice;
rpc_user_call_interface.c中
通过调用get_cp_algo_version函数之后,
然后从cp2ap_data_procss的回调函数的
case cp2ap_cmd_algo_version中可以打印出算法版本号
代码中有如下打印:LOGI("cae_version = %s",ptr);
set_cae_nr_switch_state:设置nr_switch状态
set_cae_bypass_switch_state:设置bypass_switch状态
set_cae_nn_denoise_floor:设置环境噪声抑制参数 value:[0-1000]
set_cae_aec_switch:设置算法aec 回消(AEC模块关闭时,ES模块也会自动关闭)
set_cae_param_der_switch:设置算法去混响
set_cae_param_doa_switch:自控制doa功能开关
set_cae_param_eq_switch:自控制eq功能开关
set_cae_param_doa_config:配置doa参数
set_cae_param_agc_config:配置agc参数
注:接口中需要传入type值,type定义主要在comm_service.h的宏中,如下所示:
#define AI_SET_PARA_TYPE_MODE
#define AI_SET_PARA_TYPE_AMIC_OUT_ZERO
#define AI_SET_PARA_TYPE_ZI_MIC_STATE
#define AI_SET_PARA_TYPE_NR_SWITCH
#define AI_SET_PARA_TYPE_NN_DENOISE
#define AI_SET_PARA_TYPE_BYPASS_SWITCH
#define AI_SET_PARA_TYPE_AEC_SWITCH
#define AI_SET_PARA_TYPE_DER_SWITCH
#define AI_SET_PARA_TYPE_ES_SWITCH
#define AI_SET_PARA_TYPE_MAE_SWITCH
#define AI_SET_PARA_TYPE_DOA_SWITCH
#define AI_SET_PARA_TYPE_EQ_SWITCH
#define AI_SET_PARA_TYPE_ES_PF_SWITCH
#define AI_SET_PARA_TYPE_NR_PF_SWITCH
#define AI_SET_PARA_TYPE_BEAMSELECT_SWITCH
#define AI_SET_PARA_TYPE_AEC_REF_CHECK_SWITCH
#define AI_SET_PARA_TYPE_AEC_DELAY_EST_SWITCH
#define AI_SET_PARA_TYPE_CAE_PARAM_NR_LEVEL
#define AI_SET_PARA_TYPE_CAE_PARAM_DOA_CONFIG
#define AI_SET_PARA_TYPE_CAE_PARAM_AGC_CONFIG
算法具体使用,可参考文档算法调优指导使用。
环形阵列支持0-360°;
线性阵列支持0-150°;
精确度保证误差范围在正负15°以内;
以上参数基本满足市场绝大部分用户需求,有特殊需求可以联系聆思相关人员沟通确认。
使能:
rpc_user_call_interface.c中配置,
doa_cp2ap_enable该变量为1,即可打开doa功能。
doa值获取:
聆思的doa值返回是从cp侧的算法输出,通过核间通信给到ap获取,
在comm_service.c中的cp2ap_data_procss函数中的case cp2ap_cmd_doa_result结果中可以获取到doa角度值,可以参考聆思提供的代码,如下图所示:
测试过程可以自行将LOGV改成LOGI,提高日志等级输出,通过串口查看doa值,
开发过程可以自行取cp2ap_pack_t->algo_doa_rslt.doa_angle[0]值做对应的业务逻辑即可。
注意,取doa角度值最好使用消息队列方式发送出去到其他线程处理,不建议在回调函数中直接处理业务逻辑等耗时操作。
改动均在AP代码中改动:
uartcom.h文件中:
UART_PORT_DBG (0),表示log脚配置为串口0,默认配置为PA2(RX)及PA3(TX);
UART_PORT_APP (2),表示通讯口配置为串口2,默认配置为PA15(RX)及PA18(TX).
波特率:
#define UART_SPEED_DBG (115200)
#define UART_SPEED_APP (115200)
注:目前代码通讯口配置的prot_uart_init入口函数被注释掉,即通讯口默认没有配置使用。
pin脚配置:参考代码的uart_port函数改动。
如下图所示:
rpc_user_call_interface.c文件中:
.cp_debug_enable = 1(cp的log使能,1为打开,0为关闭cp log)
.uart_num = UART_PORT_CP_DBG
(默认UART_PORT_CP_DBG宏为1,即CP配置串口号为1,注意AP与CP共用串口硬件资源,所以AP及CP配置的串口不能冲突)
.baudrate:115200(波特率)
引脚配置可见如下:
.hardware_config={
.uart = {
.txd= {CSK_IOMUX_PAD_A,10,CSK_IOMUX_FUNC_ALTER3},
},
注意AP与CP共用串口硬件资源,所以AP及CP配置的串口不能冲突,
串口号对应下的引脚,如果被占用,可以自行更改并根据引脚映射表 ,用其他IO代替;
比如CP配置成串口1,IO是PA10,若PA10在设计上被占用了,则可将hardware_config下面的uart.txd配置成其他IO口,如.txd= {CSK_IOMUX_PAD_A,12,CSK_IOMUX_FUNC_ALTER3},
如果AP的通讯口不使用,CP也可以配置成串口2,IO口可以对应配置成PA18或者PB6。
ap_module_config.mk文件中
//配置是否支持HID
USE_USB_HID := 1
//配置是否支持HID私有协议
SUPPORT_USER_HID := 1
audio_uac.c中改动
注:
默认PA使能脚直接供电则无需配置为1,
PA使能脚接到IO口则需要配置PA_CONTROL_ENABLE为1以及IO口为对应使用的IO口
#define PA_CONTROL_ENABLE (0)
#if PA_CONTROL_ENABLE
#define PA_CONTROL_IO_PAD CSK_IOMUX_PAD_B
#define PA_CONTROL_IO_NUM 2
#define PA_CONTROL_IO_FUN CSK_IOMUX_FUNC_DEFAULT
#define PA_OUT_ON (1)
#define PA_OUT_OFF (0)
uac_request.c中改动
#define IN_DB_MAX 6 // +6 dB
#define IN_DB_MIN 6 // -73 dB
#define IN_DB_RES 1 // 1 dB 相对值,相对默认音量的比值
#define IN_DB_DEF 6 // 1 dB 默认值
uac_request.c中改动
#define OUT_DB_MAX (-1.0f) // +6 dB
#define OUT_DB_MIN (-127.f) // -73 dB
#define OUT_DB_RES 0.1 // 1 dB //相对值
#define OUT_DB_DEF (-8.0f) // 1 dB //默认值