# 应用示例 **初始化** ``` 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; } ```