1.3. 应用示例

初始化

gx_ail_init();

/* 获取硬件支持信息(非必须) */
GX_AIL_HW_INFO info;
gx_ail_get_hw_info(&info);

开启ADC采集

/* 配置采集两路信号, 对应双麦配置 */
gx_ail_ladc_set_config(DRV_CH_SEL_MODE_LADC_LR);
gx_ail_ladc_start();

关闭能量VAD检测

gx_ail_evad_disable();

Logfbank汉明窗、维度参数设置

/* LogFbank计算参数 */
GX_AIL_LOGFBANK_CFG logfbank = {
	.source = DRV_LOGFBANK_SOURCE_ROUTE0, /*!< 数据源选择 */
	.hmt_en = 1, /*!< HMT使能标志 */
	.dimension = mel_table_dimension, /*!< Mel表维度 */

	.point_table = (unsigned short*)mel_point_table, /*!< Mel点表指针 */
	.point_table_length = sizeof(mel_point_table)/sizeof(short), /*!< Mel点表长度 */

	.weight_table = (unsigned short*)mel_weight_table, /*!< Mel权重表指针 */
	.weight_table_length = sizeof(mel_weight_table)/sizeof(short), /*!< Mel权重表长度 */
};

/* 设置LogFbank配置 */
gx_ail_logfbank_set_config(&logfbank);

开启左右通道

存在两种配置方法,推荐使用方法一 方法一

GX_AIL_ROUTE_MULTI_CFG route_cfg = {0};
route_cfg.route_mask |= 1 << 0;
route_cfg.route[0].dc_enable = 1;
route_cfg.route[0].source = DRV_ROUTE_SOURCE_LADC_L;
route_cfg.route_mask |= 1 << 1;
route_cfg.route[1].dc_enable = 1;
route_cfg.route[1].source = DRV_ROUTE_SOURCE_LADC_R;

gx_ail_route_multi_start(&route_cfg);

方法二

GX_AIL_ROUTE_CFG route_cfg;
route_cfg.dc_enable = 1;
route_cfg.source = DRV_ROUTE_SOURCE_LADC_L;
gx_ail_route_start(0, &route_cfg);

route_cfg.dc_enable = 1;
route_cfg.source = DRV_ROUTE_SOURCE_LADC_R;
gx_ail_route_start(1, &route_cfg);

配置PCM或频谱数据录制buffer

GX_AIL_PCMW_CFG pcm = {
    .source       = DRV_PCM_SOURCE_LADC, /*!< PCM数据源,设置为左声道模拟数字转换器(LADC) */
    .endian       = DRV_PCM_ENDIAN_BIG_16BIT, /*!< PCM数据的字节序,设置为大端16位 */
    .frame_num    = size / (16/8) / 12, /*!< PCM帧数,计算方式为总大小除以每帧字节数 */
    .left_buffer  = VIR_TO_PHY(laddr), /*!< 左声道缓冲区的物理地址 */
    .right_buffer = VIR_TO_PHY(raddr), /*!< 右声道缓冲区的物理地址 */
    .buffer_size  = size, /*!< 缓冲区大小 */
};

/* 启动PCM写入 */
gx_ail_pcmw_start(id, &pcm, _ail_rec_pcm0_cb, NULL);

录制Logfbank和Logeng

GX_AIL_LOGFBANK_BUFFER logfbank_buffer = {0};
logfbank_buffer.logfbank_buffer_saddr = VIR_TO_PHY(logfbank_saddr);
logfbank_buffer.logfbank_buffer_size  = logfbank_size;
logfbank_buffer.logfbank_rec_en       = 1;

logfbank_buffer.logeng_buffer_saddr = VIR_TO_PHY(logeng_saddr);
logfbank_buffer.logeng_buffer_size  = logeng_size;
logfbank_buffer.logeng_rec_en = 1;

gx_ail_logfbank_start(&logfbank_buffer, _ail_rec_logfbank_cb, NULL);

读取内存数据计算Logfbank

/* Logfbank配置见上述,以下为配置读内存数据 */

GX_AIL_PCMR_CFG pcmr = {
	.bit_size = bit_size,
	.endian = s_pcmr_endian,

	.buffer_saddr = VIR_TO_PHY(addr),
	.buffer_size  = size,
};

if (gx_ail_pcmr_start(&pcmr, _ail_pcm_read_cb, NULL) < 0)
	return -1;

gx_dcache_clean_range((uint32_t *)addr, size);
unsigned int frame_saddr = 0;
unsigned int frame_len = pcmr.buffer_size;
if (gx_ail_pcmr_set_frame(frame_saddr, frame_len) < 0) {
	printf("PCMR set frame failed\n");
	return -1;
}