SGS APC 算法使用参考¶
REVISION HISTORY¶
| Revision No. | Description |
Date |
|---|---|---|
| 1.0 | 09/09/2020 | |
| 1.1 | 10/15/2020 | |
| 1.2 | 12/17/2020 | |
| 1.3 | 08/03/2021 | |
| 1.4 | 08/05/2021 | |
| 1.5 | 08/10/2021 | |
| 1.6 | 04/06/2022 | |
| 1.7 | 07/21/2022 | |
| 1.71 | 08/16/2022 | |
| 1.8 | 08/17/2022 | |
| 1.9 | 09/27/2022 | |
| 1.91 | 10/25/2022 | |
| 1.92 | 12/12/2022 | |
| 1.93 | 03/07/2023 | |
| 2.0 | 03/24/2023 | |
| 2.01 | 04/17/2023 | |
| 2.1 | 07/25/2023 | |
| 2.2 | 10/12/2023 | |
| 2.21 | 10/23/2023 | |
| 2.3 | 02/22/2024 | |
| 2.31 | 02/22/2024 | |
| 2.4 | 04/15/2024 | |
| 2.41 | 04/19/2024 | |
| 2.5 | 05/22/2024 | |
| 2.51 | 06/03/2024 | |
| 2.6 | 07/11/2024 | |
| 2.61 | 09/11/2024 | |
| 2.7 | 09/11/2024 | |
| 2.8 | 09/16/2024 | |
| 2.9 | 10/08/2024 | |
| 2.91 | 01/08/2025 | |
| 2.92 | 01/13/2025 | |
| 2.93 | 03/31/2025 | |
| 2.94 | 04/19/2025 | |
| 2.95 | 05/15/2025 | |
| 2.96 | 07/24/2025 | |
| 2.97 | 10/28/2025 | |
| 2.98 | 10/29/2025 | |
| 2.99 | 11/21/2025 |
1. 概述¶
1.1. 算法说明¶
APC(Audio Process Chain)音讯处理链,是一个包含降噪、均衡器和自动增益控制的算法组合。APC的主要目的是提高音频质量。APC的内部的算法串接流程为ANR → EQ/HPF → AGC。透过降噪消除噪声提升SNR,再根据客户所需曲线调整EQ/HPF,最后透过AGC增益或衰减输出音量。
关键词说明
-
AGC
AGC(Automatic Gain Control),自动增益控制,用于控制数字讯号输出。
-
EQ
EQ(Equalizer),均衡器处理,用于对特定频段进行增益或衰减。
-
ANR
ANR(Acoustic Noise Reduction),降噪,用于去除环境中持续存在,频率固定的噪声。
-
HPF
HPF(High-Pass Filtering),高通滤波。
注意
为方便调整和验证音频算法效果,需要用户应用自行实现替换算法参数和抓取音频处理结果的逻辑。
1.2. 基本结构¶

当APC算法配置好内存、完成参数初始化与设定后,APC只需要输入讯号Buffer,并将输入讯号Buffer按设定参数与算法处理后,将处理后数据输出到输入讯号Buffer上。
1.3. 功能介绍¶
降噪 :
消除输入讯号中的非语音稳态噪声,提升讯噪比。

均衡器 :
对特定频带做能量增益或是抑制,调整不同频段音量比例,改善音质。

高通滤波 :
只允许讯号中高于设定截止频率的信号通过,同时抑制低于截止频率信号的部分。

自动增益控制 :
根据设定压缩率曲线参数,计算输入讯号能量并自动调整增益并应用在输入讯号上,保持信号稳定。

1.4. 应用场景¶
APC常用会议系统、楼宇对讲、安防监控与消费电子产品等场景,在各种环境下提供噪声低、音质好、音量稳定的舒适音频体验。
1.5. 芯片差异说明¶
在不同系列芯片,目前APC算法效果上没有差异。
1.6. 实例介绍¶
使用APC API获取APC算法运行需要的内存大小、初始化APC算法handle、配置参数至APC算法handle、运行APC算法与释放APC算法资源。

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include <time.h>
#include <stdlib.h>
#ifndef OS_WINDOWS
#include <sys/ioctl.h>
#endif
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/time.h>
#include "AudioProcess.h"
#define USE_MALLOC (1)
#define USE_JSON (0)
#define FILTER_ENABLE (0)
#define FREQ_AGC_ENABEL (1)
unsigned int WorkingBuffer2[1] = {0};
typedef unsigned char uint8;
typedef unsigned short uint16;
typedef unsigned long uint32;
float AVERAGE_RUN(int a)
{
static unsigned int num = 0;
static float avg = 0;
if(num == 0) avg = 0;
num++;
avg = avg + ((float)a - avg) / ((float)num);
return avg;
}
unsigned int _OsCounterGetMs(void)
{
struct timeval t1;
gettimeofday(&t1,NULL);
unsigned int T = ( (1000000 * t1.tv_sec)+ t1.tv_usec )/1000;
return T;
}
int main(int argc, char *argv[])
{
short input[1024];
unsigned int T0, T1;
float avg = 0;
float peak = 0;
char input_file[512];
char output_file[512];
int counter=0;
int intensity_band[6] = {3,24,40,64,80,128};
int intensity[7] = {0,30,0,30,0,30,0};
short eq_table[129] = { 1, 1, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5 };
memset (eq_table,0,sizeof(short)*129);
short compression_ratio_input[_AGC_CR_NUM] = {-65,-55,-48,-25,-18,-12,0};
short compression_ratio_output[_AGC_CR_NUM] = {-65,-50,-27,-12,-1,-1,-1};
#if FREQ_AGC_ENABEL
int freqBand[_AGC_FREQ_BAND_NUM] = {3000,6000,8000};
int compressionRatioArrayLowInput[_AGC_CR_NUM] = {-80,-60,-40,-20,0,0,0};
int compressionRatioArrayLowOutput[_AGC_CR_NUM] = {-5,-5,-5,-5,-5,-5,-5};
int compressionRatioArrayMidInput[_AGC_CR_NUM] = {-80,-60,-40,-20,0,0,0};
int compressionRatioArrayMidOutput[_AGC_CR_NUM] = {-80,-60,-40,-20,0,0,0};
int compressionRatioArrayHighInput[_AGC_CR_NUM] = {-80,-60,-40,-20,0,0,0};
int compressionRatioArrayHighOutput[_AGC_CR_NUM] = {-80,-60,-40,-20,0,0,0};
#endif
AudioApcBufferConfig apc_switch;
memset(&apc_switch,0,sizeof(AudioApcBufferConfig));
apc_switch.anr_enable = 1;
apc_switch.eq_enable = 1;
apc_switch.dr_enable = 0;
apc_switch.vad_enable = 0;
apc_switch.agc_enable = 1;
int buffersize = IaaApc_GetBufferSize(&apc_switch);
if(buffersize == 0){
printf("IaaApc_GetBufferSize() error.\t\n");
return -1;
}
else{
printf("IaaApc_GetBufferSize() succeed.\t\n");
}
#if USE_MALLOC
char *working_buf_ptr = (char*)malloc(buffersize);
#else
char working_buf_ptr[512*1000];
#endif
#if USE_JSON
unsigned int use_anr_intl_json = 1;
char anr_intl_json_file[512];
sprintf(anr_intl_json_file,"%s","./../sample/data/AnrInternalJson.json");
int anr_intl_buffersize = IaaApc_GetJsonFileSize(anr_intl_json_file);
if(anr_intl_buffersize == 0){
printf("IaaApc_GetJsonFileSize() error. Can not load json file [%s]\t\n", anr_intl_json_file);
use_anr_intl_json = 0;
}
else{
printf("IaaApc_GetJsonFileSize() succeed.\t\n");
}
#if USE_MALLOC
char *anr_intl_json_buf_ptr = (char*)malloc(anr_intl_buffersize);
#else
char anr_intl_json_buf_ptr[512*1000];
#endif
#endif
#if USE_JSON
unsigned int use_apc_intl_json = 1;
char apc_intl_json_file[512];
sprintf(apc_intl_json_file,"%s","./../sample/data/ApcInternalJson.json");
int apc_intl_buffersize = IaaApc_GetJsonFileSize(apc_intl_json_file);
if(apc_intl_buffersize == 0){
printf("IaaApc_GetJsonFileSize() error. Can not load json file [%s]\t\n", apc_intl_json_file);
use_apc_intl_json = 0;
}
else{
printf("IaaApc_GetJsonFileSize() succeed.\t\n");
}
#if USE_MALLOC
char *apc_intl_json_buf_ptr = (char*)malloc(apc_intl_buffersize);
#else
char apc_intl_json_buf_ptr[512*1000];
#endif
#endif
FILE * fin, * fout;
int ret1;
AudioProcessInit apc_init;
AudioAnrConfig anr_config;
AudioEqConfig eq_config;
AudioHpfConfig hpf_config;
AudioAgcConfig agc_config;
APC_HANDLE handle;
memset(&apc_init,0,sizeof(AudioProcessInit));
memset(&anr_config,0,sizeof(AudioAnrConfig));
memset(&eq_config,0,sizeof(AudioEqConfig));
memset(&hpf_config,0,sizeof(AudioHpfConfig));
memset(&agc_config,0,sizeof(AudioAgcConfig));
int PN=128;
apc_init.point_number = PN;
apc_init.channel = 1;
apc_init.sample_rate = IAA_APC_SAMPLE_RATE_16000;
handle = IaaApc_Init((char *)working_buf_ptr, &apc_init, &apc_switch);
if(handle==NULL){
printf("IaaApc_Init() error.\t\n");
return -1;
}
else{
printf("IaaApc_Init() succeed.\t\n");
}
/******ANR Config*******/
anr_config.anr_enable = apc_switch.anr_enable;
anr_config.user_mode = 1;
anr_config.anr_filter_mode = 0;
memcpy(anr_config.anr_intensity_band, intensity_band, 6*sizeof(int));
memcpy(anr_config.anr_intensity, intensity, 7*sizeof(int));
anr_config.anr_smooth_level = 10;
anr_config.anr_converge_speed = 2;
/******EQ Config********/
eq_config.eq_enable =apc_switch.eq_enable;
eq_config.user_mode = 1;
memcpy(eq_config.eq_gain_db, eq_table,_EQ_BAND_NUM*sizeof(short));
/******HPF Config********/
hpf_config.hpf_enable = apc_switch.eq_enable;
hpf_config.user_mode =1;
hpf_config.cutoff_frequency = AUDIO_HPF_FREQ_150;
/******AGC Config********/
agc_config.agc_enable = apc_switch.agc_enable;
agc_config.user_mode = 1;
agc_config.gain_info.gain_max = 40;
agc_config.gain_info.gain_min = -10;
agc_config.gain_info.gain_init = 12;
agc_config.drop_gain_max = 36;
agc_config.gain_step = 1;
agc_config.attack_time = 1;
agc_config.release_time = 1;
agc_config.noise_gate_db = -80;
memcpy(agc_config.compression_ratio_input, compression_ratio_input,_AGC_CR_NUM*sizeof(short));
memcpy(agc_config.compression_ratio_output, compression_ratio_output,_AGC_CR_NUM*sizeof(short));
agc_config.noise_gate_attenuation_db = 0;
agc_config.drop_gain_threshold = -5;
if(IaaApc_Config(handle,&anr_config,&eq_config,&hpf_config,NULL,NULL,&agc_config) != -0){
printf("IaaApc_Config() error.\t\n");
return -1;
}
else{
printf("IaaApc_Config() succeed.\t\n");
}
// IaaApc_EnableComfortNoise(handle, 1, -50);
#if USE_JSON
if(apc_switch.anr_enable && use_anr_intl_json){
if(IaaApc_NrReadJson(handle, anr_intl_json_buf_ptr, anr_intl_json_file, anr_intl_buffersize) != 0){
printf("IaaApc_NrReadJson() error.\t\n");
return -1;
}
else{
printf("IaaApc_NrReadJson() succeed.\t\n");
}
}
#endif
#if USE_JSON
if(use_apc_intl_json){
if(IaaApc_ReadJson(handle, apc_intl_json_buf_ptr, apc_intl_json_file, apc_intl_buffersize) != 0){
printf("IaaApc_ReadJson() error.\t\n");
return -1;
}
else{
printf("IaaApc_ReadJson() succeed.\t\n");
}
}
#endif
#if FILTER_ENABLE
float h[512];
//filter 1
AudioFilterConfig filter_design;
filter_design.q_factor = 5;
filter_design.f0 = 1000;
filter_design.type = EQ_NOTCH_FILTER;
filter_design.gain = -10;
//filter 2
AudioFilterConfig filter_design2;
filter_design2.q_factor = 5;
filter_design2.f0 = 5000;
filter_design2.type = EQ_NOTCH_FILTER;
filter_design2.gain = -10;
//filter 3
AudioFilterConfig filter_design3;
filter_design3.q_factor = 5;
filter_design3.f0 = 500;
filter_design3.type = EQ_NOTCH_FILTER;
filter_design3.gain = -10;
if(IaaApc_FilterDesign(handle, 1, &filter_design) != 0){
printf("IaaEq_FilterDesign() error.\t\n");
return -1;
}
if(IaaApc_FilterDesign(handle, 2, &filter_design2) != 0){
printf("IaaEq_FilterDesign() error.\t\n");
return -1;
}
if(IaaApc_FilterDesign(handle, 3, &filter_design3) != 0){
printf("IaaEq_FilterDesign() error.\t\n");
return -1;
}
IaaApc_FilterFreqz(handle,h);
#endif
#if FREQ_AGC_ENABEL
if(agc_config.user_mode == 2){
IaaApc_SetAgcFreqBand(handle, freqBand);
IaaApc_SetLowFreqCompressionRatioCurve(handle, compressionRatioArrayLowInput, compressionRatioArrayLowOutput);
IaaApc_SetMidFreqCompressionRatioCurve(handle, compressionRatioArrayMidInput, compressionRatioArrayMidOutput);
IaaApc_SetHighFreqCompressionRatioCurve(handle, compressionRatioArrayHighInput, compressionRatioArrayHighOutput);
}
#endif
AudioProcessInit apc_init_cpy;
AudioAnrConfig anr_config_cpy;
AudioEqConfig eq_config_cpy;
AudioHpfConfig hpf_config_cpy;
AudioAgcConfig agc_config_cpy;
memset(&apc_init_cpy,0,sizeof(AudioProcessInit));
memset(&anr_config_cpy,0,sizeof(AudioAnrConfig));
memset(&eq_config_cpy,0,sizeof(AudioEqConfig));
memset(&hpf_config_cpy,0,sizeof(AudioHpfConfig));
memset(&agc_config_cpy,0,sizeof(AudioAgcConfig));
if(IaaApc_GetConfig(handle, &apc_init_cpy, &anr_config_cpy, &eq_config_cpy, &hpf_config_cpy, NULL, NULL, &agc_config_cpy) != ALGO_APC_RET_SUCCESS){
printf("IaaApc_GetConfig() error.\t\n");
return -1;
}
else{
printf("IaaApc_GetConfig() succeed.\t\n");
}
sprintf(input_file,"%s","./../sample/data/APC_AFE_16K.wav");
sprintf(output_file,"%s","./../sample/data/APC_out_16K.wav");
fin = fopen(input_file, "rb");
if(!fin)
{
printf("the input file %s could not be open\n",input_file);
return -1;
}
fout = fopen(output_file, "wb");
if(!fout)
{
printf("the output file could not be open\n");
return -1;
}
fread(input, sizeof(char), 44, fin); // read header 44 bytes
fwrite(input, sizeof(char),44, fout); // write 44 bytes output
while(fread(input, sizeof(short), apc_init.point_number*apc_init.channel, fin))
{
counter++;
T0 = (long)_OsCounterGetMs();
ret1 = IaaApc_Run(handle,input);
#if FILTER_ENABLE
ret1 += IaaApc_FilterApply(handle, input);
#endif
T1 = (long)_OsCounterGetMs();
avg += (T1 - T0);
if(peak < (T1 - T0))
peak = (T1 - T0);
if(counter%1000== 999)
{
printf("counter = %d\n", counter);
printf("current time = %f\n", (float)counter*PN/apc_init.sample_rate);
printf("process time = %lu(ms)\t",(long)(T1 - T0));
}
if(ret1 != 0)
{
printf("Error occured in APC\n");
break;
}
fwrite(input, sizeof(short), apc_init.point_number*apc_init.channel, fout);
}
avg /= counter;
printf("AVG is %.2f ms\n",avg);
printf("PEAK is %.2f ms\n",peak);
IaaApc_Free(handle);
free(working_buf_ptr);
fclose(fin);
fclose(fout);
printf("Done\n");
return 0;
}
使用APC API读取APC json档参数、获取APC算法运行需要的内存大小、初始化APC算法handle、配置参数至APC算法handle、运行APC算法与释放APC算法资源。

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include <time.h>
#include <stdlib.h>
#ifndef OS_WINDOWS
#include <sys/ioctl.h>
#endif
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/time.h>
#include "AudioProcess.h"
#if (ANR_IPU_ENABLE)
#include "mi_sys.h"
#endif
#define USE_MALLOC (1)
#define USE_JSON (1)
#define FILTER_ENABLE (0)
#define FREQ_AGC_ENABEL (0)
#define DIGITAL_GAIN_ENABLE (0)
unsigned int WorkingBuffer2[1] = {0};
typedef unsigned char uint8;
typedef unsigned short uint16;
typedef unsigned long uint32;
float AVERAGE_RUN(int a)
{
static unsigned int num = 0;
static float avg = 0;
if(num == 0) avg = 0;
num++;
avg = avg + ((float)a - avg) / ((float)num);
return avg;
}
unsigned int _OsCounterGetMs(void)
{
struct timeval t1;
gettimeofday(&t1,NULL);
unsigned int T = ( (1000000 * t1.tv_sec)+ t1.tv_usec )/1000;
return T;
}
int main(int argc, char *argv[])
{
#if (ANR_IPU_ENABLE)
MI_SYS_Init(0);
#endif
short input[1024];
unsigned int T0, T1;
float avg = 0;
float peak = 0;
char input_file[512];
char output_file[512];
int counter=0;
#if FREQ_AGC_ENABEL
int freqBand[_AGC_FREQ_BAND_NUM];
int compressionRatioArrayLowInput[_AGC_CR_NUM];
int compressionRatioArrayLowOutput[_AGC_CR_NUM];
int compressionRatioArrayMidInput[_AGC_CR_NUM];
int compressionRatioArrayMidOutput[_AGC_CR_NUM];
int compressionRatioArrayHighInput[_AGC_CR_NUM];
int compressionRatioArrayHighOutput[_AGC_CR_NUM];
#endif
AudioApcBufferConfig apc_switch;
memset(&apc_switch,0,sizeof(AudioApcBufferConfig));
#if USE_JSON
unsigned int use_apc_param_json = 1;
char apc_para_json_file[512];
sprintf(apc_para_json_file,"%s","./../sample/data/ApcParamJson.json");
int apc_para_buffersize = IaaApc_GetJsonFileSize(apc_para_json_file);
if(apc_para_buffersize == 0){
printf("IaaApc_GetJsonFileSize() error. Can not load json file [%s]\t\n", apc_para_json_file);
use_apc_param_json = 0;
}
else{
printf("IaaApc_GetJsonFileSize() succeed.\t\n");
}
#if USE_MALLOC
char *apc_para_json_buf_ptr = (char*)malloc(apc_para_buffersize);
#else
char apc_para_json_buf_ptr[512*1000];
#endif
if(use_apc_param_json){
if(IaaApc_SwitchReadFromJson(&apc_switch, apc_para_json_buf_ptr, apc_para_json_file, apc_para_buffersize) != 0){
printf("IaaApc_SwitchReadFromJson() error.\t\n");
return -1;
}
else{
printf("IaaApc_SwitchReadFromJson() succeed.\t\n");
}
}
#endif
int buffersize = IaaApc_GetBufferSize(&apc_switch);
if(buffersize == 0){
printf("IaaApc_GetBufferSize() error.\t\n");
return -1;
}
else{
printf("IaaApc_GetBufferSize() succeed.\t\n");
}
#if USE_MALLOC
char *working_buf_ptr = (char*)malloc(buffersize);
#else
char working_buf_ptr[512*1000];
#endif
#if USE_JSON
unsigned int use_anr_intl_json = 1;
char anr_intl_json_file[512];
sprintf(anr_intl_json_file,"%s","./../sample/data/AnrInternalJson.json");
int anr_intl_buffersize = IaaApc_GetJsonFileSize(anr_intl_json_file);
if(anr_intl_buffersize == 0){
printf("IaaApc_GetJsonFileSize() error. Can not load json file [%s]\t\n", anr_intl_json_file);
use_anr_intl_json = 0;
}
else{
printf("IaaApc_GetJsonFileSize() succeed.\t\n");
}
#if USE_MALLOC
char *anr_intl_json_buf_ptr = (char*)malloc(anr_intl_buffersize);
#else
char anr_intl_json_buf_ptr[512*1000];
#endif
#endif
#if USE_JSON
unsigned int use_apc_intl_json = 1;
char apc_intl_json_file[512];
sprintf(apc_intl_json_file,"%s","./../sample/data/ApcInternalJson.json");
int apc_intl_buffersize = IaaApc_GetJsonFileSize(apc_intl_json_file);
if(apc_intl_buffersize == 0){
printf("IaaApc_GetJsonFileSize() error. Can not load json file [%s]\t\n", apc_intl_json_file);
use_apc_intl_json = 0;
}
else{
printf("IaaApc_GetJsonFileSize() succeed.\t\n");
}
#if USE_MALLOC
char *apc_intl_json_buf_ptr = (char*)malloc(apc_intl_buffersize);
#else
char apc_intl_json_buf_ptr[512*1000];
#endif
#endif
FILE * fin, * fout;
int ret1;
AudioProcessInit apc_init;
AudioAnrConfig anr_config;
AudioEqConfig eq_config;
AudioHpfConfig hpf_config;
AudioAgcConfig agc_config;
AudioApcOption apc_option;
memset(&apc_init,0,sizeof(AudioProcessInit));
memset(&anr_config,0,sizeof(AudioAnrConfig));
memset(&eq_config,0,sizeof(AudioEqConfig));
memset(&hpf_config,0,sizeof(AudioHpfConfig));
memset(&agc_config,0,sizeof(AudioAgcConfig));
memset(&apc_option,0,sizeof(AudioApcOption));
APC_HANDLE handle;
#if USE_JSON
if(use_apc_param_json){
if(IaaApc_InitReadFromJson(&apc_init, apc_para_json_buf_ptr, apc_para_json_file, apc_para_buffersize) != 0){
printf("IaaApc_InitReadFromJson() error.\t\n");
return -1;
}
else{
printf("IaaApc_InitReadFromJson() succeed.\t\n");
}
}
#endif
handle = IaaApc_Init((char *)working_buf_ptr, &apc_init, &apc_switch);
if(handle==NULL){
printf("IaaApc_Init() error.\t\n");
return -1;
}
else{
printf("IaaApc_Init() succeed.\t\n");
}
#if USE_JSON
if(use_apc_param_json){
if(IaaApc_ConfigReadFromJson(&anr_config, &eq_config, &hpf_config, &agc_config, apc_para_json_buf_ptr, apc_para_json_file, apc_para_buffersize) != 0){
printf("IaaApc_ConfigReadFromJson() error.\t\n");
return -1;
}
else{
printf("IaaApc_ConfigReadFromJson() succeed.\t\n");
}
}
#endif
if(IaaApc_Config(handle,&anr_config,&eq_config,&hpf_config,NULL,NULL,&agc_config) != -0){
printf("IaaApc_Config() error.\t\n");
return -1;
}
else{
printf("IaaApc_Config() succeed.\t\n");
}
#if USE_JSON
if(apc_switch.anr_enable && use_anr_intl_json){
if(IaaApc_NrReadJson(handle, anr_intl_json_buf_ptr, anr_intl_json_file, anr_intl_buffersize) != 0){
printf("IaaApc_NrReadJson() error.\t\n");
return -1;
}
else{
printf("IaaApc_NrReadJson() succeed.\t\n");
}
}
#endif
#if USE_JSON
if(use_apc_intl_json){
if(IaaApc_ReadJson(handle, apc_intl_json_buf_ptr, apc_intl_json_file, apc_intl_buffersize) != 0){
printf("IaaApc_ReadJson() error.\t\n");
return -1;
}
else{
printf("IaaApc_ReadJson() succeed.\t\n");
}
}
#endif
#if FILTER_ENABLE
float h[512];
#if USE_JSON
if(use_apc_param_json){
if(IaaApc_FilterDesignReadFromJson(handle, apc_para_json_buf_ptr, apc_para_json_file, apc_para_buffersize) != 0){
printf("IaaEq_FilterDesignReadFromJson() error.\t\n");
return -1;
}
else{
printf("IaaEq_FilterDesignReadFromJson() succeed.\t\n");
}
}
#endif
IaaApc_FilterFreqz(handle,h);
#endif
#if FREQ_AGC_ENABEL
if(agc_config.user_mode == 2){
#if USE_JSON
if(use_apc_param_json){
if(IaaApc_SetAgcReadFromJson(&freqBand[0], &compressionRatioArrayLowInput[0], &compressionRatioArrayLowOutput[0],
&compressionRatioArrayMidInput[0], &compressionRatioArrayMidOutput[0],
&compressionRatioArrayHighInput[0], &compressionRatioArrayHighOutput[0],
apc_para_json_buf_ptr, apc_para_json_file, apc_para_buffersize) != 0 ){
printf("IaaAgc_SetAgcReadFromJson() error.\t\n");
return -1;
}
else{
printf("IaaAgc_SetAgcReadFromJson() succeed.\t\n");
}
}
#endif
IaaApc_SetAgcFreqBand(handle, freqBand);
IaaApc_SetLowFreqCompressionRatioCurve(handle, compressionRatioArrayLowInput, compressionRatioArrayLowOutput);
IaaApc_SetMidFreqCompressionRatioCurve(handle, compressionRatioArrayMidInput, compressionRatioArrayMidOutput);
IaaApc_SetHighFreqCompressionRatioCurve(handle, compressionRatioArrayHighInput, compressionRatioArrayHighOutput);
}
#endif
#if DIGITAL_GAIN_ENABLE
#if USE_JSON
if(use_apc_param_json){
if(IaaApc_OptionReadFromJson(&apc_option, apc_para_json_buf_ptr, apc_para_json_file, apc_para_buffersize) != 0){
printf("IaaApc_OptionReadFromJson() error.\t\n");
return -1;
}
else{
printf("IaaApc_OptionReadFromJson() succeed.\t\n");
}
}
#endif
#endif
sprintf(input_file,"%s","./../sample/data/APC_AFE_16K.wav");
sprintf(output_file,"%s","./../sample/data/APC_out_16K.wav");
fin = fopen(input_file, "rb");
if(!fin)
{
printf("the input file %s could not be open\n",input_file);
return -1;
}
fout = fopen(output_file, "wb");
if(!fout)
{
printf("the output file could not be open\n");
return -1;
}
fread(input, sizeof(char), 44, fin); // read header 44 bytes
fwrite(input, sizeof(char),44, fout); // write 44 bytes output
while(fread(input, sizeof(short), apc_init.point_number*apc_init.channel, fin))
{
counter++;
T0 = (long)_OsCounterGetMs();
#if DIGITAL_GAIN_ENABLE
ret1 = IaaApc_ApplyDigitalGain(handle,input,apc_option.digital_gain[0]);
#endif
ret1 = IaaApc_Run(handle,input);
#if FILTER_ENABLE
ret1 += IaaApc_FilterApply(handle, input);
#endif
#if DIGITAL_GAIN_ENABLE
ret1 += IaaApc_ApplyDigitalGain(handle,input,apc_option.digital_gain[1]);
#endif
T1 = (long)_OsCounterGetMs();
avg += (T1 - T0);
if(peak < (T1 - T0))
peak = (T1 - T0);
if(counter%1000== 999)
{
printf("counter = %d\n", counter);
printf("current time = %f\n", (float)counter*apc_init.point_number/apc_init.sample_rate);
printf("process time = %lu(ms)\t",(long)(T1 - T0));
}
if(ret1 != 0)
{
printf("Error occured in APC\n");
break;
}
fwrite(input, sizeof(short), apc_init.point_number*apc_init.channel, fout);
}
avg /= counter;
printf("AVG is %.2f ms\n",avg);
printf("PEAK is %.2f ms\n",peak);
IaaApc_Free(handle);
free(working_buf_ptr);
fclose(fin);
fclose(fout);
#if (ANR_IPU_ENABLE)
MI_SYS_Exit(0);
#endif
printf("Done\n");
return 0;
}
2. API 参考¶
2.1. 功能模块API¶
2.2. IaaApc_GetBufferSize¶
-
功能
获取Apc算法运行所需要的内存大小。
-
语法
unsigned int IaaApc_GetBufferSize(AudioApcBufferConfig *apc_switch); -
形参
参数名称 描述 输入/输出 apc_switch 配置Apc算法启用设置的结构体指针 输入 -
返回值
返回值为Apc算法运行所需要的内存大小
-
依赖
-
头文件: AudioProcess.h
-
库文件: libAPC_LINUX.so/ libAPC_LINUX.a
-
-
注意
该接口仅返回需要的内存大小,来处理申请和释放内存的应用。
-
举例
请参考IaaApc_Run举例部分。
2.3. IaaApc_Init¶
-
功能
初始化Apc算法。
-
语法
APC_HANDLE IaaApc_Init(char* const working_buffer_address,AudioProcessInit *audio_process_init, AudioApcBufferConfig *apc_switch); -
形参
参数名称 描述 输入/输出 working_buffer_address Apc算法所使用的内存地址 输入 audio_process_init Apc算法的初始化结构体指针 输入 apc_switch Apc算法启用结构体指针 输入 -
返回值
返回值 结果 非NULL 成功 NULL 失败 -
依赖
-
头文件: AudioProcess.h
-
库文件: libAPC_LINUX.so/ libAPC_LINUX.a
-
-
注意
- Apc算法中Anr/Agc/Eq/Hpf算法支持8K/16K/32K/48K取样率。
-
举例
请参考IaaApc_Run举例部分。
2.4. IaaApc_Config¶
-
功能
配置Apc算法。
-
语法
ALGO_APC_RET IaaApc_Config(APC_HANDLE handle, AudioAnrConfig *anr_config, AudioEqConfig *eq_config, AudioHpfConfig *hpf_config, AudioVadConfig *vad_config, AudioDereverbConfig *dereverb_config, AudioAgcConfig *agc_config); -
形参
参数名称 描述 输入/输出 handle Apc算法handle 输入 anr_config 配置Anr算法的结构体指针 输入 eq_config 配置Eq算法的结构体指针 输入 hpf_config 配置Hpf算法的结构体指针 输入 vad_config 配置Vad算法的结构体指针(已废弃) 输入 dereverb_config 配置Dereverb算法的结构体指针(已废弃) 输入 agc_config 配置Agc算法的结构体指针 输入 -
返回值
返回值 结果 0 成功 非0 失败,参考错误码 -
依赖
-
头文件: AudioProcess.h
-
库文件: libAPC_LINUX.so/ libAPC_LINUX.a
-
-
注意
无。
-
举例
请参考IaaApc_Run举例部分。
2.5. IaaApc_SetLowFreqCompressionRatioCurve¶
-
功能
配置Apc中Agc算法分频段压缩率曲线(低频),请先设定Agc的user_mode为2再使用此函式,否则会回传错误。
-
语法
ALGO_APC_RET IaaApc_SetLowFreqCompressionRatioCurve(APC_HANDLE handle, int* CompressRatioInput, int* CompressRatioOutput); -
形参
参数名称 描述 输入/输出 handle Apc算法handle 输入 CompressRatioInput 压缩率输入,请参考agc_config中的compression ratio 输入 CompressRatioOutput 压缩率输出,请参考agc_config中的compression ratio 输入 -
返回值
返回值 结果 0 成功 非0 失败,参考错误码 -
依赖
-
头文件: AudioProcess.h
-
库文件: libAPC_LINUX.so/ libAPC_LINUX.a
-
-
举例
请参考IaaApc_Run举例部分。
2.6. IaaApc_SetMidFreqCompressionRatioCurve¶
-
功能
配置Apc中Agc算法分频段压缩率曲线(中频),请先设定Agc的user_mode为2再使用此函式,否则会回传错误。
-
语法
ALGO_APC_RET IaaApc_SetMidFreqCompressionRatioCurve(APC_HANDLE handle, int* CompressRatioInput, int* CompressRatioOutput); -
形参
参数名称 描述 输入/输出 handle Apc算法handle 输入 CompressRatioInput 压缩率输入,请参考agc_config中的compression ratio 输入 CompressRatioOutput 压缩率输出,请参考agc_config中的compression ratio 输入 -
返回值
返回值 结果 0 成功 非0 失败,参考错误码 -
依赖
-
头文件: AudioProcess.h
-
库文件: libAPC_LINUX.so/ libAPC_LINUX.a
-
-
举例
请参考IaaApc_Run举例部分。
2.7. IaaApc_SetHighFreqCompressionRatioCurve¶
-
功能
配置Apc中Agc算法分频段压缩率曲线(高频),请先设定Agc的user_mode为2再使用此函式,否则会回传错误。
-
语法
ALGO_APC_RET IaaApc_SetHighFreqCompressionRatioCurve(APC_HANDLE handle, int* CompressRatioInput, int* CompressRatioOutput); -
形参
参数名称 描述 输入/输出 handle Apc算法handle 输入 CompressRatioInput 压缩率输入,请参考agc_config中的compression ratio 输入 CompressRatioOutput 压缩率输出,请参考agc_config中的compression ratio 输入 -
返回值
返回值 结果 0 成功 非0 失败,参考错误码 -
依赖
-
头文件: AudioProcess.h
-
库文件: libAPC_LINUX.so/ libAPC_LINUX.a
-
-
举例
请参考IaaApc_Run举例部分。
2.8. IaaApc_SetAgcFreqBand¶
-
功能
配置Apc中Agc算法分频段之频率,请先设定Agc的user_mode为2再使用此函式,否则会回传错误。
-
语法
ALGO_APC_RET IaaApc_ SetAgcFreqBand(APC_HANDLE handle, int* frequency_band); -
形参
参数名称 描述 输入/输出 handle Apc算法handle 输入 frequency_band 频段数组,包含低频段上限频率,中频段上限频率,高段频段上限频率。
举例: 当取样率为16K,frequency_band若设定为{3000,4000,8000}
则低频频段为03000Hz,中频为30004000Hz,高频为4000~8000Hz,须注意最高频率不能超过取样率的一半。输入 -
返回值
返回值 结果 0 成功 非0 失败,参考错误码 -
依赖
-
头文件: AudioProcess.h
-
库文件: libAPC_LINUX.so/ libAPC_LINUX.a
-
-
举例
请参考IaaApc_Run举例部分。
2.9. IaaApc_GetNrResult¶
-
功能
获取Apc算法中Anr的处理结果。
-
语法
ALGO_APC_RET IaaApc_GetNrResult(APC_HANDLE handle, short*nr_audio_out); -
形参
参数名称 描述 输入/输出 handle Apc算法handle 输入 nr_audio_out Anr处理输出数据指针 输出 -
返回值
返回值 结果 0 成功 非0 失败,参考错误码 -
依赖
-
头文件: AudioProcess.h
-
库文件: libAPC_LINUX.so/ libAPC_LINUX.a
-
-
注意
- 必须启用Apc算法中的Anr,才能调用此接口获取数据。
-
举例
请参考IaaApc_Run举例部分。
2.10. IaaApc_GetNrEqResult¶
-
功能
获取Apc算法中Anr和Eq的处理结果
-
语法
ALGO_APC_RET IaaApc_GetNrEqResult(APC_HANDLE handle,short*nr_eq_audio_out); -
形参
参数名称 描述 输入/输出 handle Apc算法handle 输入 nr_eq_audio_out Anr和Eq处理输出数据指针 输出 -
返回值
返回值 结果 0 成功 非0 失败,参考错误码 -
依赖
-
头文件: AudioProcess.h
-
库文件: libAPC_LINUX.so/ libAPC_LINUX.a
-
-
注意
- 必须启用Apc算法中的Anr和Eq,才能调用此接口获取数据。
-
举例
请参考IaaApc_Run举例部分。
2.11. IaaApc_GetVadOut¶
-
功能
获取Apc算法中Anr计算当前输入讯号是语音的机率大小
-
语法
ALGO_APC_RET IaaApc_GetVadOut(APC_HANDLE handle, int* speech_probability); -
形参
参数名称 描述 输入/输出 handle Apc算法handle 输入 speech_probability Anr处理输出语音机率数据指针,范围:[0,100] 输出 -
返回值
返回值 结果 0 成功 非0 失败,参考错误码 -
依赖
-
头文件: AudioProcess.h
-
库文件: libAPC_LINUX.so/ libAPC_LINUX.a
-
-
注意
-
必须启用Apc算法中的Anr,才能调用此接口获取数据。
-
speech_probability为调用IaaApc_Run中输入讯号pss_audio_in(输入讯号大小为256 bytes)是语音的机率大小。
-
-
举例
请参考IaaApc_Run举例部分。
2.12. IaaApc_Run¶
-
功能
Apc算法处理
-
语法
ALGO_APC_RET IaaApc_Run(APC_HANDLE handle,short* pss_audio_in); -
形参
参数名称 描述 输入/输出 handle Apc算法handle 输入 pss_audio_in 输入数据指针 输入/输出 -
返回值
返回值 结果 0 成功 非0 失败,参考错误码 -
依赖
-
头文件: AudioProcess.h
-
库文件: libAPC_LINUX.so/ libAPC_LINUX.a
-
-
注意
- 数据长度必须和调用IaaApc_Init时设定的point_number(一次IaaApc_Run所需要的采样点数)相对应,处理后的数据会回写到pss_audio_in所指向的内存中。
-
举例
- 请参考实例介绍
2.13. IaaApc_Free¶
-
功能
释放Apc算法资源
-
语法
ALGO_APC_RET IaaApc_Free(APC_HANDLE handle); -
形参
参数名称 描述 输入/输出 handle Apc算法handle 输入 -
返回值
返回值 结果 0 成功 非0 失败,参考错误码 -
依赖
-
头文件: AudioProcess.h
-
库文件: libAPC_LINUX.so/ libAPC_LINUX.a
-
-
注意
无。
-
举例
请参考IaaApc_Run举例部分。
2.14. IaaApc_Reset¶
-
功能
重新初始化Apc算法
-
语法
APC_HANDLE IaaApc_Reset(char* working_buffer_address,AudioProcessInit *audio_process_init, AudioApcBufferConfig *apc_switch); -
形参
参数名称 描述 输入/输出 working_buffer_address Apc算法运行所使用的内存地址 输入 audio_process_init Apc算法的初始化结构体指针 输入 apc_switch 配置Apc算法启用设置的结构体指针 输入 -
返回值
返回值 结果 非NULL 成功 NULL 失败 -
依赖
-
头文件: AudioProcess.h
-
库文件: libAPC_LINUX.so/ libAPC_LINUX.a
-
-
注意
当重新初始化Apc算法且使用的功能选项与之前不同时,需要释放掉原来算法运行所使用的内存,重新调用IaaApc_GetBufferSize获取当前功能选项所需要的内存大小,重新申请相应大小的内存供Apc算法使用。
-
举例
无。
2.15. IaaApc_GetConfig¶
-
功能
获取Apc算法的当前配置参数
-
语法
ALGO_APC_RET IaaApc_GetConfig(APC_HANDLE handle, AudioProcessInit *audio_process_init, AudioAnrConfig *anr_config, AudioEqConfig *eq_config, AudioHpfConfig *hpf_config, AudioVadConfig *vad_config, AudioDereverbConfig *dereverb_config, AudioAgcConfig *agc_config); -
形参
参数名称 描述 输入/输出 handle Apc算法handle 输入 audio_process_init Apc算法的初始化结构体指针 输出 anr_config Apc算法中当前Anr的配置参数 输出 eq_config Apc算法中当前Eq的配置参数 输出 hpf_config Apc算法中当前Hpf的配置参数 输出 vad_config Apc算法中当前Vad的配置参数(已废弃) 输出 dereverb_config Apc算法中当前Dereverb的配置参数(已废弃) 输出 agc_config Apc算法中当前Agc的配置参数 输出 -
返回值
返回值 结果 0 成功 非0 失败,参考错误码 -
依赖
-
头文件: AudioProcess.h
-
库文件: libAPC_LINUX.so/ libAPC_LINUX.a
-
-
注意
无。
-
举例
请参考IaaApc_Run举例部分。
2.16. IaaApc_ApplyDigitalGain¶
-
功能
对输入数据做增益或衰减
-
语法
ALGO_APC_RET IaaApc_ApplyDigitalGain(APC_HANDLE handle, short* pss_audio_in, float gain_value); -
形参
参数名称 描述 输入/输出 handle Apc算法handle 输入 pss_audio_in 输入数据指针 输入/输出 gain_value 增益/衰减值
范围: [-120,120]输入 -
返回值
返回值 结果 0 成功 非0 失败,参考错误码 -
依赖
-
头文件: AudioProcess.h
-
库文件: libAPC_LINUX.so/ libAPC_LINUX.a
-
2.17. IaaAnr_GetBufferSize¶
-
功能
获取Anr算法运行所需要的内存大小。
-
语法
unsigned int IaaAnr_GetBufferSize(void); -
形参
参数名称 描述 输入/输出 -
返回值
返回值为Anr算法运行所需要的内存大小
-
依赖
-
头文件: AudioProcess.h
-
库文件: libAPC_LINUX.so/ libAPC_LINUX.a
-
-
注意
该接口仅返回需要的内存大小,来处理申请和释放内存的应用。
-
举例
请参考IaaAnr_Run举例部分。
2.18. IaaAnr_Init¶
-
功能
初始化Anr算法。
-
语法
ANR_HANDLE IaaAnr_Init(char* working_buffer_address, AudioProcessInit *anr_init); -
形参
参数名称 描述 输入/输出 working_buffer_address Anr算法所使用的内存地址 输入 anr_init Anr算法的初始化结构体指针 输入 -
返回值
返回值 结果 非NULL 成功 NULL 失败 -
依赖
-
头文件: AudioProcess.h
-
库文件: libAPC_LINUX.so/ libAPC_LINUX.a
-
-
注意
- Anr算法支持8K/16K/32K/48K取样率。
-
举例
请参考IaaAnr_Run举例部分。
2.19. IaaAnr_Config¶
-
功能
配置Anr算法。
-
语法
ALGO_ANR_RET IaaAnr_Config(ANR_HANDLE handle, AudioAnrConfig *anr_config); -
形参
参数名称 描述 输入/输出 handle Anr算法handle 输入 anr_config Anr算法的配置结构体指针 输入 -
返回值
返回值 结果 0 成功 非0 失败,参考错误码 -
依赖
-
头文件: AudioProcess.h
-
库文件: libAPC_LINUX.so/ libAPC_LINUX.a
-
-
注意
无。
-
举例
请参考IaaAnr_Run举例部分。
2.20. IaaAnr_Run¶
-
功能
Anr算法处理
-
语法
ALGO_ANR_RET IaaAnr_Run(ANR_HANDLE handle, short* pss_audio_in); -
形参
参数名称 描述 输入/输出 handle Anr算法handle 输入 pss_audio_in 输入数据指针 输入/输出 -
返回值
返回值 结果 0 成功 非0 失败,参考错误码 -
依赖
-
头文件: AudioProcess.h
-
库文件: libAPC_LINUX.so/ libAPC_LINUX.a
-
-
注意
- 数据长度必须和调用IaaAnr_Init时设定的point_number(一次IaaAnr_Run所需要的采样点数)相对应,处理后的数据会回写到pss_audio_in所指向的内存中。
-
举例
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <sys/time.h> #include "AudioProcess.h" /* 0:Fixed input file 1:User input file */ #define IN_PARAMETER 1 int main(int argc, char *argv[]) { short in_output[1024]; unsigned int workingBufferSize; char *workingBuffer = NULL; ANR_HANDLE handle; AudioProcessInit anr_init, anr_get_init; AudioAnrConfig anr_config, anr_get_config; ALGO_APC_RET ret; int tempSize; FILE* fpIn; //input file FILE* fpOut; //output file char src_file[128] = {0}; char dst_file[128] = {0}; /*********************User change section start*******************/ int intensity_band[6] = {3,24,40,64,80,128}; int intensity[7] = {30,30,30,30,30,30,30}; anr_init.point_number = 128; anr_init.channel = 1; anr_init.sample_rate = IAA_APC_SAMPLE_RATE_16000; anr_config.anr_enable = 1; anr_config.user_mode = 2; anr_config.anr_filter_mode = 4; anr_config.anr_smooth_level = 10; anr_config.anr_converge_speed = 2; /*********************User change section end*******************/ memcpy(anr_config.anr_intensity_band, intensity_band, sizeof(intensity_band)); memcpy(anr_config.anr_intensity, intensity, sizeof(intensity)); //(1)IaaAnr_GetBufferSize workingBufferSize = IaaAnr_GetBufferSize(); workingBuffer = (char *)malloc(workingBufferSize); if(NULL == workingBuffer) { printf("malloc workingBuffer failed !\n"); return -1; } printf("malloc workingBuffer succeed !\n"); //(2)IaaAnr_Init handle = IaaAnr_Init(workingBuffer, &anr_init); if(NULL == handle) { printf("IaaAnr_Init failed !\n"); return -1; } printf("IaaAnr_Init succeed !\n"); //(3)IaaAnr_Config ret = IaaAnr_Config(handle, &anr_config); if(ret) { printf("IaaAnr_Config failed !\n"); return -1; } printf("IaaAnr_Config succeed !\n"); //(4)IaaAnr_GetConfig ret = IaaAnr_GetConfig(handle, &anr_get_init, &anr_get_config); if(ret) { printf("IaaAnr_GetConfig failed !\n"); return -1; } printf("IaaAnr_GetConfig succeed !\n"); printf("anr_get_config.user_mode = %d, ...\n", anr_get_config.user_mode); #if IN_PARAMETER if(argc < 3) { printf("Please enter the correct parameters!\n"); return -1; } sscanf(argv[1], "%s", src_file); sscanf(argv[2], "%s", dst_file); #else sprintf(src_file, "%s", "./APC_AFE_16K.wav"); if(argc < 2) { printf("Please enter the correct parameters!\n"); return -1; } sscanf(argv[1], "%s", dst_file); #endif fpIn = fopen(src_file, "rb"); if(NULL == fpIn) { printf("fopen in_file failed !\n"); return -1; } printf("fopen in_file success !\n"); fpOut = fopen(dst_file, "wb"); if(NULL == fpOut) { printf("fopen out_file failed !\n"); return -1; } printf("fopen out_file success !\n"); #if 1 fread(in_output, sizeof(char), 44, fpIn); fwrite(in_output, sizeof(char), 44, fpOut); #endif tempSize = anr_init.point_number * anr_init.channel; while(tempSize == fread(in_output, sizeof(short), tempSize, fpIn)) { //(5)IaaAnr_Run ret = IaaAnr_Run(handle, in_output); if(ret) { printf("IaaAnr_Run failed !\n"); return -1; } fwrite(in_output, sizeof(short), tempSize, fpOut); } printf("Break:needBytes =%d \t nBytesRead = %d\n", anr_init.point_number * anr_init.channel, tempSize); //(6)IaaAnr_Free IaaAnr_Free(handle); free(workingBuffer); fclose(fpIn); fclose(fpOut); printf("APC_ANR end !\n"); return 0; }
2.21. IaaAnr_Free¶
-
功能
释放Anr算法资源
-
语法
ALGO_APC_RET IaaAnr_Free(ANR_HANDLE handle); -
形参
参数名称 描述 输入/输出 handle Anr算法handle 输入 -
返回值
返回值 结果 0 成功 非0 失败,参考错误码 -
依赖
-
头文件: AudioProcess.h
-
库文件: libAPC_LINUX.so/ libAPC_LINUX.a
-
-
注意
无。
-
举例
请参考IaaAnr_Run举例部分。
2.22. IaaAnr_Reset¶
-
功能
重新初始化Anr算法
-
语法
ANR_HANDLE IaaAnr_Reset(char* working_buffer_address, AudioProcessInit *anr_init); -
形参
参数名称 描述 输入/输出 working_buffer_address Anr算法运行所使用的内存地址 输入 anr_init Anr算法的初始化结构体指针 输入 -
返回值
返回值 结果 非NULL 成功 NULL 失败 -
依赖
-
头文件: AudioProcess.h
-
库文件: libAPC_LINUX.so/ libAPC_LINUX.a
-
-
注意
无。
-
举例
无。
2.23. IaaAnr_GetConfig¶
-
功能
获取Anr算法的当前配置参数
-
语法
ALGO_ANR_RET IaaAnr_GetConfig(ANR_HANDLE handle, AudioProcessInit *anr_init, AudioAnrConfig *anr_config); -
形参
参数名称 描述 输入/输出 handle Anr算法handle 输入 anr_init Anr算法的初始化结构体指针 输出 anr_config Anr算法中当前的配置参数 输出 -
返回值
返回值 结果 0 成功 非0 失败,参考错误码 -
依赖
-
头文件: AudioProcess.h
-
库文件: libAPC_LINUX.so/ libAPC_LINUX.a
-
-
注意
无。
-
举例
请参考IaaAnr_Run举例部分。
2.24. IaaEq_GetBufferSize¶
-
功能
获取Eq算法运行所需要的内存大小。
-
语法
unsigned int IaaEq_GetBufferSize(void); -
形参
参数名称 描述 输入/输出 -
返回值
返回值为Eq算法运行所需要的内存大小
-
依赖
-
头文件: AudioProcess.h
-
库文件: libAPC_LINUX.so/ libAPC_LINUX.a
-
-
注意
该接口仅返回需要的内存大小,来处理申请和释放内存的应用。
-
举例
请参考IaaEq_Run举例部分。
2.25. IaaEq_Init¶
-
功能
初始化Eq算法。
-
语法
EQ_HANDLE IaaEq_Init(char* working_buffer_address, AudioProcessInit *eq_init); -
形参
参数名称 描述 输入/输出 working_buffer_address Eq算法所使用的内存地址 输入 eq_init Eq算法的初始化结构体指针 输入 -
返回值
返回值 结果 非NULL 成功 NULL 失败 -
依赖
-
头文件: AudioProcess.h
-
库文件: libAPC_LINUX.so/ libAPC_LINUX.a
-
-
注意
- Eq/Hpf算法支持8K/16K/32K/48K取样率。
-
举例
请参考IaaEq_Run举例部分。
2.26. IaaEq_Config¶
-
功能
配置Eq算法。
-
语法
ALGO_EQ_RET IaaEq_Config(EQ_HANDLE handle, AudioHpfConfig *hpf_config, AudioEqConfig *eq_config); -
形参
参数名称 描述 输入/输出 handle Eq算法handle 输入 hpf_config Hpf算法的配置结构体指针 输入 eq_config Eq算法的配置结构体指针 输入 -
返回值
返回值 结果 0 成功 非0 失败,参考错误码 -
依赖
-
头文件: AudioProcess.h
-
库文件: libAPC_LINUX.so/ libAPC_LINUX.a
-
-
注意
无。
-
举例
请参考IaaEq_Run举例部分。
2.27. IaaEq_Run¶
-
功能
Eq算法处理
-
语法
ALGO_EQ_RET IaaEq_Run(EQ_HANDLE handle, short* pss_audio_in); -
形参
参数名称 描述 输入/输出 handle Eq算法handle 输入 pss_audio_in 输入数据指针 输入/输出 -
返回值
返回值 结果 0 成功 非0 失败,参考错误码 -
依赖
-
头文件: AudioProcess.h
-
库文件: libAPC_LINUX.so/ libAPC_LINUX.a
-
-
注意
- 数据长度必须和调用IaaEq_Init 时设定的point_number(一次IaaEq_Run所需要的采样点数)相对应,处理后的数据会回写到pss_audio_in所指向的内存中。
-
举例
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <sys/time.h> #include "AudioProcess.h" /* 0:Fixed input file 1:User input file */ #define IN_PARAMETER 1 int main(int argc, char *argv[]) { short in_output[1024]; unsigned int workingBufferSize; char *workingBuffer = NULL; EQ_HANDLE handle; AudioProcessInit eq_init, eq_get_init; AudioHpfConfig hpf_config, hpf_get_config; AudioEqConfig eq_config, eq_get_config; ALGO_APC_RET ret; int tempSize; FILE* fpIn; //input file FILE* fpOut; //output file char src_file[128] = {0}; char dst_file[128] = {0}; /*********************User change section start*******************/ short eq_table[129]; memset(eq_table, 0, sizeof(eq_table)); eq_init.point_number = 128; eq_init.channel = 1; eq_init.sample_rate = IAA_APC_SAMPLE_RATE_16000; hpf_config.hpf_enable = 1; hpf_config.user_mode = 1; hpf_config.cutoff_frequency = AUDIO_HPF_FREQ_150; eq_config.eq_enable = 1; eq_config.user_mode = 1; /*********************User change section end*******************/ memcpy(eq_config.eq_gain_db, eq_table, sizeof(eq_table)); //(1)IaaEq_GetBufferSize workingBufferSize = IaaEq_GetBufferSize(); workingBuffer = (char *)malloc(workingBufferSize); if(NULL == workingBuffer) { printf("malloc workingBuffer failed !\n"); return -1; } printf("malloc workingBuffer succeed !\n"); //(2)IaaEq_Init handle = IaaEq_Init(workingBuffer, &eq_init); if(NULL == handle) { printf("IaaEq_Init failed !\n"); return -1; } printf("IaaEq_Init succeed !\n"); //(3)IaaEq_Config ret = IaaEq_Config(handle, &hpf_config, &eq_config); if(ret) { printf("IaaEq_Config failed !\n"); return -1; } printf("IaaEq_Config succeed !\n"); //(4)IaaEq_GetConfig ret = IaaEq_GetConfig(handle, &eq_get_init, &hpf_get_config, &eq_get_config); if(ret) { printf("IaaEq_GetConfig failed !\n"); return -1; } printf("IaaEq_GetConfig succeed !\n"); printf("eq_get_config.user_mode = %d, ...\n", eq_get_config.user_mode); #if IN_PARAMETER if(argc < 3) { printf("Please enter the correct parameters!\n"); return -1; } sscanf(argv[1], "%s", src_file); sscanf(argv[2], "%s", dst_file); #else sprintf(src_file, "%s", "./APC_AFE_16K.wav"); if(argc < 2) { printf("Please enter the correct parameters!\n"); return -1; } sscanf(argv[1], "%s", dst_file); #endif fpIn = fopen(src_file, "rb"); if(NULL == fpIn) { printf("fopen in_file failed !\n"); return -1; } printf("fopen in_file success !\n"); fpOut = fopen(dst_file, "wb"); if(NULL == fpOut) { printf("fopen out_file failed !\n"); return -1; } printf("fopen out_file success !\n"); #if 1 fread(in_output, sizeof(char), 44, fpIn); fwrite(in_output, sizeof(char), 44, fpOut); #endif tempSize = eq_init.point_number * eq_init.channel; while(tempSize == fread(in_output, sizeof(short), tempSize, fpIn)) { //(5)IaaEq_Run ret = IaaEq_Run(handle, in_output); if(ret) { printf("IaaEq_Run failed !\n"); return -1; } fwrite(in_output, sizeof(short), tempSize, fpOut); } printf("Break:needBytes =%d \t nBytesRead = %d\n", eq_init.point_number * eq_init.channel, tempSize); //(6)IaaEq_Free IaaEq_Free(handle); free(workingBuffer); fclose(fpIn); fclose(fpOut); printf("APC_EQ end !\n"); return 0; }
2.28. IaaEq_Free¶
-
功能
释放Eq算法资源
-
语法
ALGO_EQ_RET IaaEq_Free(EQ_HANDLE handle); -
形参
参数名称 描述 输入/输出 handle Eq算法handle 输入 -
返回值
返回值 结果 0 成功 非0 失败,参考错误码 -
依赖
-
头文件: AudioProcess.h
-
库文件: libAPC_LINUX.so/ libAPC_LINUX.a
-
-
注意
无。
-
举例
请参考IaaEq_Run举例部分。
2.29. IaaEq_Reset¶
-
功能
重新初始化Eq算法
-
语法
EQ_HANDLE IaaEq_Reset(char* working_buffer_address, AudioProcessInit *eq_init); -
形参
参数名称 描述 输入/输出 working_buffer_address Eq算法运行所使用的内存地址 输入 eq_init Eq算法的初始化结构体指针 输入 -
返回值
返回值 结果 非NULL 成功 NULL 失败 -
依赖
-
头文件: AudioProcess.h
-
库文件: libAPC_LINUX.so/ libAPC_LINUX.a
-
-
注意
无。
-
举例
无。
2.30. IaaEq_GetConfig¶
-
功能
获取Eq算法的当前配置参数
-
语法
ALGO_EQ_RET IaaEq_GetConfig(EQ_HANDLE handle, AudioProcessInit *eq_init, AudioHpfConfig *hpf_config, AudioEqConfig *eq_config); -
形参
参数名称 描述 输入/输出 handle Eq算法handle 输入 eq_init Eq算法的初始化结构体指针 输出 hpf_config Hpf算法中当前的配置参数 输出 eq_config Eq算法中当前的配置参数 输出 -
返回值
返回值 结果 0 成功 非0 失败,参考错误码 -
依赖
-
头文件: AudioProcess.h
-
库文件: libAPC_LINUX.so/ libAPC_LINUX.a
-
-
注意
无。
-
举例
请参考IaaEq_Run举例部分。
2.31. IaaAgc_GetBufferSize¶
-
功能
获取Agc算法运行所需要的内存大小。
-
语法
unsigned int IaaAgc_GetBufferSize(void); -
形参
参数名称 描述 输入/输出 -
返回值
返回值为Agc算法运行所需要的内存大小
-
依赖
-
头文件: AudioProcess.h
-
库文件: libAPC_LINUX.so/ libAPC_LINUX.a
-
-
注意
该接口仅返回需要的内存大小,来处理申请和释放内存的应用。
-
举例
请参考IaaAgc_Run举例部分。
2.32. IaaAgc_Init¶
-
功能
初始化Agc算法。
-
语法
AGC_HANDLE IaaAgc_Init(char* working_buffer_address, AudioProcessInit *agc_init); -
形参
参数名称 描述 输入/输出 working_buffer_address Agc算法所使用的内存地址 输入 agc_init Agc算法的初始化结构体指针 输入 -
返回值
返回值 结果 非NULL 成功 NULL 失败 -
依赖
-
头文件: AudioProcess.h
-
库文件: libAPC_LINUX.so/ libAPC_LINUX.a
-
-
注意
- Agc算法支持8K/16K/32K/48K取样率。
-
举例
请参考IaaAgc_Run举例部分。
2.33. IaaAgc_Config¶
-
功能
配置Agc算法。
-
语法
ALGO_AGC_RET IaaAgc_Config(AGC_HANDLE handle, AudioAgcConfig *agc_config); -
形参
参数名称 描述 输入/输出 handle Agc算法handle 输入 agc_config Agc算法的配置结构体指针 输入 -
返回值
返回值 结果 0 成功 非0 失败,参考错误码 -
依赖
-
头文件: AudioProcess.h
-
库文件: libAPC_LINUX.so/ libAPC_LINUX.a
-
-
注意
无。
-
举例
请参考IaaAgc_Run举例部分。
2.34. IaaAgc_SetLowFreqCompressionRatioCurve¶
-
功能
配置Agc算法分频段压缩率曲线(低频),请先设定Agc的user_mode为2再使用此函式,否则会回传错误。
-
语法
ALGO_AGC_RET IaaAgc_SetLowFreqCompressionRatioCurve(AGC_HANDLE handle, int* CompressRatioInput, int* CompressRatioOutput); -
形参
参数名称 描述 输入/输出 handle Agc算法handle 输入 CompressRatioInput 压缩率输入,请参考agc_config中的compression ratio 输入 CompressRatioOutput 压缩率输出,请参考agc_config中的compression ratio 输入 -
返回值
返回值 结果 0 成功 非0 失败,参考错误码 -
依赖
-
头文件: AudioProcess.h
-
库文件: libAPC_LINUX.so/ libAPC_LINUX.a
-
-
举例
请参考IaaAgc_Run举例部分。
2.35. IaaAgc_SetMidFreqCompressionRatioCurve¶
-
功能
配置Agc算法分频段压缩率曲线(中频),请先设定Agc的user_mode为2再使用此函式,否则会回传错误。
-
语法
ALGO_AGC_RET IaaAgc_SetMidFreqCompressionRatioCurve(AGC_HANDLE handle, int* CompressRatioInput, int* CompressRatioOutput); -
形参
参数名称 描述 输入/输出 handle Agc算法handle 输入 CompressRatioInput 压缩率输入,请参考agc_config中的compression ratio 输入 CompressRatioOutput 压缩率输出,请参考agc_config中的compression ratio 输入 -
返回值
返回值 结果 0 成功 非0 失败,参考错误码 -
依赖
-
头文件: AudioProcess.h
-
库文件: libAPC_LINUX.so/ libAPC_LINUX.a
-
-
举例
请参考IaaAgc_Run举例部分。
2.36. IaaAgc_SetHighFreqCompressionRatioCurve¶
-
功能
配置Agc算法分频段压缩率曲线(高频),请先设定Agc的user_mode为2再使用此函式,否则会回传错误。
-
语法
ALGO_AGC_RET IaaAgc_SetHighFreqCompressionRatioCurve(AGC_HANDLE handle, int* CompressRatioInput, int* CompressRatioOutput); -
形参
参数名称 描述 输入/输出 handle Agc算法handle 输入 CompressRatioInput 压缩率输入,请参考agc_config中的compression ratio 输入 CompressRatioOutput 压缩率输出,请参考agc_config中的compression ratio 输入 -
返回值
返回值 结果 0 成功 非0 失败,参考错误码 -
依赖
-
头文件: AudioProcess.h
-
库文件: libAPC_LINUX.so/ libAPC_LINUX.a
-
-
举例
请参考IaaAgc_Run举例部分。
2.37. IaaAgc_SetAgcFreqBand¶
-
功能
配置Agc算法分频段之频率,请先设定Agc的user_mode为2再使用此函式,否则会回传错误。
-
语法
ALGO_AGC_RET IaaAgc_SetAgcFreqBand(AGC_HANDLE handle, int* frequency_band); -
形参
参数名称 描述 输入/输出 handle Agc算法handle 输入 frequency_band 频段数组,包含低频段上限频率,中频段上限频率,高段频段上限频率。
举例 : 当取样率为16K,frequency_band若设定为{3000,4000,8000}
则低频频段为03000Hz,中频为30004000 Hz,高频为4000~8000 Hz,须注意最高频率不能超过取样率的一半。输入 -
返回值
返回值 结果 0 成功 非0 失败,参考错误码 -
依赖
-
头文件: AudioProcess.h
-
库文件: libAPC_LINUX.so/ libAPC_LINUX.a
-
-
举例
请参考IaaAgc_Run举例部分。
2.38. IaaAgc_Run¶
-
功能
Agc算法处理
-
语法
ALGO_AGC_RET IaaAgc_Run(AGC_HANDLE handle, short* pss_audio_in); -
形参
参数名称 描述 输入/输出 handle Agc算法handle 输入 pss_audio_in 输入数据指针 输入/输出 -
返回值
返回值 结果 0 成功 非0 失败,参考错误码 -
依赖
-
头文件: AudioProcess.h
-
库文件: libAPC_LINUX.so/ libAPC_LINUX.a
-
-
注意
- 数据长度必须和调用IaaAgc_Init 时设定的point_number(一次IaaAgc_Run所需要的采样点数)相对应,处理后的数据会回写到pss_audio_in所指向的内存中。
-
举例
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <sys/time.h> #include "AudioProcess.h" /* 0:Fixed input file 1:User input file */ #define IN_PARAMETER 1 int main(int argc, char *argv[]) { short in_output[1024]; unsigned int workingBufferSize; char *workingBuffer = NULL; AGC_HANDLE handle; AudioProcessInit agc_init, agc_get_init; AudioAgcConfig agc_config, agc_get_config; ALGO_APC_RET ret; int tempSize; FILE* fpIn; //input file FILE* fpOut; //output file char src_file[128] = {0}; char dst_file[128] = {0}; /*********************User change section start*******************/ short compression_ratio_input[7] = {-65,-55,-48,-25,-18,-12,0}; short compression_ratio_output[7] = {-65,-50,-27,-12,-1,-1,-1}; int freqBand[7] = {1000,6000,8000}; int compressionRatioArrayLowInput[7] = {-65,-55,-48,-25,-18,-12,0}; int compressionRatioArrayLowOutput [7] = {-65,-50,-27,-12,-1,-1,-1}; int compressionRatioArrayMidInput [7] = {-65,-55,-48,-25,-18,-12,0}; int compressionRatioArrayMidOutput [7] = {-65,-50,-27,-12,-1,-1,-1}; int compressionRatioArrayHighInput [7] = {-65,-55,-48,-25,-18,-12,0}; int compressionRatioArrayHighOutput [7] = {-65,-50,-27,-12,-1,-1,-1}; agc_init.point_number = 128; agc_init.channel = 1; agc_init.sample_rate = IAA_APC_SAMPLE_RATE_16000; agc_config.agc_enable = 1; agc_config.user_mode = 2; agc_config.gain_info.gain_max = 40; agc_config.gain_info.gain_min = -10; agc_config.gain_info.gain_init = 12; agc_config.drop_gain_max = 36; agc_config.drop_gain_step = 1; agc_config.attack_time = 1; agc_config.release_time = 1; agc_config.noise_gate_db = -80; agc_config.noise_gate_attenuation_db = 0; agc_config.drop_gain_threshold = -5; /*********************User change section end*******************/ memcpy(agc_config.compression_ratio_input, compression_ratio_input, sizeof(compression_ratio_input)); memcpy(agc_config.compression_ratio_output, compression_ratio_output, sizeof(compression_ratio_output)); //(1)IaaAgc_GetBufferSize workingBufferSize = IaaAgc_GetBufferSize(); workingBuffer = (char *)malloc(workingBufferSize); if(NULL == workingBuffer) { printf("malloc workingBuffer failed !\n"); return -1; } printf("malloc workingBuffer succeed !\n"); //(2)IaaAgc_Init handle = IaaAgc_Init(workingBuffer, &agc_init); if(NULL == handle) { printf("IaaAgc_Init failed !\n"); return -1; } printf("IaaAgc_Init succeed !\n"); //(3)IaaAgc_Config ret = IaaAgc_Config(handle, &agc_config); if(ret) { printf("IaaAgc_Config failed !\n"); return -1; } printf("IaaAgc_Config succeed !\n"); IaaAgc_SetAgcFreqBand(handle, freqBand); IaaAgc_SetLowFreqCompressionRatioCurve(handle,compressionRatioArrayLowInput, compressionRatioArrayLowOutput); IaaAgc_SetMidFreqCompressionRatioCurve(handle,compressionRatioArrayMidInput, compressionRatioArrayMidOutput); IaaAgc_SetHighFreqCompressionRatioCurve(handle,compressionRatioArrayHighInput, compressionRatioArrayHighOutput); //(4)IaaAgc_GetConfig ret = IaaAgc_GetConfig(handle, &agc_get_init, &agc_get_config); if(ret) { printf("IaaAgc_GetConfig failed !\n"); return -1; } printf("IaaAgc_GetConfig succeed !\n"); printf("agc_get_config.user_mode = %d, ...\n", agc_get_config.user_mode); #if IN_PARAMETER if(argc < 3) { printf("Please enter the correct parameters!\n"); return -1; } sscanf(argv[1], "%s", src_file); sscanf(argv[2], "%s", dst_file); #else sprintf(src_file, "%s", "./APC_AFE_16K.wav"); if(argc < 2) { printf("Please enter the correct parameters!\n"); return -1; } sscanf(argv[1], "%s", dst_file); #endif fpIn = fopen(src_file, "rb"); if(NULL == fpIn) { printf("fopen in_file failed !\n"); return -1; } printf("fopen in_file success !\n"); fpOut = fopen(dst_file, "wb"); if(NULL == fpOut) { printf("fopen out_file failed !\n"); return -1; } printf("fopen out_file success !\n"); fread(in_output, sizeof(char), 44, fpIn); fwrite(in_output, sizeof(char), 44, fpOut); tempSize = agc_init.point_number * agc_init.channel; while(tempSize == fread(in_output, sizeof(short), tempSize, fpIn)) { //(5)IaaAgc_Run ret = IaaAgc_Run(handle, in_output); if(ret) { printf("IaaAnr_Run failed !\n"); return -1; } fwrite(in_output, sizeof(short), tempSize, fpOut); } printf("Break:needBytes =%d \t nBytesRead = %d\n", agc_init.point_number * agc_init.channel, tempSize); //(6)IaaAgc_Free IaaAgc_Free(handle); free(workingBuffer); fclose(fpIn); fclose(fpOut); printf("APC_AGC end !\n"); return 0; }
2.39. IaaAgc_Free¶
-
功能
释放Agc算法资源
-
语法
ALGO_AGC_RET IaaAgc_Free(AGC_HANDLE handle); -
形参
参数名称 描述 输入/输出 handle Agc算法handle 输入 -
返回值
返回值 结果 0 成功 非0 失败,参考错误码 -
依赖
-
头文件: AudioProcess.h
-
库文件: libAPC_LINUX.so/ libAPC_LINUX.a
-
-
注意
无。
-
举例
请参考IaaAgc_Run举例部分。
2.40. IaaAgc_Reset¶
-
功能
重新初始化Agc算法
-
语法
AGC_HANDLE IaaAgc_Reset(char* working_buffer_address, AudioProcessInit *agc_init); -
形参
参数名称 描述 输入/输出 working_buffer_address Agc算法运行所使用的内存地址 输入 agc_init Agc算法的初始化结构体指针 输入 -
返回值
返回值 结果 非NULL 成功 NULL 失败 -
依赖
-
头文件: AudioProcess.h
-
库文件: libAPC_LINUX.so/ libAPC_LINUX.a
-
-
注意
无。
-
举例
无。
2.41. IaaAgc_GetConfig¶
-
功能
获取Agc算法的当前配置参数
-
语法
ALGO_AGC_RET IaaAgc_GetConfig(AGC_HANDLE handle, AudioProcessInit *agc_init, AudioAgcConfig *agc_config); -
形参
参数名称 描述 输入/输出 handle Agc算法handle 输入 agc_init Agc算法的初始化结构体指针 输出 agc_config Agc算法中当前的配置参数 输出 -
返回值
返回值 结果 0 成功 非0 失败,参考错误码 -
依赖
-
头文件: AudioProcess.h
-
库文件: libAPC_LINUX.so/ libAPC_LINUX.a
-
-
注意
无。
-
举例
请参考IaaAgc_Run举例部分。
2.42. IaaApc_SetCompressionRatioCurve¶
-
功能
配置Apc中Agc算法压缩率曲线,可自行设定分段长度
-
语法
ALGO_APC_RET IaaApc_SetCompressionRatioCurve(APC_HANDLE handle, short* CompressionRatioInput, short* CompressionRatioOutput, int curve_len); -
形参
参数名称 描述 输入/输出 handle Apc算法handle 输入 CompressionRatioInput 压缩率输入,请参考agc_config中的compression ratio 输入 CompressionRatioOutput 压缩率输出,请参考agc_config中的compression ratio 输入 curve_len 压缩率数组长度
数值范围[2, 20]输入 -
返回值
返回值 结果 0 成功 非0 失败,参考错误码 -
依赖
-
头文件: AudioProcess.h
-
库文件: libAPC_LINUX.so/ libAPC_LINUX.a
-
-
举例
请参考IaaApc_Run举例部分。
2.43. IaaAgc_SetCompressionRatioCurve¶
-
功能
配置Agc算法压缩率曲线,可自行设定分段长度
-
语法
ALGO_AGC_RET IaaAgc_SetCompressionRatioCurve(AGC_HANDLE handle, short* CompressionRatioInput, short* CompressionRatioOutput, int curve_len); -
形参
参数名称 描述 输入/输出 handle Agc算法handle 输入 CompressionRatioInput 压缩率输入,请参考agc_config中的compression ratio 输入 CompressionRatioOutput 压缩率输出,请参考agc_config中的compression ratio 输入 curve_len 压缩率数组长度
数值范围[2, 20]输入 -
返回值
返回值 结果 0 成功 非0 失败,参考错误码 -
依赖
-
头文件: AudioProcess.h
-
库文件: libAPC_LINUX.so/ libAPC_LINUX.a
-
-
举例
请参考IaaAgc_Run举例部分。
2.44. IaaApc_NrEstimateReferAec¶
-
功能
参考Aec线性处理结果做降噪处里,避免非线性Aec造成Anr收敛异常
-
语法
ALGO_APC_RET IaaApc_NrEstimateReferAec (APC_HANDLE handle, short aec_in); -
形参
参数名称 描述 输入/输出 handle Apc算法handle 输入 aec_in 输入数据指针,提供给NR算法做噪声估算的数据,可使用麦克风数据或者Aec线性处理后结果 输入 -
返回值
返回值 结果 0 成功 非0 失败,参考错误码 -
依赖
-
头文件: AudioProcess.h
-
库文件: libAPC_LINUX.so/ libAPC_LINUX.a
-
-
注意
- 仅支持于AudioAnrConfig anr_filter_mode 0~4之情况。
2.45. IaaApc_EnhanceNNBFMode¶
-
功能
针对串接Bf与Apc深度学习降噪算法之特化增强
-
语法
ALGO_APC_RET IaaApc_EnhanceNNBFMode(APC_HANDLE handle, APC_BF_HANDLE handle2 , int is_enable); -
形参
参数名称 描述 输入/输出 handle Apc算法handle 输入 handle2 Bf 算法 handle 输入 is_enable 0: 不使用 1:启用 输入 -
返回值
返回值 结果 0 成功 非0 失败,参考错误码 -
依赖
-
头文件: AudioProcess.h
-
库文件: libAPC_LINUX.so/ libAPC_LINUX.a
-
-
注意
-
此算法仅适用于Bf 模式3 搭配AudioAnrConfig anr_filter_mode5之情况。
-
必须要引入Bf 算法库。
-
介于 IaaBf_Run 与 IaaApc_Run 之间。
-
2.46. IaaApc_FilterDesign¶
-
功能
初始化滤波器参数,可设定中心频率、峰值增益、峰值带宽,滤波器类型。
-
语法
ALGO_APC_RET IaaApc_FilterDesign(APC_HANDLE handle, int filter_cnt, AudioFilterConfig* filter_config); -
形参
参数名称 描述 输入/输出 handle Apc算法handle 输入 filter_cnt 滤波器序号,最多可设定10个滤波器
范围:[1,10]输入 filter_config 滤波器参数,可设定中心频率、峰值增益、峰值带宽,滤波器类型 输入 -
返回值
返回值 结果 0 成功 非0 失败,参考错误码 -
依赖
-
头文件: AudioProcess.h
-
库文件: libAPC_LINUX.so/ libAPC_LINUX.a
-
-
注意
-
filter design出来结果需以频响曲线为准,并非设定多少频率,就一定达到目标增益。
-
因为此filter为IIR filter,会对相位造成非线性影响,建议摆放在所有算法的最后。
-
若Q值设定过大,代表能量下降幅度越陡,有可能造成其他频段不正常拉升的,请以频响曲线为准。
-
如果想要达到更陡的曲线,可以设计多个相同的滤波器迭加。
-
滤波器设计没有标准答案,以使用者需求为准。
-
-
举例
请参考IaaEq_FilterDesign举例部分。
2.47. IaaApc_FilterApply¶
-
功能
套用IIR滤波。
-
语法
ALGO_APC_RET IaaApc_FilterApply(APC_HANDLE handle, short* pss_audio_in); -
形参
参数名称 描述 输入/输出 handle Apc算法handle 输入 pss_audio_in 输入数据指针,滤波处理后的数据会写入同个指标中 输入/输出 -
返回值
返回值 结果 0 成功 非0 失败,参考错误码 -
依赖
-
头文件: AudioProcess.h
-
库文件: libAPC_LINUX.so/ libAPC_LINUX.a
-
-
举例
//filter 1 AudioFilterConfig filter_design; filter_design.q_factor = 5; filter_design.f0 = 1000; filter_design.type = EQ_NOTCH_FILTER; filter_design.gain = -10; //filter 2 AudioFilterConfig filter_design2; filter_design2.q_factor = 5; filter_design2.f0 = 5000; filter_design2.type = EQ_NOTCH_FILTER; filter_design2.gain = -10; //filter 3 AudioFilterConfig filter_design3; filter_design3.q_factor = 5; filter_design3.f0 = 500; filter_design3.type = EQ_NOTCH_FILTER; filter_design3.gain = -10; IaaApc_FilterDesign(handle, 1, &filter_design); IaaApc_FilterDesign(handle, 2, &filter_design2); IaaApc_FilterDesign(handle, 3, &filter_design3); float h[512]; IaaApc_FilterApply(handle, h); while(read input data){ ret1 = IaaApc_FilterApply(handle, input); }
2.48. IaaEq_FilterDesign¶
-
功能
初始化滤波器参数,可设定中心频率、峰值增益、峰值带宽,滤波器类型。
-
语法
ALGO_EQ_RET IaaEq_FilterDesign (EQ_HANDLE handle, int filter_cnt, AudioFilterConfig* filter_config); -
形参
参数名称 描述 输入/输出 handle Eq算法handle 输入 filter_cnt 滤波器序号,最多可设定10个滤波器
范围:[1,10]输入 filter_config 滤波器参数,可设定中心频率、峰值增益、峰值带宽,滤波器类型 输入 -
返回值
返回值 结果 0 成功 非0 失败,参考错误码 -
依赖
-
头文件: AudioProcess.h
-
库文件: libAPC_LINUX.so/ libAPC_LINUX.a
-
-
注意
-
filter design出来结果需以频响曲线为准,并非设定多少频率,就一定达到目标增益。
-
因为此filter为IIR filter,会对相位造成非线性影响,建议摆放在所有算法的最后。
-
若Q值设定过大,代表能量下降幅度越陡,有可能造成其他频段不正常拉升的,请以频响曲线为准。
-
如果想要达到更陡的曲线,可以设计多个相同的滤波器迭加。
-
滤波器设计没有标准答案,以使用者需求为准。
-
-
举例
-
下图为Q值设定过大范例
filter_design.q_factor = 5; filter_design.f0 = 2000; filter_design.type = EQ_HIGH_PASS_FILTER; filter_design.gain = 3;
-
滤波器迭加
顾名思义,就是直接设定两个filter的系数
//filter1 AudioFilterConfig filter_design; filter_design.q_factor = 1; filter_design.f0 = 2000; filter_design.type = EQ_HIGH_PASS_FILTER; filter_design.gain = 0; //filter 2 AudioFilterConfig filter_design2; filter_design2.q_factor = 1; filter_design2.f0 = 2000; filter_design2.type = EQ_HIGH_PASS_FILTER; filter_design2.gain = 0;下图蓝色是只套用filter_design的频响,橘色是同时套用filter_design跟filter_design2的频响,可以达到更陡的频率下降

-
2.49. IaaEq_FilterApply¶
-
功能
套用IIR滤波。
-
语法
ALGO_EQ_RET IaaEq_FilterApply(EQ_HANDLE handle, short* pss_audio_in); -
形参
参数名称 描述 输入/输出 handle Eq算法handle 输入 pss_audio_in 输入数据指针,滤波处理后的数据会写入同个指标中 输入/输出 -
返回值
返回值 结果 0 成功 非0 失败,参考错误码 -
依赖
-
头文件: AudioProcess.h
-
库文件: libAPC_LINUX.so/ libAPC_LINUX.a
-
-
举例
//filter 1 AudioFilterConfig filter_design; filter_design.q_factor = 5; filter_design.f0 = 1000; filter_design.type = EQ_NOTCH_FILTER; filter_design.gain = -10; //filter 2 AudioFilterConfig filter_design2; filter_design2.q_factor = 5; filter_design2.f0 = 5000; filter_design2.type = EQ_NOTCH_FILTER; filter_design2.gain = -10; //filter 3 AudioFilterConfig filter_design3; filter_design3.q_factor = 5; filter_design3.f0 = 500; filter_design3.type = EQ_NOTCH_FILTER; filter_design3.gain = -10; IaaEq_FilterDesign(handle, 1, &filter_design); IaaEq_FilterDesign(handle, 2, &filter_design2); IaaEq_FilterDesign(handle, 3, &filter_design3); float h[512]; IaaEq_FilterFreqz(handle, h); while(read input data){ ret1 = IaaEq_FilterApply(handle, input); }
2.50. IaaAnr_EnhanceNNBFMode¶
-
功能
针对串接Bf与Anr深度学习降噪算法之特化增强。
-
语法
ALGO_ANR_RET IaaAnr_EnhanceNNBFMode(ANR_HANDLE handle, ANR_BF_HANDLE handle2 , int is_enable); -
形参
参数名称 描述 输入/输出 handle Anr算法handle 输入 handle2 Bf算法handle 输入 is_enable 0: 不使用; 1:启用 输入 -
返回值
返回值 结果 0 成功 非0 失败,参考错误码 -
依赖
-
头文件: AudioProcess.h
-
库文件: libAPC_LINUX.so/ libAPC_LINUX.a
-
-
注意
-
此算法仅适用于Bf 模式3 搭配AudioAnrConfig anr_filter_mode5之情况。
-
必须要引入Bf 算法库。
-
介于 IaaBf_Run 与 IaaAnr_Run 之间。
-
2.51. IaaApc_GetAPIVersion¶
-
功能
取得Apc算法库API版本。
-
语法
ALGO_APC_RET IaaApc_GetAPIVersion(unsigned short* major, unsigned short* minor); -
形参
参数名称 描述 输入/输出 major 输入数据指针,Apc API版本小数点前数据会写入同个指标中 输出 minor 输入数据指针,Apc API版本小数点后数据会写入同个指标中 输出 -
返回值
返回值 结果 0 成功 非0 失败,参考错误码 -
依赖
-
头文件: AudioProcess.h
-
库文件: libAPC_LINUX.so/ libAPC_LINUX.a
-
2.52. IaaApc_SetHandleId¶
-
功能
配置Apc算法id
-
语法
ALGO_APC_RET IaaApc_SetHandleId(APC_HANDLE handle, int id); -
形参
参数名称 描述 输入/输出 handle Apc算法handle 输入 id Apc算法handle id
数值范围:[0,100]输入 -
返回值
返回值 结果 0 成功 非0 失败,参考错误码 -
依赖
-
头文件: AudioProcess.h
-
库文件: libAPC_LINUX.so/ libAPC_LINUX.a
-
2.53. IaaAnr_SetHandleId¶
-
功能
配置Anr算法id
-
语法
ALGO_ANR_RET IaaAnr_SetHandleId(ANR_HANDLE handle, int id); -
形参
参数名称 描述 输入/输出 handle Anr算法handle 输入 id Anr算法handle id
数值范围:[0,100]输入 -
返回值
返回值 结果 0 成功 非0 失败,参考错误码 -
依赖
-
头文件: AudioProcess.h
-
库文件: libAPC_LINUX.so/ libAPC_LINUX.a
-
2.54. IaaEq_SetHandleId¶
-
功能
配置Eq算法id
-
语法
ALGO_EQ_RET IaaEq_SetHandleId(EQ_HANDLE handle, int id); -
形参
参数名称 描述 输入/输出 handle Eq算法handle 输入 id Eq算法handle id
数值范围:[0,100]输入 -
返回值
返回值 结果 0 成功 非0 失败,参考错误码 -
依赖
-
头文件: AudioProcess.h
-
库文件: libAPC_LINUX.so/ libAPC_LINUX.a
-
2.55. IaaAgc_SetHandleId¶
-
功能
配置Agc算法id
-
语法
ALGO_AGC_RET IaaAgc_SetHandleId(AGC_HANDLE handle, int id); -
形参
参数名称 描述 输入/输出 handle Agc算法handle 输入 id Agc算法handle id
数值范围:[0,100]输入 -
返回值
返回值 结果 0 成功 非0 失败,参考错误码 -
依赖
-
头文件: AudioProcess.h
-
库文件: libAPC_LINUX.so/ libAPC_LINUX.a
-
2.56. IaaApc_GetJsonFileSize¶
-
功能
Apc获取解析Json文件内容所需要的内存大小
-
语法
unsigned int IaaApc_GetJsonFileSize(char* jsonfile); -
形参
参数名称 描述 输入/输出 jsonfile Json檔名 输入 -
返回值
返回值为解析Json文件内容所需要的内存大小
-
依赖
-
头文件: AudioProcess.h
-
库文件: libAPC_LINUX.so/ libAPC_LINUX.a
-
2.57. IaaApc_NrReadJson¶
-
功能
配置Json文件内容至Apc算法
-
语法
ALGO_APC_RET IaaApc_NrReadJson(APC_HANDLE handle, char* jsonBuffer, char* jsonfile, unsigned int buffSize); -
形参
参数名称 描述 输入/输出 handle Apc算法handle 输入 jsonBuffer 解析Json文件内容所使用的内存地址 输入 jsonfile Json檔名 输入 buffSize 解析Json文件内容所需要的内存大小 输入 -
返回值
返回值 结果 0 成功 非0 失败,参考错误码 -
依赖
-
头文件: AudioProcess.h
-
库文件: libAPC_LINUX.so/ libAPC_LINUX.a
-
2.58. IaaAnr_GetJsonFileSize¶
-
功能
Anr获取解析Json文件内容所需要的内存大小
-
语法
unsigned int IaaAnr_GetJsonFileSize(char* jsonfile); -
形参
参数名称 描述 输入/输出 jsonfile Json檔名 输入 -
返回值
返回值为解析Json文件内容所需要的内存大小
-
依赖
-
头文件: AudioProcess.h
-
库文件: libAPC_LINUX.so/ libAPC_LINUX.a
-
2.59. IaaAnr_NrReadJson¶
-
功能
配置Json文件内容至Anr算法
-
语法
ALGO_ANR_RET IaaAnr_NrReadJson(ANR_HANDLE handle, char* jsonBuffer, char* jsonfile, unsigned int buffSize); -
形参
参数名称 描述 输入/输出 handle Anr算法handle 输入 jsonBuffer 解析Json文件内容所使用的内存地址 输入 jsonfile Json檔名 输入 buffSize 解析Json文件内容所需要的内存大小 输入 -
返回值
返回值 结果 0 成功 非0 失败,参考错误码 -
依赖
-
头文件: AudioProcess.h
-
库文件: libAPC_LINUX.so/ libAPC_LINUX.a
-
2.60. IaaApc_EnableComfortNoise¶
-
功能
配置Apc舒适噪音算法并设定舒适噪音能量
-
语法
ALGO_APC_RET IaaApc_EnableComfortNoise(APC_HANDLE handle, int enable, int dB); -
形参
参数名称 描述 输入/输出 handle Apc算法handle 输入 enable 启用舒适噪音算法 输入 dB 舒适噪音能量 输入 -
返回值
返回值 结果 0 成功 非0 失败,参考错误码 -
依赖
-
头文件: AudioProcess.h
-
库文件: libAPC_LINUX.so/ libAPC_LINUX.a
-
2.61. IaaAnr_EnableComfortNoise¶
-
功能
配置Anr舒适噪音算法并设定舒适噪音能量
-
语法
ALGO_ANR_RET IaaAnr_EnableComfortNoise(ANR_HANDLE handle, int enable, int dB); -
形参
参数名称 描述 输入/输出 handle Anr算法handle 输入 enable 启用舒适噪音算法 输入 dB 舒适噪音能量 输入 -
返回值
返回值 结果 0 成功 非0 失败,参考错误码 -
依赖
-
头文件: AudioProcess.h
-
库文件: libAPC_LINUX.so/ libAPC_LINUX.a
-
2.62. IaaEq_EnableComfortNoise¶
-
功能
配置Eq舒适噪音算法并设定舒适噪音能量
-
语法
ALGO_EQ_RET IaaEq_EnableComfortNoise(EQ_HANDLE handle, int enable, int dB); -
形参
参数名称 描述 输入/输出 handle Eq算法handle 输入 enable 启用舒适噪音算法 输入 dB 舒适噪音能量 输入 -
返回值
返回值 结果 0 成功 非0 失败,参考错误码 -
依赖
-
头文件: AudioProcess.h
-
库文件: libAPC_LINUX.so/ libAPC_LINUX.a
-
2.63. IaaAgc_EnableComfortNoise¶
-
功能
配置Agc舒适噪音算法并设定舒适噪音能量
-
语法
ALGO_AGC_RET IaaAgc_EnableComfortNoise(AGC_HANDLE handle, int enable, int dB); -
形参
参数名称 描述 输入/输出 handle Agc算法handle 输入 enable 启用舒适噪音算法 输入 dB 舒适噪音能量 输入 -
返回值
返回值 结果 0 成功 非0 失败,参考错误码 -
依赖
-
头文件: AudioProcess.h
-
库文件: libAPC_LINUX.so/ libAPC_LINUX.a
-
2.64. IaaApc_EnableAutoSmooth¶
-
功能
配置Apc平滑噪音算法
-
语法
ALGO_APC_RET IaaApc_EnableAutoSmooth(APC_HANDLE handle, int enable); -
形参
参数名称 描述 输入/输出 handle Apc算法handle 输入 enable 启用平滑噪音算法 输入 -
返回值
返回值 结果 0 成功 非0 失败,参考错误码 -
依赖
-
头文件: AudioProcess.h
-
库文件: libAPC_LINUX.so/ libAPC_LINUX.a
-
2.65. IaaAnr_EnableAutoSmooth¶
-
功能
配置Anr平滑噪音算法
-
语法
ALGO_ANR_RET IaaAnr_EnableAutoSmooth(ANR_HANDLE handle, int enable); -
形参
参数名称 描述 输入/输出 handle Anr算法handle 输入 enable 启用平滑噪音算法 输入 -
返回值
返回值 结果 0 成功 非0 失败,参考错误码 -
依赖
-
头文件: AudioProcess.h
-
库文件: libAPC_LINUX.so/ libAPC_LINUX.a
-
2.66. IaaApc_ApplyComfortNoise¶
-
功能
套用指定能量之舒适噪声
-
语法
ALGO_APC_RET IaaApc_ApplyComfortNoise(CngStruct cng_para, short* pss_audio_in); -
形参
参数名称 描述 输入/输出 cng_para 配置舒适噪声的结构体指针 输入 pss_audio_in 欲混合舒适噪声之输入讯号,输出讯号会覆写在输入讯号上 输入/输出 -
返回值
返回值 结果 0 成功 非0 失败,参考错误码 -
依赖
-
头文件: AudioProcess.h
-
库文件: libAPC_LINUX.so/ libAPC_LINUX.a
-
2.67. IaaApc_SwitchReadFromJson¶
-
功能
配置Json参数到Apc算法的启用设置结构体指针
-
语法
ALGO_APC_RET IaaApc_SwitchReadFromJson(AudioApcBufferConfig *apc_switch, char* jsonBuffer, char* jsonfile, unsigned int buffSize); -
形参
参数名称 描述 输入/输出 apc_switch Apc算法启用设置的结构体指针 输入/输出 jsonBuffer 解析Json文件内容所使用的内存地址 输入 jsonfile Json檔名 输入 buffSize 解析Json文件内容所需要的内存大小 输入 -
返回值
返回值 结果 0 成功 非0 失败,参考错误码 -
依赖
-
头文件: AudioProcess.h
-
库文件: libAPC_LINUX.so/ libAPC_LINUX.a
-
-
举例
#include <stdio.h> #include <unistd.h> #include <fcntl.h> #include <string.h> #include <time.h> #include <stdlib.h> #ifndef OS_WINDOWS #include <sys/ioctl.h> #endif #include <sys/types.h> #include <sys/stat.h> #include <sys/time.h> #include "AudioProcess.h" #define USE_MALLOC (1) #define USE_JSON (1) #define FILTER_ENABLE (0) #define FREQ_AGC_ENABEL (1) #define DIGITAL_GAIN_ENABLE (1) unsigned int WorkingBuffer2[1] = {0}; typedef unsigned char uint8; typedef unsigned short uint16; typedef unsigned long uint32; float AVERAGE_RUN(int a) { static unsigned int num = 0; static float avg = 0; if(num == 0) avg = 0; num++; avg = avg + ((float)a - avg) / ((float)num); return avg; } unsigned int _OsCounterGetMs(void) { struct timeval t1; gettimeofday(&t1,NULL); unsigned int T = ( (1000000 * t1.tv_sec)+ t1.tv_usec )/1000; return T; } int main(int argc, char *argv[]) { short input[1024]; unsigned int T0, T1; float avg = 0; float peak = 0; char input_file[512]; char output_file[512]; int counter=0; #if FREQ_AGC_ENABEL int freqBand[_AGC_FREQ_BAND_NUM]; int compressionRatioArrayLowInput[_AGC_CR_NUM]; int compressionRatioArrayLowOutput[_AGC_CR_NUM]; int compressionRatioArrayMidInput[_AGC_CR_NUM]; int compressionRatioArrayMidOutput[_AGC_CR_NUM]; int compressionRatioArrayHighInput[_AGC_CR_NUM]; int compressionRatioArrayHighOutput[_AGC_CR_NUM]; #endif AudioApcBufferConfig apc_switch; memset(&apc_switch,0,sizeof(AudioApcBufferConfig)); #if USE_JSON unsigned int use_apc_param_json = 1; char apc_para_json_file[512]; sprintf(apc_para_json_file,"%s","./../sample/data/ApcParamJson.json"); int apc_para_buffersize = IaaApc_GetJsonFileSize(apc_para_json_file); if(apc_para_buffersize == 0){ printf("IaaApc_GetJsonFileSize() error. Can not load json file [%s]\t\n", apc_para_json_file); use_apc_param_json = 0; } else{ printf("IaaApc_GetJsonFileSize() succeed.\t\n"); } #if USE_MALLOC char *apc_para_json_buf_ptr = (char*)malloc(apc_para_buffersize); #else char apc_para_json_buf_ptr[512*1000]; #endif if(use_apc_param_json){ if(IaaApc_SwitchReadFromJson(&apc_switch, apc_para_json_buf_ptr, apc_para_json_file, apc_para_buffersize) != 0){ printf("IaaApc_SwitchReadFromJson() error.\t\n"); return -1; } else{ printf("IaaApc_SwitchReadFromJson() succeed.\t\n"); } } #endif int buffersize = IaaApc_GetBufferSize(&apc_switch); if(buffersize == 0){ printf("IaaApc_GetBufferSize() error.\t\n"); return -1; } else{ printf("IaaApc_GetBufferSize() succeed.\t\n"); } #if USE_MALLOC char *working_buf_ptr = (char*)malloc(buffersize); #else char working_buf_ptr[512*1000]; #endif #if USE_JSON unsigned int use_anr_intl_json = 1; char anr_intl_json_file[512]; sprintf(anr_intl_json_file,"%s","./../sample/data/AnrInternalJson.json"); int anr_intl_buffersize = IaaApc_GetJsonFileSize(anr_intl_json_file); if(anr_intl_buffersize == 0){ printf("IaaApc_GetJsonFileSize() error. Can not load json file [%s]\t\n", anr_intl_json_file); use_anr_intl_json = 0; } else{ printf("IaaApc_GetJsonFileSize() succeed.\t\n"); } #if USE_MALLOC char *anr_intl_json_buf_ptr = (char*)malloc(anr_intl_buffersize); #else char anr_intl_json_buf_ptr[512*1000]; #endif #endif #if USE_JSON unsigned int use_apc_intl_json = 1; char apc_intl_json_file[512]; sprintf(apc_intl_json_file,"%s","./../sample/data/ApcInternalJson.json"); int apc_intl_buffersize = IaaApc_GetJsonFileSize(apc_intl_json_file); if(apc_intl_buffersize == 0){ printf("IaaApc_GetJsonFileSize() error. Can not load json file [%s]\t\n", apc_intl_json_file); use_apc_intl_json = 0; } else{ printf("IaaApc_GetJsonFileSize() succeed.\t\n"); } #if USE_MALLOC char *apc_intl_json_buf_ptr = (char*)malloc(apc_intl_buffersize); #else char apc_intl_json_buf_ptr[512*1000]; #endif #endif FILE * fin, * fout; int ret1; AudioProcessInit apc_init; AudioAnrConfig anr_config; AudioEqConfig eq_config; AudioHpfConfig hpf_config; AudioAgcConfig agc_config; AudioApcOption apc_option; memset(&apc_init,0,sizeof(AudioProcessInit)); memset(&anr_config,0,sizeof(AudioAnrConfig)); memset(&eq_config,0,sizeof(AudioEqConfig)); memset(&hpf_config,0,sizeof(AudioHpfConfig)); memset(&agc_config,0,sizeof(AudioAgcConfig)); memset(&apc_option,0,sizeof(AudioApcOption)); APC_HANDLE handle; #if USE_JSON if(use_apc_param_json){ if(IaaApc_InitReadFromJson(&apc_init, apc_para_json_buf_ptr, apc_para_json_file, apc_para_buffersize) != 0){ printf("IaaApc_InitReadFromJson() error.\t\n"); return -1; } else{ printf("IaaApc_InitReadFromJson() succeed.\t\n"); } } #endif handle = IaaApc_Init((char *)working_buf_ptr, &apc_init, &apc_switch); if(handle==NULL){ printf("IaaApc_Init() error.\t\n"); return -1; } else{ printf("IaaApc_Init() succeed.\t\n"); } #if USE_JSON if(use_apc_param_json){ if(IaaApc_ConfigReadFromJson(&anr_config, &eq_config, &hpf_config, &agc_config, apc_para_json_buf_ptr, apc_para_json_file, apc_para_buffersize) != 0){ printf("IaaApc_ConfigReadFromJson() error.\t\n"); return -1; } else{ printf("IaaApc_ConfigReadFromJson() succeed.\t\n"); } } #endif if(IaaApc_Config(handle,&anr_config,&eq_config,&hpf_config,NULL,NULL,&agc_config) != -0){ printf("IaaApc_Config() error.\t\n"); return -1; } else{ printf("IaaApc_Config() succeed.\t\n"); } #if USE_JSON if(apc_switch.anr_enable && use_anr_intl_json){ if(IaaApc_NrReadJson(handle, anr_intl_json_buf_ptr, anr_intl_json_file, anr_intl_buffersize) != 0){ printf("IaaApc_NrReadJson() error.\t\n"); return -1; } else{ printf("IaaApc_NrReadJson() succeed.\t\n"); } } #endif #if USE_JSON if(use_apc_intl_json){ if(IaaApc_ReadJson(handle, apc_intl_json_buf_ptr, apc_intl_json_file, apc_intl_buffersize) != 0){ printf("IaaApc_ReadJson() error.\t\n"); return -1; } else{ printf("IaaApc_ReadJson() succeed.\t\n"); } } #endif #if FILTER_ENABLE float h[512]; #if USE_JSON if(use_apc_param_json){ if(IaaApc_FilterDesignReadFromJson(handle, apc_para_json_buf_ptr, apc_para_json_file, apc_para_buffersize) != 0){ printf("IaaEq_FilterDesignReadFromJson() error.\t\n"); return -1; } else{ printf("IaaEq_FilterDesignReadFromJson() succeed.\t\n"); } } #endif IaaApc_FilterFreqz(handle,h); #endif #if FREQ_AGC_ENABEL if(agc_config.user_mode == 2){ #if USE_JSON if(use_apc_param_json){ if(IaaApc_SetAgcReadFromJson(&freqBand[0], &compressionRatioArrayLowInput[0], &compressionRatioArrayLowOutput[0], &compressionRatioArrayMidInput[0], &compressionRatioArrayMidOutput[0], &compressionRatioArrayHighInput[0], &compressionRatioArrayHighOutput[0], apc_para_json_buf_ptr, apc_para_json_file, apc_para_buffersize) != 0 ){ printf("IaaAgc_SetAgcReadFromJson() error.\t\n"); return -1; } else{ printf("IaaAgc_SetAgcReadFromJson() succeed.\t\n"); } } #endif IaaApc_SetAgcFreqBand(handle, freqBand); IaaApc_SetLowFreqCompressionRatioCurve(handle, compressionRatioArrayLowInput, compressionRatioArrayLowOutput); IaaApc_SetMidFreqCompressionRatioCurve(handle, compressionRatioArrayMidInput, compressionRatioArrayMidOutput); IaaApc_SetHighFreqCompressionRatioCurve(handle, compressionRatioArrayHighInput, compressionRatioArrayHighOutput); } #endif #if DIGITAL_GAIN_ENABLE #if USE_JSON if(use_apc_param_json){ if(IaaApc_OptionReadFromJson(&apc_option, apc_para_json_buf_ptr, apc_para_json_file, apc_para_buffersize) != 0){ printf("IaaApc_OptionReadFromJson() error.\t\n"); return -1; } else{ printf("IaaApc_OptionReadFromJson() succeed.\t\n"); } } #endif #endif sprintf(input_file,"%s","./../sample/data/APC_AFE_16K.wav"); sprintf(output_file,"%s","./../sample/data/APC_out_16K.wav"); fin = fopen(input_file, "rb"); if(!fin) { printf("the input file %s could not be open\n",input_file); return -1; } fout = fopen(output_file, "wb"); if(!fout) { printf("the output file could not be open\n"); return -1; } fread(input, sizeof(char), 44, fin); // read header 44 bytes fwrite(input, sizeof(char),44, fout); // write 44 bytes output while(fread(input, sizeof(short), apc_init.point_number*apc_init.channel, fin)) { counter++; T0 = (long)_OsCounterGetMs(); #if DIGITAL_GAIN_ENABLE ret1 = IaaApc_ApplyDigitalGain(handle,input,apc_option.digital_gain[0]); #endif ret1 = IaaApc_Run(handle,input); #if FILTER_ENABLE ret1 += IaaApc_FilterApply(handle, input); #endif #if DIGITAL_GAIN_ENABLE ret1 += IaaApc_ApplyDigitalGain(handle,input,apc_option.digital_gain[1]); #endif T1 = (long)_OsCounterGetMs(); avg += (T1 - T0); if(peak < (T1 - T0)) peak = (T1 - T0); if(counter%1000== 999) { printf("counter = %d\n", counter); printf("current time = %f\n", (float)counter*apc_init.point_number/apc_init.sample_rate); printf("process time = %lu(ms)\t",(long)(T1 - T0)); } if(ret1 != 0) { printf("Error occured in APC\n"); break; } fwrite(input, sizeof(short), apc_init.point_number*apc_init.channel, fout); } avg /= counter; printf("AVG is %.2f ms\n",avg); printf("PEAK is %.2f ms\n",peak); IaaApc_Free(handle); free(working_buf_ptr); fclose(fin); fclose(fout); printf("Done\n"); return 0; }
2.68. IaaApc_InitReadFromJson¶
-
功能
配置Json参数到Apc算法的初始化结构体指针
-
语法
ALGO_APC_RET IaaApc_InitReadFromJson(AudioProcessInit *audio_process_init, char* jsonBuffer, char* jsonfile, unsigned int buffSize); -
形参
参数名称 描述 输入/输出 audio_process_init Apc算法的初始化结构体指针 输入/输出 jsonBuffer 解析Json文件内容所使用的内存地址 输入 jsonfile Json檔名 输入 buffSize 解析Json文件内容所需要的内存大小 输入 -
返回值
返回值 结果 0 成功 非0 失败,参考错误码 -
依赖
-
头文件: AudioProcess.h
-
库文件: libAPC_LINUX.so/ libAPC_LINUX.a
-
-
举例
请参考IaaApc_SwitchReadFromJson举例部分。
2.69. IaaApc_ConfigReadFromJson¶
-
功能
配置Json参数到Apc算法的结构体指针
-
语法
ALGO_APC_RET IaaApc_ConfigReadFromJson(AudioAnrConfig *anr_config, AudioEqConfig *eq_config, AudioHpfConfig *hpf_config, AudioAgcConfig *agc_config, char* jsonBuffer, char* jsonfile, unsigned int buffSize); -
形参
参数名称 描述 输入/输出 anr_config 配置Anr算法的结构体指针 输入/输出 eq_config 配置Eq算法的结构体指针 输入/输出 hpf_config 配置Hpf算法的结构体指针 输入/输出 agc_config 配置Agc算法的结构体指针 输入/输出 jsonBuffer 解析Json文件内容所使用的内存地址 输入 jsonfile Json檔名 输入 buffSize 解析Json文件内容所需要的内存大小 输入 -
返回值
返回值 结果 0 成功 非0 失败,参考错误码 -
依赖
-
头文件: AudioProcess.h
-
库文件: libAPC_LINUX.so/ libAPC_LINUX.a
-
-
举例
请参考IaaApc_SwitchReadFromJson举例部分。
2.70. IaaApc_SetAgcReadFromJson¶
-
功能
配置Json参数到Agc频段数组
-
语法
ALGO_APC_RET IaaApc_SetAgcReadFromJson(int *freqBand, int *compressionRatioArrayLowInput, int *compressionRatioArrayLowOutput, int *compressionRatioArrayMidInput, int *compressionRatioArrayMidOutput, int *compressionRatioArrayHighInput, int *compressionRatioArrayHighOutput, char* jsonBuffer, char* jsonfile, unsigned int buffSize); -
形参
参数名称 描述 输入/输出 freqBand 频段数组,包含低频段上限频率,中频段上限频率,高段频段上限频率。
举例 : 当取样率为16K,frequency_band若设定为{3000,4000,8000}
则低频频段为03000Hz,中频为30004000 Hz,高频为4000~8000 Hz,须注意最高频率不能超过取样率的一半。输入/输出 compressionRatioArrayLowInput 压缩率输入,请参考agc_config中的compression ratio 输入/输出 compressionRatioArrayLowOutput 压缩率输出,请参考agc_config中的compression ratio 输入/输出 compressionRatioArrayMidInput 压缩率输入,请参考agc_config中的compression ratio 输入/输出 compressionRatioArrayMidOutput 压缩率输出,请参考agc_config中的compression ratio 输入/输出 compressionRatioArrayHighInput 压缩率输入,请参考agc_config中的compression ratio 输入/输出 compressionRatioArrayHighOutput 压缩率输出,请参考agc_config中的compression ratio 输入/输出 jsonBuffer 解析Json文件内容所使用的内存地址 输入 jsonfile Json檔名 输入 buffSize 解析Json文件内容所需要的内存大小 输入 -
返回值
返回值 结果 0 成功 非0 失败,参考错误码 -
依赖
-
头文件: AudioProcess.h
-
库文件: libAPC_LINUX.so/ libAPC_LINUX.a
-
-
举例
请参考IaaApc_SwitchReadFromJson举例部分。
2.71. IaaApc_FilterDesignReadFromJson¶
-
功能
配置Json参数到Apc算法的Eq滤波器结构体指针
-
语法
ALGO_APC_RET IaaApc_FilterDesignReadFromJson(APC_HANDLE handle, char* jsonBuffer, char* jsonfile, unsigned int buffSize); -
形参
参数名称 描述 输入/输出 handle Apc算法handle 输入 jsonBuffer 解析Json文件内容所使用的内存地址 输入 jsonfile Json檔名 输入 buffSize 解析Json文件内容所需要的内存大小 输入 -
返回值
返回值 结果 0 成功 非0 失败,参考错误码 -
依赖
-
头文件: AudioProcess.h
-
库文件: libAPC_LINUX.so/ libAPC_LINUX.a
-
-
举例
请参考IaaApc_SwitchReadFromJson举例部分。
2.72. IaaAnr_InitReadFromJson¶
-
功能
配置Json参数到Anr算法的初始化结构体指针
-
语法
ALGO_ANR_RET IaaAnr_InitReadFromJson(AudioProcessInit *anr_init, char* jsonBuffer, char* jsonfile, unsigned int buffSize); -
形参
参数名称 描述 输入/输出 anr_init Anr算法的初始化结构体指针 输入/输出 jsonBuffer 解析Json文件内容所使用的内存地址 输入 jsonfile Json檔名 输入 buffSize 解析Json文件内容所需要的内存大小 输入 -
返回值
返回值 结果 0 成功 非0 失败,参考错误码 -
依赖
-
头文件: AudioProcess.h
-
库文件: libAPC_LINUX.so/ libAPC_LINUX.a
-
2.73. IaaAnr_ConfigReadFromJson¶
-
功能
配置Json参数到Anr算法的结构体指针
-
语法
ALGO_ANR_RET IaaAnr_ConfigReadFromJson(AudioAnrConfig *anr_config, char* jsonBuffer, char* jsonfile, unsigned int buffSize); -
形参
参数名称 描述 输入/输出 anr_config 配置Anr算法的结构体指针 输入/输出 jsonBuffer 解析Json文件内容所使用的内存地址 输入 jsonfile Json檔名 输入 buffSize 解析Json文件内容所需要的内存大小 输入 -
返回值
返回值 结果 0 成功 非0 失败,参考错误码 -
依赖
-
头文件: AudioProcess.h
-
库文件: libAPC_LINUX.so/ libAPC_LINUX.a
-
2.74. IaaEq_GetJsonFileSize¶
-
功能
Eq获取解析Json文件内容所需要的内存大小
-
语法
unsigned int IaaEq_GetJsonFileSize(char* jsonfile); -
形参
参数名称 描述 输入/输出 jsonfile Json檔名 输入 -
返回值
返回值为解析Json文件内容所需要的内存大小
-
依赖
-
头文件: AudioProcess.h
-
库文件: libAPC_LINUX.so/ libAPC_LINUX.a
-
2.75. IaaEq_InitReadFromJson¶
-
功能
配置Json参数到Eq算法的初始化结构体指针
-
语法
ALGO_EQ_RET IaaEq_InitReadFromJson(AudioProcessInit *eq_init, char* jsonBuffer, char* jsonfile, unsigned int buffSize); -
形参
参数名称 描述 输入/输出 eq_init Eq算法的初始化结构体指针 输入/输出 jsonBuffer 解析Json文件内容所使用的内存地址 输入 jsonfile Json檔名 输入 buffSize 解析Json文件内容所需要的内存大小 输入 -
返回值
返回值 结果 0 成功 非0 失败,参考错误码 -
依赖
-
头文件: AudioProcess.h
-
库文件: libAPC_LINUX.so/ libAPC_LINUX.a
-
2.76. IaaEq_ConfigReadFromJson¶
-
功能
配置Json参数到Eq算法的结构体指针
-
语法
ALGO_EQ_RET IaaEq_ConfigReadFromJson(AudioEqConfig *eq_config, AudioHpfConfig *hpf_config, char* jsonBuffer, char* jsonfile, unsigned int buffSize); -
形参
参数名称 描述 输入/输出 eq_config 配置Eq算法的结构体指针 输入/输出 hpf_config 配置Hpf算法的结构体指针 输入/输出 jsonBuffer 解析Json文件内容所使用的内存地址 输入 jsonfile Json檔名 输入 buffSize 解析Json文件内容所需要的内存大小 输入 -
返回值
返回值 结果 0 成功 非0 失败,参考错误码 -
依赖
-
头文件: AudioProcess.h
-
库文件: libAPC_LINUX.so/ libAPC_LINUX.a
-
2.77. IaaEq_FilterDesignReadFromJson¶
-
功能
配置Json参数到Eq算法的滤波器结构体指针
-
语法
ALGO_EQ_RET IaaEq_FilterDesignReadFromJson(EQ_HANDLE handle, char* jsonBuffer, char* jsonfile, unsigned int buffSize); -
形参
参数名称 描述 输入/输出 handle Eq算法handle 输入/输出 jsonBuffer 解析Json文件内容所使用的内存地址 输入 jsonfile Json檔名 输入 buffSize 解析Json文件内容所需要的内存大小 输入 -
返回值
返回值 结果 0 成功 非0 失败,参考错误码 -
依赖
-
头文件: AudioProcess.h
-
库文件: libAPC_LINUX.so/ libAPC_LINUX.a
-
2.78. IaaAgc_GetJsonFileSize¶
-
功能
Agc获取解析Json文件内容所需要的内存大小
-
语法
unsigned int IaaAgc_GetJsonFileSize(char* jsonfile); -
形参
参数名称 描述 输入/输出 jsonfile Json檔名 输入 -
返回值
返回值为解析Json文件内容所需要的内存大小
-
依赖
-
头文件: AudioProcess.h
-
库文件: libAPC_LINUX.so/ libAPC_LINUX.a
-
2.79. IaaAgc_InitReadFromJson¶
-
功能
配置Json参数到Agc算法的初始化结构体指针
-
语法
ALGO_AGC_RET IaaAgc_InitReadFromJson(AudioProcessInit *agc_init, char* jsonBuffer, char* jsonfile, unsigned int buffSize); -
形参
参数名称 描述 输入/输出 agc_init Agc算法的初始化结构体指针 输入/输出 jsonBuffer 解析Json文件内容所使用的内存地址 输入 jsonfile Json檔名 输入 buffSize 解析Json文件内容所需要的内存大小 输入 -
返回值
返回值 结果 0 成功 非0 失败,参考错误码 -
依赖
-
头文件: AudioProcess.h
-
库文件: libAPC_LINUX.so/ libAPC_LINUX.a
-
2.80. IaaAgc_ConfigReadFromJson¶
-
功能
配置Json参数到Agc算法的结构体指针
-
语法
ALGO_AGC_RET IaaAgc_ConfigReadFromJson(AudioAgcConfig *agc_config, char* jsonBuffer, char* jsonfile, unsigned int buffSize); -
形参
参数名称 描述 输入/输出 agc_config 配置Agc算法的结构体指针 输入/输出 jsonBuffer 解析Json文件内容所使用的内存地址 输入 jsonfile Json檔名 输入 buffSize 解析Json文件内容所需要的内存大小 输入 -
返回值
返回值 结果 0 成功 非0 失败,参考错误码 -
依赖
-
头文件: AudioProcess.h
-
库文件: libAPC_LINUX.so/ libAPC_LINUX.a
-
2.81. IaaAgc_SetAgcReadFromJson¶
-
功能
配置Json参数到Agc频段数组
-
语法
ALGO_AGC_RET IaaAgc_SetAgcReadFromJson(int *freqBand, int *compressionRatioArrayLowInput, int *compressionRatioArrayLowOutput, int *compressionRatioArrayMidInput, int *compressionRatioArrayMidOutput, int *compressionRatioArrayHighInput, int *compressionRatioArrayHighOutput, char* jsonBuffer, char* jsonfile, unsigned int buffSize); -
形参
参数名称 描述 输入/输出 freqBand 频段数组,包含低频段上限频率,中频段上限频率,高段频段上限频率。
举例 : 当取样率为16K,frequency_band若设定为{3000,4000,8000}
则低频频段为03000Hz,中频为30004000 Hz,高频为4000~8000 Hz,须注意最高频率不能超过取样率的一半。输入/输出 compressionRatioArrayLowInput 压缩率输入,请参考agc_config中的compression ratio 输入/输出 compressionRatioArrayLowOutput 压缩率输出,请参考agc_config中的compression ratio 输入/输出 compressionRatioArrayMidInput 压缩率输入,请参考agc_config中的compression ratio 输入/输出 compressionRatioArrayMidOutput 压缩率输出,请参考agc_config中的compression ratio 输入/输出 compressionRatioArrayHighInput 压缩率输入,请参考agc_config中的compression ratio 输入/输出 compressionRatioArrayHighOutput 压缩率输出,请参考agc_config中的compression ratio 输入/输出 jsonBuffer 解析Json文件内容所使用的内存地址 输入 jsonfile Json檔名 输入 buffSize 解析Json文件内容所需要的内存大小 输入 -
返回值
返回值 结果 0 成功 非0 失败,参考错误码 -
依赖
-
头文件: AudioProcess.h
-
库文件: libAPC_LINUX.so/ libAPC_LINUX.a
-
2.82. IaaAnr_NrEstimateReferAec¶
-
功能
参考Aec线性处理结果做降噪处里,避免非线性Aec造成Anr收敛异常
-
语法
ALGO_ANR_RET IaaAnr_NrEstimateReferAec (ANR_HANDLE handle, short aec_in); -
形参
参数名称 描述 输入/输出 handle Anr算法handle 输入 aec_in 输入数据指针,提供给NR算法做噪声估算的数据,可使用麦克风数据或者Aec线性处理后结果 输入 -
返回值
返回值 结果 0 成功 非0 失败,参考错误码 -
依赖
-
头文件: AudioProcess.h
-
库文件: libAPC_LINUX.so/ libAPC_LINUX.a
-
-
注意
- 仅支持于AudioAnrConfig anr_filter_mode 0~4之情况。
2.83. IaaApc_FilterFreqz¶
-
功能
获取配置IaaApc_FilterDesign后,数个滤波器频响迭加之结果。
-
语法
ALGO_APC_RET IaaApc_FilterFreqz(APC_HANDLE handle, float* frequency_response); -
形参
参数名称 描述 输入/输出 handle Apc算法handle 输入 frequency_response 数个滤波器频响迭加之结果,以512个float的数组形式回传到frequency_response中 输入/输出 -
返回值
返回值 结果 0 成功 非0 失败,参考错误码 -
依赖
-
头文件: AudioProcess.h
-
库文件: libAPC_LINUX.so/ libAPC_LINUX.a
-
-
注意
可画出当前设计的所有数字滤波器的迭加出的频率响应,以512个float的数组形式回传到frequency_response参数中,建议使用者可以使用excel画出当前frequency response,数组512个值分别对应频率0到sample rate/2,frequency_response的值即代表gain值
-
举例
请参考IaaApc_FilterApply举例部分。
2.84. IaaEq_FilterFreqz¶
-
功能
获取配置IaaEq_FilterFreqz后,数个滤波器频响迭加之结果。
-
语法
ALGO_EQ_RET IaaEq_FilterFreqz(EQ_HANDLE handle, float* frequency_response); -
形参
参数名称 描述 输入/输出 handle Eq算法handle 输入 frequency_response 数个滤波器频响迭加之结果,以512个float的数组形式回传到frequency_response中 输入/输出 -
返回值
返回值 结果 0 成功 非0 失败,参考错误码 -
依赖
-
头文件: AudioProcess.h
-
库文件: libAPC_LINUX.so/ libAPC_LINUX.a
-
-
注意
可画出当前设计的所有数字滤波器的迭加出的频率响应,以512个float的数组形式回传到frequency_response参数中,建议使用者可以使用excel画出当前frequency response,数组512个值分别对应频率0到sample rate/2,frequency_response的值即代表gain值
-
举例
请参考IaaEq_FilterApply举例部分。
2.85. IaaApc_OptionReadFromJson¶
-
功能
配置Json参数到Apc算法的选项结构体指针
-
语法
ALGO_APC_RET IaaApc_OptionReadFromJson(AudioApcOption *apc_option, char* jsonBuffer, char* jsonfile, unsigned int buffSize); -
形参
参数名称 描述 输入/输出 apc_option Apc算法的选项结构体指针 输入/输出 jsonBuffer 解析Json文件内容所使用的内存地址 输入 jsonfile Json檔名 输入 buffSize 解析Json文件内容所需要的内存大小 输入 -
返回值
返回值 结果 0 成功 非0 失败,参考错误码 -
依赖
-
头文件: AudioProcess.h
-
库文件: libAPC_LINUX.so/ libAPC_LINUX.a
-
-
举例
请参考IaaApc_SwitchReadFromJson举例部分。
2.86. IaaApc_ReadJson¶
-
功能
配置通用Json参数到Apc算法
-
语法
ALGO_APC_RET IaaApc_ReadJson(APC_HANDLE handle, char* jsonBuffer, char* jsonfile, unsigned int buffSize); -
形参
参数名称 描述 输入/输出 handle Apc算法handle 输入 jsonBuffer 解析Json文件内容所使用的内存地址 输入 jsonfile Json檔名 输入 buffSize 解析Json文件内容所需要的内存大小 输入 -
返回值
返回值 结果 0 成功 非0 失败,参考错误码 -
依赖
-
头文件: AudioProcess.h
-
库文件: libAPC_LINUX.so/ libAPC_LINUX.a
-
-
注意
- 目前可使用AUDIO_APC_DUMP, AUDIO_ANR_DUMP, AUDIO_EQ_DUMP, AUDIO_EQ_DUMP, AUDIO_DUMP_PATH来控制dump机制开关,这些变量同样可以透过export的方式来开关,若有export环境变量,则以环境变量优先
- AUDIO_DUMP_PATH设置储存位置,字符串长度最最多40个char
-
可使用PRE_APC_GAIN, POST_APC_GAIN来设置IaaApc_Run内最初与最后的Gain值套用,可设定从-120到120分贝的范围,数据型态为浮点数,请参考下图

-
举例
{ "project": "APC", "AUDIO_APC_DUMP": 1, "AUDIO_ANR_DUMP": 1, "AUDIO_EQ_DUMP": 1, "AUDIO_AGC_DUMP": 1, "AUDIO_DUMP_PATH": "./", "PRE_APC_GAIN": 10.0, "POST_APC_GAIN": -5.0 }
2.87. IaaEq_ReadJson¶
-
功能
配置通用Json参数到Eq算法
-
语法
ALGO_EQ_RET IaaEq_ReadJson(EQ_HANDLE handle, char* jsonBuffer, char* jsonfile, unsigned int buffSize); -
形参
参数名称 描述 输入/输出 handle Eq算法handle 输入 jsonBuffer 解析Json文件内容所使用的内存地址 输入 jsonfile Json檔名 输入 buffSize 解析Json文件内容所需要的内存大小 输入 -
返回值
返回值 结果 0 成功 非0 失败,参考错误码 -
依赖
-
头文件: AudioProcess.h
-
库文件: libAPC_LINUX.so/ libAPC_LINUX.a
-
-
举例
请参考IaaApc_SwitchReadFromJson举例部分。
2.88. IaaAgc_ReadJson¶
-
功能
配置通用Json参数到Agc算法
-
语法
ALGO_AGC_RET IaaAgc_ReadJson(AGC_HANDLE handle, char* jsonBuffer, char* jsonfile, unsigned int buffSize); -
形参
参数名称 描述 输入/输出 handle Agc算法handle 输入 jsonBuffer 解析Json文件内容所使用的内存地址 输入 jsonfile Json檔名 输入 buffSize 解析Json文件内容所需要的内存大小 输入 -
返回值
返回值 结果 0 成功 非0 失败,参考错误码 -
依赖
-
头文件: AudioProcess.h
-
库文件: libAPC_LINUX.so/ libAPC_LINUX.a
-
-
举例
请参考IaaApc_SwitchReadFromJson举例部分。
3. APC 数据类型¶
3.1. APC模块相关数据类型定义¶
| 数据类型 | 定义 |
|---|---|
| AudioApcBufferConfig | Apc算法的buffer配置参数结构体类型 |
| AudioProcessInit | Apc算法初始化参数结构体类型 |
| APC_HANDLE | Apc算法的句柄类型 |
| AudioAnrConfig | Apc算法中的Anr配置参数结构体类型 |
| AudioEqConfig | Apc算法中的Eq配置参数结构体类型 |
| AudioHpfConfig | Apc算法中的Hpf配置参数结构体类型 |
| AudioAgcConfig | Apc算法中的Agc配置参数结构体类型 |
| AgcGainInfo | Apc算法中Agc的增益参数结构体类型 |
| IAA_APC_SAMPLE_RATE | Apc算法定义的取样率类型 |
| NR_CONVERGE_SPEED | Anr算法的收敛速度类型 |
| IAA_HPF_FREQ | Hpf算法的截止频率类型 |
| ANR_HANDLE | Anr算法的句柄类型 |
| EQ_HANDLE | Eq算法的句柄类型 |
| AGC_HANDLE | Agc算法的句柄类型 |
| APC_BF_HANDLE | 定义Apc 算法 BF搭配深度学习降噪算法中Bf 的句柄类型 |
| EQ_FILTER_TYPE | IIR滤波器类型 |
| AudioFilterConfig | Apc算法中的IIR滤波配置参数结构体类型 |
| CngStruct | 配置舒适噪声的结构体指针 |
| AudioApcOption | Apc算法中的的配置选项结构体类型 |
3.2. AudioApcBufferConfig¶
-
说明
定义Apc算法的功能选项参数结构体。
-
定义
typedef struct{ unsigned int anr_enable; unsigned int eq_enable; unsigned int dr_enable; unsigned int vad_enable; unsigned int agc_enable; }AudioApcBufferConfig; -
成员
成员名称 描述 anr_enable Apc算法中Anr启用选项,用于协助计算Apc算法运行所需要的内存大小 eq_enable Apc算法中Eq启用选项,用于协助计算Apc算法运行所需要的内存大小 dr_enable 算法等待开发中,目前没有效果,建议关闭 vad_enable Vad算法已建立独立模块,目前在APC中Vad已废弃,建议关闭 agc_enable Apc算法中Agc启用选项,用于协助计算Apc算法运行所需要的内存大小 -
注意事项
无
-
相关数据类型及接口
3.3. AudioProcessInit¶
-
说明
定义Apc(Anr/Eq/Hpf/Agc)算法的初始化参数结构体。
-
定义
typedef struct { unsigned int point_number; unsigned int channel; IAA_APC_SAMPLE_RATE sample_rate; }AudioProcessInit; -
成员
成员名称 描述 point_number 算法处理一次的数据量,即一个帧多少个采样点,值为128或256根据chip来决定需要给Apc多少个short值。 取值范围:128或256 (根据chip 决定) channel 数据的声道数,若为双声道,则每帧给Apc的数据则为point_number的两倍。 sample_rate 数据的取样频率 -
注意事项
无。
-
相关数据类型及接口
3.4. APC_HANDLE¶
-
说明
Apc算法句柄类型。
-
定义
typedef void* APC_HANDLE; -
成员
成员名称 描述 -
注意事项
无。
-
相关数据类型及接口
3.5. AudioAnrConfig¶
-
说明
定义Apc算法中的Anr配置参数结构体类型
-
定义
typedef struct{ unsigned int anr_enable; unsigned int user_mode; int anr_intensity_band[6]; int anr_intensity[7]; unsigned int anr_smooth_level; NR_CONVERGE_SPEED anr_converge_speed; int anr_filter_mode; }AudioAnrConfig; -
成员
成员名称 描述 anr_enable 是否启用Anr算法 user_mode Anr算法运行的模式 anr_intensity_band 降噪频率范围
范围[1,128];步长1anr_intensity 降噪强度,值越大降噪强度越高,但同时也会带来细节的丢失/损伤,建议值:10。
范围[0,30];步长1anr_smooth_level 频域平滑程度,建议值:10
范围[0,10];步长1anr_converge_speed 噪声收敛速度,建议值:NR_SPEED_MID
范围[NR_SPEED_LOW;NR_SPEED_MID;NR_SPEED_HIGH]anr_filter_mode 频域降噪滤波器
范围[0,6];步长1 -
注意事项
-
当anr_enable为FALSE时,其他的Anr参数也不会起作用。
-
user_mode指定Anr的运行模式。0,表示Anr算法完全不使用其他的Anr参数,而是使用Anr算法内部的设定;1或2表示完全使用应用下的Anr参数
-
anr_intensity_band,降噪频率范围,后一个元素必须大于等于前1个元素。
如:u32NrIntensityBand[0] = 10,则:u32NrIntensityBand[1]必须大于等于10。
当前取样率对应的最高频率平均分成128份,频率范围则是对应多少份组成一个频带。
如:当前取样率为16K,对应的最大频率为8K,每一份为8000 / 128 ≈ 62.5Hz。如在{4,6,36, 49,50,51}的设定下,降噪频率范围为{0 ~ 4 * 62.5Hz, 4 ~ 6 * 62.5Hz, 6 ~ 36 * 62.5Hz, 36 ~ 49 * 62.5Hz, 49 ~ 50 * 62.5Hz, 50 ~ 51 * 62.5Hz, 51-127 * 62.5Hz} = {0 ~ 250Hz, 250 ~ 375Hz, 375 ~ 2250Hz, 2250 ~ 3062.5Hz, 3062.5 ~ 3125Hz, 3125 ~ 3187.5Hz, 3187.5Hz ~ 8000Hz},anr_intensity为降噪强度,可根据anr_intensity_band的频带划分,针对各个频带的噪声情况设置不同的参数。
-
anr_smooth_level,Anr算法处理频域的平滑程度,避免噪声估计时,在相邻频率上的压抑差距过大导致声音损伤。
-
anr_converge_speed,Anr算法的收敛速度,更新噪声的速度快慢,设定越快降噪收敛越快,但副作用是带来细节的丢失/损伤。
-
anr_filter_mode指定Anr算法。0为原算法,1 ~ 4为不同噪音估测之降噪算法。5为使用深度学习之降噪算法。6为基于IPU之深度学习降噪算法。
-
当anr_filter_mode 指定5时,anr_converge_speed 必须为NR_SPEED_MID或是NR_SPEED_HIGH,另外anr_smooth_level参数不会影响此模式之结果。
-
当anr_filter_mode 指定5时,anr_converge_speed 为NR_SPEED_MID时,会牺牲部分降噪效果与收敛速度的同时,有效降低CPU使用量。
-
anr_filter_mode 5有两种版本,版本五是针对带宽0到8kHz的频率范围,并支持取样率8kHz、16kH及32kHz和每帧点数128点的设定。版本三是针对带宽0到16kHz的频率范围,只支持取样率32kHz和每帧点数256点的设定。推荐使用最新版anr_filter_mode 5版本五。anr_filter_mode 5的版本可以在终端机输入以下指令得知
strings libAPC_LINUX.a | grep ALGO -
当anr_filter_mode 指定6时,anr_smooth_level参数不会影响此模式之结果。
-
当anr_filter_mode 指定6时,anr_converge_speed 建议为 NR_SPEED_HIGH。
-
-
相关数据类型及接口
3.6. AudioEqConfig¶
-
说明
定义Apc算法中的Eq配置参数结构体类型。
-
定义
typedef struct{ unsigned int eq_enable; unsigned int user_mode; short eq_gain_db[129]; }AudioEqConfig; -
成员
成员名称 描述 eq_enable 是否启用Eq算法 user_mode Eq算法的运行模式 eq_gain_db Eq算法增益调节取值,将当前取样率的频率范围分成129个频率范围来进行调节,单位为1dB 范围[-100,20];步长1 -
注意事项
-
当eq_enable为FALSE时,其他的Eq参数也不会起作用。
-
user_mode指定Eq的运行模式。0,表示Eq使用预设的参数,预设参数全为0,不做任何增益或衰减;1,表示完全使用应用下的Eq参数。
-
eq_gain_db为增益调节的table,将当前取样率的频率范围分成129个频率范围来进行调节。如:当前取样率为16K,对应的最高频率为8K,8000 / 129 ≈ 62Hz,则单个调节的频率范围为62Hz,将0-8K划分成{0-1 * 62Hz,1-2 * 62Hz,2-3 * 62Hz,…,128-129 * 62Hz} = {0-62Hz,62-124Hz,124-186Hz,…,7938-8000Hz},每段对应一个增益值。
-
-
相关数据类型及接口
3.7. AudioHpfConfig¶
-
说明
定义Apc算法中的Hpf配置参数结构体类型。
-
定义
typedef struct{ unsigned int hpf_enable; unsigned int user_mode; IAA_HPF_FREQ cutoff_frequency; }AudioHpfConfig; -
成员
成员名称 描述 hpf_enable 是否启用Hpf算法 user_mode Hpf算法的运行模式,设定1为频域处理模式,设定2为时域处理模式 cutoff_frequency Hpf的截止频率,范围:[0,1,2,3,4] -
注意事项
-
当hpf_enable为FALSE时,其他的Hpf参数也不会起作用。
-
user_mode指定Hpf的运行模式。0,表示预设的参数,不做任何衰减;1,表示应用使用者所设定的Hpf参数,Hpf算法应用在频域,APC的内部的算法串接流程为ANR → EQ/HPF → AGC;2,表示应用使用者所设定的Hpf参数,Hpf算法应用在时域,APC的内部的算法串接流程为HPF → ANR → EQ → AGC。
-
cutoff_frequency为Hpf的截止频率,低于此频率的信号会被过滤掉。
-
若只需要使用Hpf算法,hpf_enable为TRUE,AudioEqConfig中eq_enable设定成FALSE,也请设定AudioApcBufferConfig中eq_enable为TRUE,使得系统可以透过IaaApc_GetBufferSize获取算法运行所需要正确的内存大小。
-
-
相关数据类型及接口
3.8. AudioAgcConfig¶
-
说明
定义Apc算法中的Agc配置参数结构体类型。
-
定义
typedef struct { unsigned int agc_enable; unsigned int user_mode; //gain setting AgcGainInfo gain_info; unsigned int drop_gain_max; //attack time, release time unsigned int attack_time; unsigned int release_time; //target level short compression_ratio_input[7]; short compression_ratio_output[7]; int drop_gain_threshold; // noise gate int noise_gate_db; unsigned int noise_gate_attenuation_db; unsigned int gain_step; }AudioAgcConfig; -
成员
成员名称 描述 agc_enable 是否启用Agc算法 user_mode Agc算法的运行模式,设定1为时域处理模式,设定2为频域处理模式,频域处理对应API请参考下方注意事项部分 gain_info Agc算法的增益信息,定义AGC增益的最大、最小和初始值 drop_gain_max 瞬间增益下降的最大值,防止输出饱和,若输出加上当前Gain超出drop_gain_threshold所设定的dB值,Agc会瞬间降低Gain避免当前信号的峰值超过drop_gain_threshold。 范围[0,120];步长1 注意:此值仅代表能下降的范围,但具体能下降到何值还需参考AGC增益的最小值。 attack_time 增益下降的时间步长,以4毫秒为1单位,若设定2则为8毫秒判断一次是否降Gain 范围[1,99];步长1 release_time 增益增加的时间步长,以4毫秒为1单位,若设定2则为8毫秒判断一次是否升Gain 范围[1,99] ;步长1 compression_ratio_input 配合compression_ratio_output 使用,透过多个转折点实现多斜率的曲线,得到input power level跟output power level之间的关系。 范围[-120,0]dBFS;步长1 compression_ratio_output 配合compression_ratio_input使用,透过多个转折点实现多斜率的曲线,得到input power level跟output power level之间的关系。 范围[-120,0]dBFS;步长1 drop_gain_threshold 衰减阈值,当信号峰值幅度超过此值后,会瞬间衰减,衰减幅度受drop_gain_max跟gain_info所限制。 范围[-120,0]dB;步长1 noise_gate_db 噪声阈值,当信号小于此值时,当作噪声处理, Case1: 若设定noise_gate_db 从-80到0,当前gain值会根据release/attack time的时间将Gain值收敛成0。 Case2: 若设定noise_gate_db 从1到80,当信号小于此值时,Gain值将不会做更改,会保留前一帧的Gain值。 范围[-120,120];步长1 noise_gate_attenuation_db 当噪声阈值起效果时,输入源的衰减百分比 范围[0,100];步长1 gain_step 套用增益的速率,以0.5dB为一个单位,若设定为1,则每帧依照需求套用±0.5dB。 此值设定的越高,拉升和降低音量的速率越快。 范围[1,10]; 步长1 -
注意事项
-
当agc_enable为FALSE时,其他的Agc参数也不会起作用。
-
user_mode指定Agc的运行模式。0,表示Agc算法完全不使用其他的Agc参数,而是使用Agc算法内部的设定;1,表示完全使用应用下的Agc参数。
-
Compression ratio
Curve定义输入输出能量之间的关系,透过设定七个点可以得到六段不同的斜率转折,举例来说,参数设定如下:
compression_ratio_input[7] = {-80, -60, -50,-40,-30,-12,0} compression_ratio_output[7] = {-80, -45, -36, -27, -18, -9, -6}得到的曲线如下图所示

若不需这么多段不同斜率,可以将最后的compression ratio参数设成0,如下参数
compression_ratio_input[7] = {-70, -60, -30, 0,0,0,0}; compression_ratio_output[7] = {-60, -50, -10, -3, 0,0,0};曲线如下图

-
Noise gate设定有两种模式,可以将Gain收敛到0或维持Gain值不变,收敛到0的状况可避免小于noise gate的信号被放大,维持噪声稳定度,维持Gain值不变可避免语音的起头与尾音消失的"呼吸现象"。
-
设定user mode为2,开启频域处理模式,请参考下列API配合使用
IaaApc_SetLowFreqCompressionRatioCurve
IaaApc_SetMidFreqCompressionRatioCurve
IaaApc_SetHighFreqCompressionRatioCurve
IaaAgc_SetLowFreqCompressionRatioCurve
IaaAgc_SetMidFreqCompressionRatioCurve
-
-
相关数据类型及接口
3.9. AgcGainInfo¶
-
说明
定义Apc算法中Agc的增益参数结构体类型。
-
定义
typedef struct { int gain_max; //gain maximum int gain_min; //gain minimum int gain_init; //default gain (initial gain) }AgcGainInfo; -
成员
成员名称 描述 gain_max 增益最大值 范围[-120,100];步长1 gain_min 增益最小值 范围[-120,100];步长1 gain_init 增益初始值 范围[-100,100];步长1 -
注意事项
无。
-
相关数据类型及接口
3.10. IAA_APC_SAMPLE_RATE¶
-
说明
定义Apc算法中的取样率类型。
-
定义
typedef enum { IAA_APC_SAMPLE_RATE_8000 = 8000 , IAA_APC_SAMPLE_RATE_16000 = 16000 , IAA_APC_SAMPLE_RATE_32000 = 32000 , IAA_APC_SAMPLE_RATE_48000 = 48000 , }IAA_APC_SAMPLE_RATE; -
成员
成员名称 描述 IAA_APC_SAMPLE_RATE_8000 8K取样率 IAA_APC_SAMPLE_RATE_16000 16K取样率 IAA_APC_SAMPLE_RATE_32000 32K取样率 IAA_APC_SAMPLE_RATE_48000 48K取样率 -
注意事项
无。
-
相关数据类型及接口
3.11. NR_CONVERGE_SPEED¶
-
说明
定义Apc算法中Anr收敛速度类型。
-
定义
typedef enum { NR_SPEED_LOW, NR_SPEED_MID, NR_SPEED_HIGH } NR_CONVERGE_SPEED; -
成员
成员名称 描述 NR_SPEED_LOW 低速 NR_SPEED_MID 中速 NR_SPEED_HIGH 高速 -
注意事项
- NR收敛速度低/中/高分别代表3/2/1帧更新一次噪声压抑
-
相关数据类型及接口
3.12. IAA_HPF_FREQ¶
-
说明
定义Apc算法中Hpf截止频率类型。
-
定义
typedef enum { AUDIO_HPF_FREQ_80 , /* 80Hz*/ AUDIO_HPF_FREQ_120, /*120Hz*/ AUDIO_HPF_FREQ_150, /*150Hz*/ AUDIO_HPF_FREQ_500, /*500Hz*/ AUDIO_HPF_FREQ_BUTT, }IAA_HPF_FREQ; -
成员
成员名称 描述 AUDIO_HPF_FREQ_80 80Hz AUDIO_HPF_FREQ_120 120Hz AUDIO_HPF_FREQ_150 150Hz AUDIO_HPF_FREQ_500 500Hz AUDIO_HPF_FREQ_BUTT -
相关数据类型及接口
3.13. ANR_HANDLE¶
-
说明
定义Anr算法的指针类型。
-
定义
typedef void* ANR_HANDLE; -
相关数据类型及接口
3.14. EQ_HANDLE¶
-
说明
定义Eq算法的指针类型。
-
定义
typedef void* EQ_HANDLE; -
相关数据类型及接口
3.15. AGC_HANDLE¶
-
说明
定义Agc算法的指针类型。
-
定义
typedef void* AGC_HANDLE; -
相关数据类型及接口
3.16. APC_BF_HANDLE¶
-
说明
定义Apc算法Bf搭配深度学习降噪算法中Bf的指针类型
-
定义
typedef void* APC_BF_HANDLE; -
相关数据类型及接口
-
注意事项
- 此指针仅适用BF模式3 以及 AudioAnrConfig 中anr_filter_mode 5做增强之情况,其余模式不会有影响。
3.17. EQ_FILTER_TYPE¶
-
功能
定义Apc算法中IIR滤波器类型。
-
语法
typedef enum { EQ_NOTCH_FILTER , EQ_HIGH_PASS_FILTER, EQ_LOW_PASS_FILTER, }EQ_FILTER_TYPE; -
Member
Member name Description EQ_NOTCH_FILTER 带阻滤波器 EQ_HIGH_PASS_FILTER 高通滤波器 EQ_LOW_PASS_FILTER 低通滤波器 -
相关数据类型及接口
3.18. AudioFilterConfig¶
-
功能
定义Apc算法中iir滤波的参数结构体类型。
-
语法
typedef struct{ EQ_FILTER_TYPE type; int f0; int q_factor; int gain; }AudioFilterConfig; -
成员
成员名称 描述 type 滤波器类型,根据EQ_FILTER_TYPE设定 f0 滤波中心频率,最大值不能超过奈奎斯特频 q_fctor 滤波峰值带宽 gain 峰值增益 -
相关数据类型及接口
-
注意
-
type
分成3种,分别为notch filter/high-pass filter/low-pass filter,三种filter的典型Frequency response请参考下图
- Notch fitler 是针对特定频率去压抑或增益
- High-pass filter 是压抑特定频率以下的能量
- Low-pass filter 是压抑特定频率以上的能量

-
f0
对HPF跟LPF来说是转折频率,频响曲线的拐弯处,所谓-3dB频率点,而对Notch filter来说是center frequency,如下图所示

-
q_fctor
Q值为品质因子,下面为Q值之公式,f_0与f_1与f_2请参考上图 Q=\frac{f_0}{f_2-f_1}
-
gain
Gain为增益,对HPF跟LPF来说是稳定状态的增益,对Notch filter来说是Peak的值
filter_design.q_factor = 1; filter_design.f0 = 2000; filter_design.type = EQ_HIGH_PASS_FILTER; filter_design.gain = 3;画出的频响曲线如下图

filter_design.q_factor = 1; filter_design.f0 = 2000; filter_design.type = EQ_NOTCH_FILTER; filter_design.gain = 3;画出的频响曲线如下图

-
3.19. CngStruct¶
-
功能
配置舒适噪声的结构体指针。
-
语法
typedef struct { int energy_dbfs; short point_number; int channel_num; }CngStruct; -
成员
成员名称 描述 energy_dbfs 欲迭加之舒适噪声能量 point_number 输入讯号之长度 channel_num 输入讯号之信道数 -
相关数据类型及接口
-
注意事项
- 使用此API并为双信道模式时,讯号应为左右声道交叉排列
3.20. AudioApcOption¶
-
功能
Apc算法中的的配置选项结构体类型。
-
语法
typedef struct { int digital_gain[10]; }AudioApcOption; -
成员
成员名称 描述 digital_gain 欲对输入数据做增益或衰减的能量大小 -
相关数据类型及接口
-
注意事项
-
最多一次设定10组digital_gain,并搭配IaaApc_ApplyDigitalGain使用。
-
digital_gain设定范围请参考 IaaApc_ApplyDigitalGain。
-
4. 错误码¶
APC API 错误码如下表所示:
表 4‑1 APC API错误码
| 错误码 | 宏定义 | 描述 |
|---|---|---|
| 0x00000000 | ALGO_APC_RET_SUCCESS | APC运行成功 |
| 0x10000501 | ALGO_APC_RET_INIT_ERROR | APC尚未初始化 |
| 0x10000502 | ALGO_APC_RET_INVALID_HANDLE | HANDLE无效 |
| 0x10000503 | ALGO_APC_RET_INVALID_SAMPLE_RATE | 取样频率不支持 |
| 0x10000504 | ALGO_APC_RET_INVALID_POINT_NUMBER | 每帧点数不支援 |
| 0x10000505 | ALGO_APC_RET_INVALID_CHANNEL | 通道数不支持 |
| 0x10000506 | ALGO_APC_ANR_RET_INVALID_ENABLE | ANR开关参数设置无效 |
| 0x10000507 | ALGO_APC_ANR_RET_INVALID_MODE | ANR模式参数设置无效 |
| 0x10000508 | ALGO_APC_ANR_RET_INVALID_INTENSITY | ANR强度参数设置无效 |
| 0x10000509 | ALGO_APC_ANR_RET_INVALID_SMOOTH_LEVEL | ANR平滑化参数设置无效 |
| 0x10000510 | ALGO_APC_ANR_RET_INVALID_COVERGE_SPEED | ANR收敛速度参数设置无效 |
| 0x10000511 | ALGO_APC_EQ_RET_INVALID_ENABLE | EQ开关参数设置无效 |
| 0x10000512 | ALGO_APC_EQ_RET_INVALID_MODE | EQ模式参数设置无效 |
| 0x10000513 | ALGO_APC_EQ_RET_INVALID_TABLE | EQ参数设置无效 |
| 0x10000514 | ALGO_APC_HPF_RET_INVALID_ENABLE | HPF开关参数设置无效 |
| 0x10000515 | ALGO_APC_HPF_RET_INVALID_MODE | HPF模式参数设置无效 |
| 0x10000516 | ALGO_APC_HPF_RET_INVALID_TABLE | HPF参数设置无效 |
| 0x10000517 | ALGO_APC_AGC_RET_INVALID_ENABLE | AGC开关参数设置无效 |
| 0x10000518 | ALGO_APC_AGC_RET_INVALID_MODE | AGC模式参数设置无效 |
| 0x10000519 | ALGO_APC_AGC_RET_INVALID_COMPRESSION_RATIO | AGC压缩曲线参数设置无效 |
| 0x10000520 | ALGO_APC_AGC_RET_INVALID_FREQUENCY_BAND | AGC频段设置无效 |
| 0x10000521 | ALGO_APC_AGC_RET_INVALID_DROP_GAIN_MAX | AGC防饱和参数设置无效 |
| 0x10000522 | ALGO_APC_AGC_RET_INVALID_GAIN_STEP | AGC套用增益速率设置无效 |
| 0x10000523 | ALGO_APC_AGC_RET_INVALID_RELEASE_TIME | AGC复原时间参数设置无效 |
| 0x10000524 | ALGO_APC_AGC_RET_INVALID_ATTACK_TIME | AGC削减时间参数设置无效 |
| 0x10000525 | ALGO_APC_AGC_RET_INVALID_NOISE_GATE | AGC噪声阀值参数设置无效 |
| 0x10000526 | ALGO_APC_AGC_RET_INVALID_NOISE_ATTENU | AGC噪声衰减设置无效 |
| 0x10000527 | ALGO_APC_AGC_RET_INVALID_DROP_GAIN_LEVEL | AGC防饱和阀值参数设置无效 |
| 0x10000528 | ALGO_APC_AGC_RET_INVALID_GAIN_INFO | AGC增益限制参数设置无效 |
| 0x10000529 | ALGO_APC_RET_API_CONFLICT | 其他API正在运行 |
| 0x10000530 | ALGO_APC_RET_INVALID_CALLING | 呼叫API顺序错误 |
| 0x10000531 | ALGO_APC_RET_FAILED | 参数设置错误 |