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;
}