MI APC API
1. 概述¶
1.1. 算法说明¶
APC(Audio Process Chain)音频处理链路,是一个包含降噪、均衡器和自动增益控制的算法组合。APC的主要目的是提高音频质量。APC的内部的算法串接流程为ANR → EQ/HPF → AGC。透过降噪消除噪声提升SNR,再根据客户所需曲线调整EQ/HPF,最后输出透过AGC放大或压抑。
1.2. 关键词说明¶
-
AGC
AGC(Automatic Gain Control),自动增益控制,用于控制数字输出增益。
-
EQ
EQ(Equalizer),均衡器处理,用于对特定频段进行增益或衰减。
-
ANR
ANR(Acoustic Noise Reduction),降噪,用于去除环境中持续存在,频率固定的噪声。
-
HPF
HPF(High-Pass Filtering),高通滤波。
1.3. 注意¶
为方便调试和确认算法效果,需要用户应用自行实现替换算法参数和抓取音频数据的逻辑。
2. API 参考¶
2.1. 功能模块API¶
API名 | 功能 |
---|---|
IaaApc_GetBufferSize | 获取Apc算法运行所需要的内存大小 |
IaaApc_Init | 初始化Apc算法 |
IaaApc_Config | 配置Apc算法 |
IaaApc_GetNrResult | 获取Apc算法Anr的输出数据 |
IaaApc_GetNrEqResult | 获取Apc算法Anr和Eq的输出数据 |
IaaApc_Run | Apc算法处理 |
IaaApc_Free | 释放Apc算法资源 |
IaaApc_Reset | 重新初始化Apc算法 |
IaaApc_GetConfig | 获取Apc算法当前的配置参数 |
IaaAnr_GetBufferSize | 获取Anr算法运行所需要的内存大小 |
IaaAnr_Init | 初始化Anr算法 |
IaaAnr_Config | 配置Anr算法 |
IaaAnr_Run | Anr算法处理 |
IaaAnr_Free | 释放Anr算法资源 |
IaaAnr_Reset | 重新初始化Anr算法 |
IaaAnr_GetConfig | 获取Anr算法当前的配置参数 |
IaaEq_GetBufferSize | 获取Eq算法运行所需要的内存大小 |
IaaEq_Init | 初始化Eq算法 |
IaaEq_Config | 配置Eq算法 |
IaaEq_Run | Eq算法处理 |
IaaEq_Free | 释放Eq算法资源 |
IaaEq_Reset | 重新初始化Eq算法 |
IaaEq_GetConfig | 获取Eq算法当前的配置参数 |
IaaAgc_GetBufferSize | 获取Agc算法运行所需要的内存大小 |
IaaAgc_Init | 初始化Agc算法 |
IaaAgc_Config | 配置Agc算法 |
IaaAgc_Run | Agc算法处理 |
IaaAgc_Free | 释放Agc算法资源 |
IaaAgc_Reset | 重新初始化Agc算法 |
IaaAgc_GetConfig | 获取当前Agc算法的配置参数 |
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算法支持8K/16K/48K采样率,HPF仅支援8K/16K采样率。
-
举例
请参考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_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.6. IaaApc_GetNrEqResult¶
-
功能
获取Apc算法中Anr和Eq的处理结果
-
语法
ALGO_APC_RET IaaApc_GetNrEqResult(APC_HANDLE handle,short*nr_eq_audio_out);
-
形参
参数名称 描述 输入/输出 handle Aec算法handle 输入 nr_eq_audio_out Anr和Eq处理输出数据指针 输出 -
返回值
返回值 结果 0 成功 非0 失败,参考错误码 -
依赖
-
头文件: AudioProcess.h
-
库文件: libAPC_LINUX.so/ libAPC_LINUX.a
-
-
注意
- 必须使能Apc算法中的Anr和Eq,才能调用此接口获取数据。
-
举例
请参考IaaApc_Run举例部分。
2.7. 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所指向的内存中。
-
举例
#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 float AVERAGE_RUN(int a) { static unsigned int num = 0; static float avg = 0; if(0 == num) 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 in_output[1024]; unsigned int T0, T1; float avg = 0; char src_file[128]; char dst_file[128]; int counter = 0; unsigned int workingBufferSize; char *workingBuffer = NULL; AudioApcBufferConfig apc_switch; FILE *fpIn, * fpOut; ALGO_APC_RET ret; AudioProcessInit apc_init; AudioAnrConfig anr_config; AudioEqConfig eq_config; AudioHpfConfig hpf_config; AudioAgcConfig agc_config; APC_HANDLE handle; /****************************User change section start**********************************/ int intensity_band[6] = {3,24,40,64,80,128}; int intensity[7] = {30,30,30,30,30,30,30}; short eq_table[129]; memset(eq_table, 0, sizeof(eq_table)); short compression_ratio_input[7] = {-65,-55,-48,-25,-18,-12,0}; short compression_ratio_output[7] = {-65,-50,-27,-12,-1,-1,-1}; apc_switch.anr_enable = 1; apc_switch.eq_enable = 1; apc_switch.agc_enable = 1; apc_init.point_number = 128; apc_init.channel = 1; apc_init.sample_rate = IAA_APC_SAMPLE_RATE_16000; /******ANR Config*******/ anr_config.anr_enable = apc_switch.anr_enable; anr_config.user_mode = 2; memcpy(anr_config.anr_intensity_band, intensity_band, sizeof(intensity_band)); memcpy(anr_config.anr_intensity, intensity, sizeof(intensity)); anr_config.anr_smooth_level = 10; anr_config.anr_converge_speed = 0; /******EQ Config********/ eq_config.eq_enable = apc_switch.eq_enable; eq_config.user_mode = 1; memcpy(eq_config.eq_gain_db, eq_table, sizeof(eq_table)); /******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, sizeof(compression_ratio_input)); memcpy(agc_config.compression_ratio_output, compression_ratio_output, sizeof(compression_ratio_output)); agc_config.noise_gate_attenuation_db = 0; agc_config.drop_gain_threshold = -5; /****************************User change section end***********************************/ //(1)IaaApc_GetBufferSize workingBufferSize = IaaApc_GetBufferSize(&apc_switch); workingBuffer = (char*)malloc(workingBufferSize); if(NULL == workingBuffer) { printf("malloc workingBuffer failed !\n"); return -1; } printf("malloc workingBuffer succeed !\n"); //(2)IaaApc_Init handle = IaaApc_Init(workingBuffer, &apc_init, &apc_switch); if(NULL == handle) { printf("IaaApc_Init failed !\n"); return -1; } printf("IaaApc_Init succeed !\n"); //(3)IaaApc_Config if(IaaApc_Config(handle, &anr_config, &eq_config, &hpf_config, NULL, NULL, &agc_config)) { printf("IaaApc_Config failed !\n"); return -1; } printf("IaaApc_Config succeed !\n"); #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("src_file open failed !\n"); return -1; } printf("src_file open succeed !\n"); fpOut = fopen(dst_file, "wb"); if(NULL == fpOut) { printf("dst_file open failed !\n"); return -1; } printf("dst_file open succeed !\n"); #if 1 fread(in_output, sizeof(char), 44, fpIn); fwrite(in_output, sizeof(char), 44, fpOut); #endif while(fread(in_output, sizeof(short), apc_init.point_number * apc_init.channel, fpIn)) { counter++; T0 = (long)_OsCounterGetMs(); ret = IaaApc_Run(handle, in_output); T1 = (long)_OsCounterGetMs(); avg += (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(ret) { printf("Error occured in NoiseReduct\n"); break; } fwrite(in_output, sizeof(short), apc_init.point_number * apc_init.channel, fpOut); } avg /= counter; printf("AVG is %.2f ms\n", avg); IaaApc_Free(handle); free(workingBuffer); fclose(fpIn); fclose(fpOut); printf("APC end !\n"); return 0; }
2.8. IaaApc_Free¶
-
功能
释放Apc算法资源
-
语法
ALGO_APC_RET IaaApc_Free(APC_HANDLE handle);
-
形参
参数名称 描述 输入/输出 handle Apc算法handle 输入 -
返回值
无。
-
依赖
-
头文件: AudioProcess.h
-
库文件: libAPC_LINUX.so/ libAPC_LINUX.a
-
-
注意
无。
-
举例
请参考IaaApc_Run举例部分。
2.9. 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.10. 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.11. IaaAnr_GetBufferSize¶
-
功能
获取Anr算法运行所需要的内存大小。
-
语法
unsigned int IaaAnr_GetBufferSize(void);
-
形参
参数名称 描述 输入/输出 -
返回值
返回值为Anr算法运行所需要的内存大小
-
依赖
-
头文件: AudioProcess.h
-
库文件: libAPC_LINUX.so/ libAPC_LINUX.a
-
-
注意
该接口仅返回需要的内存大小,申请和释放内存的动作需应用来处理。
-
举例
请参考IaaAnr_Run举例部分。
2.12. 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/48K采样率。
-
举例
请参考IaaAnr_Run举例部分。
2.13. IaaAnr_Config¶
-
功能
配置Anr算法。
-
语法
ALGO_APC_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.14. IaaAnr_Run¶
-
功能
Anr算法处理
-
语法
ALGO_APC_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_smooth_level = 10; anr_config.anr_converge_speed = 0; /*********************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.15. IaaAnr_Free¶
-
功能
释放Anr算法资源
-
语法
ALGO_APC_RET IaaAnr_Free(ANR_HANDLE handle);
-
形参
参数名称 描述 输入/输出 handle Anr算法handle 输入 -
返回值
无。
-
依赖
-
头文件: AudioProcess.h
-
库文件: libAPC_LINUX.so/ libAPC_LINUX.a
-
-
注意
无。
-
举例
请参考IaaAnr_Run举例部分。
2.16. 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.17. IaaAnr_GetConfig¶
-
功能
获取Anr算法的当前配置参数
-
语法
ALGO_APC_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.18. IaaEq_GetBufferSize¶
-
功能
获取Eq算法运行所需要的内存大小。
-
语法
unsigned int IaaEq_GetBufferSize(void);
-
形参
参数名称 描述 输入/输出 -
返回值
返回值为Eq算法运行所需要的内存大小
-
依赖
-
头文件: AudioProcess.h
-
库文件: libAPC_LINUX.so/ libAPC_LINUX.a
-
-
注意
该接口仅返回需要的内存大小,申请和释放内存的动作需应用来处理。
-
举例
请参考IaaEq_Run举例部分。
2.19. 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算法支持8K/16K/48K采样率,Hpf仅支援8K/16K采样率。
-
举例
请参考IaaEq_Run举例部分。
2.20. IaaEq_Config¶
-
功能
配置Eq算法。
-
语法
ALGO_APC_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.21. IaaEq_Run¶
-
功能
Eq算法处理
-
语法
ALGO_APC_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.22. IaaEq_Free¶
-
功能
释放Eq算法资源
-
语法
ALGO_APC_RET IaaEq_Free(EQ_HANDLE handle);
-
形参
参数名称 描述 输入/输出 handle Eq算法handle 输入 -
返回值
无。
-
依赖
-
头文件: AudioProcess.h
-
库文件: libAPC_LINUX.so/ libAPC_LINUX.a
-
-
注意
无。
-
举例
请参考IaaEq_Run举例部分。
2.23. 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.24. IaaEq_GetConfig¶
-
功能
获取Eq算法的当前配置参数
-
语法
ALGO_APC_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.25. IaaAgc_GetBufferSize¶
-
功能
获取Agc算法运行所需要的内存大小。
-
语法
unsigned int IaaAgc_GetBufferSize(void);
-
形参
参数名称 描述 输入/输出 -
返回值
返回值为Agc算法运行所需要的内存大小
-
依赖
-
头文件: AudioProcess.h
-
库文件: libAPC_LINUX.so/ libAPC_LINUX.a
-
-
注意
该接口仅返回需要的内存大小,申请和释放内存的动作需应用来处理。
-
举例
请参考IaaAgc_Run举例部分。
2.26. 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/48K采样率。
-
举例
请参考IaaAgc_Run举例部分。
2.27. IaaAgc_Config¶
-
功能
配置Agc算法。
-
语法
ALGO_APC_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.28. IaaAgc_Run¶
-
功能
Agc算法处理
-
语法
ALGO_APC_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}; 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 = 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.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"); //(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"); #if 1 fread(in_output, sizeof(char), 44, fpIn); fwrite(in_output, sizeof(char), 44, fpOut); #endif 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.29. IaaAgc_Free¶
-
功能
释放Agc算法资源
-
语法
ALGO_APC_RET IaaAgc_Free(AGC_HANDLE handle);
-
形参
参数名称 描述 输入/输出 handle Agc算法handle 输入 -
返回值
无。
-
依赖
-
头文件: AudioProcess.h
-
库文件: libAPC_LINUX.so/ libAPC_LINUX.a
-
-
注意
无。
-
举例
请参考IaaAgc_Run举例部分。
2.30. 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.31. IaaAgc_GetConfig¶
-
功能
获取Agc算法的当前配置参数
-
语法
ALGO_APC_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举例部分。
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算法的句柄类型 |
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 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; }AudioAnrConfig;
-
成员
成员名称 描述 anr_enable 是否使能Anr算法 user_mode Anr算法运行的模式 anr_intensity_band 降噪频率范围 范围[1,127];步长1 anr_intensity 降噪强度,值越大降噪强度越高,但同时也会带来细节的丢失/损伤,建议值:10。 范围[0,30];步长1 anr_smooth_level 频域平滑程度,建议值:10 范围[0,10];步长1 anr_converge_speed 噪声收敛速度,建议值:mid 范围[low;mid;high] -
注意事项
-
当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算法的收敛速度,更新噪声的速度快慢,设定越快降噪收敛越快,但副作用是带来细节的丢失/损伤。
-
-
相关数据类型及接口
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 范围[-50,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算法的运行模式 cutoff_frequency Hpf的截止频率 范围:[80,120,150] -
注意事项
-
当hpf_enable为FALSE时,其他的Hpf参数也不会起作用。
-
user_mode指定Hpf的运行模式。0,表示预设的参数,不做任何衰减;1,表示使用应用下的Hpf参数。
-
cutoff_frequency为Hpf的截止频率,低于此频率的信号会被过滤掉。
-
-
相关数据类型及接口
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算法的运行模式 gain_info Agc算法的增益信息,定义AGC增益的最大、最小和初始值 drop_gain_max 瞬间增益下降的最大值,防止输出饱和,若输出加上当前Gain超出drop_gain_threshold所设定的dB值,Agc会瞬间降低Gain避免当前信号的峰值超过drop_gain_threshold。 范围[0,60];步长1 注意:此值仅代表能下降的范围,但具体能下降到何值还需参考AGC增益的最小值。 attack_time 增益下降的时间步长,以4毫秒为1单位,若设定2则为8毫秒判断一次是否降Gain 范围[1,20];步长1 release_time 增益增加的时间步长,以4毫秒为1单位,若设定2则为8毫秒判断一次是否升Gain 范围[1, 20] ;步长1 compression_ratio_input 配合compression_ratio_output 使用,透过多个转折点实现多斜率的曲线,得到input power level跟output power level之间的关系。 范围[-80,0]dBFS;步长1 compression_ratio_output 配合compression_ratio_input使用,透过多个转折点实现多斜率的曲线,得到input power level跟output power level之间的关系。 范围[-80,0]dBFS;步长1 drop_gain_threshold 衰减阈值,当信号峰值幅度超过此值后,会瞬间衰减,衰减幅度受drop_gain_max跟gain_info所限制。 范围[-80,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值。 范围[-80,80];步长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值不变可避免语音的起头与尾音消失的"呼吸现象"。
-
-
相关数据类型及接口
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 增益最大值 范围[0,60];步长1 gain_min 增益最小值 范围[-20,30];步长1 gain_init 增益初始值 范围[-20,60];步长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_48000 = 48000 ,
}IAA_APC_SAMPLE_RATE;
-
成员
成员名称 描述 IAA_APC_SAMPLE_RATE_8000 8K采样率 IAA_APC_SAMPLE_RATE_16000 16K采样率 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_BUTT, }IAA_HPF_FREQ;
-
成员
成员名称 描述 AUDIO_HPF_FREQ_80 80Hz AUDIO_HPF_FREQ_120 120Hz AUDIO_HPF_FREQ_150 150Hz 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;
-
成员
成员名称 描述 -
注意事项
无。
-
相关数据类型及接口
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_DROP_GAIN_MAX | AGC防饱和参数设置无效 |
0x10000521 | ALGO_APC_AGC_RET_INVALID_GAIN_STEP | AGC套用增益速率设置无效 |
0x10000522 | ALGO_APC_AGC_RET_INVALID_RELEASE_TIME | AGC复原时间参数设置无效 |
0x10000523 | ALGO_APC_AGC_RET_INVALID_ATTACK_TIME | AGC削减时间参数设置无效 |
0x10000524 | ALGO_APC_AGC_RET_INVALID_NOISE_GATE | AGC噪声阀值参数设置无效 |
0x10000525 | ALGO_APC_AGC_RET_INVALID_NOISE_ATTENU | AGC噪声衰减设置无效 |
0x10000526 | ALGO_APC_AGC_RET_INVALID_DROP_GAIN_LEVEL | AGC防饱和阀值参数设置无效 |
0x10000527 | ALGO_APC_AGC_RET_INVALID_GAIN_INFO | AGC增益限制参数设置无效 |
0x10000528 | ALGO_APC_RET_API_CONFLICT | 其他API正在运行 |
0x10000529 | ALGO_APC_RET_INVALID_CALLING | 呼叫API顺序错误 |
0x10000530 | ALGO_APC_RET_FAILED | 参数设置错误 |