跳转至

SGS APC 算法使用参考


REVISION HISTORY

Revision No.
Description
Date
1.0
  • Initial release
  • 09/09/2020
    1.1
  • Modified API
  • 10/15/2020
    1.2
  • Add parameter in AGC config
  • 12/17/2020
    1.3
  • Add parameter in ANR config
  • 08/03/2021
    1.4
  • Add frequency domain DRC in AGC module
  • 08/05/2021
    1.5
  • Add IaaApc_GetVadOut function
  • 08/10/2021
    1.6
  • Add IaaApc_ApplyDigitalGain function
  • 04/06/2022
    1.7
  • Add IaaApc_Enhance_NNBFMode, IaaApc_SetCompressionRatioCurve, IaaApc_NrEstimateReferAec, APC_BF_HANDLE
  • 07/21/2022
    1.71
  • Modified structure description in AudioProcessInit
  • 08/16/2022
    1.8
  • Add IaaApc_FilterDesign, IaaApc_FilterApply, IaaEq_FilterDesign, IaaEq_FilterApply
  • 08/17/2022
    1.9
  • Add IaaAnr_Enhance_NNBFMode
  • 09/27/2022
    1.91
  • More detail for stereo data arrangement
  • 10/25/2022
    1.92
  • More detail for ANR filter mode 5
  • 12/12/2022
    1.93
  • Update tunable anr_intensity for ANR filter mode 5
  • 03/07/2023
    2.0
  • Add IaaApc_GetAPIVersion, IaaApc_SetHandleId, IaaAnr_SetHandleId, IaaEq_SetHandleId, IaaAgc_SetHandleId
  • 03/24/2023
    2.01
  • Revise IaaApc_Enhance_NNBFMode to IaaApc_EnhanceNNBFMode and IaaAnr_Enhance_NNBFMode to IaaAnr_EnhanceNNBFMode
  • 04/17/2023
    2.1
  • Add IaaApc_GetJsonFileSize, IaaApc_NrReadJson, IaaAnr_GetJsonFileSize and IaaAnr_ReadJson function
  • 07/25/2023
    2.2
  • Add IaaApc_EnableComfortNoise, IaaAnr_EnableComfortNoise, IaaEq_EnableComfortNoise and IaaAgc_EnableComfortNoise function
  • 10/12/2023
    2.21
  • Add frequency domain Agc setting function detail
  • 10/23/2023
    2.3
  • Add auto smooth API and comfort noise apply API
  • 02/22/2024
    2.31
  • Add more detail about IIR filter setting
  • 02/22/2024
    2.4
  • Add IaaApc_SwitchReadFromJson, IaaApc_InitReadFromJson, IaaApc_ConfigReadFromJson, IaaApc_SetAgcReadFromJson, IaaApc_FilterDesignReadFromJson, IaaAnr_InitReadFromJson, IaaAnr_ConfigReadFromJson, IaaEq_GetJsonFileSize, IaaEq_InitReadFromJson, IaaEq_ConfigReadFromJson, IaaEq_FilterDesignReadFromJson, IaaAgc_GetJsonFileSize, IaaAgc_InitReadFromJson, IaaAgc_ConfigReadFromJson, IaaAgc_SetAgcReadFromJson
  • 04/15/2024
    2.41
  • Update typesetting and description in API
  • 04/19/2024
    2.5
  • Add IaaAnr_NrEstimateReferAec
  • 05/22/2024
    2.51
  • Add more detail about Hpf user_mode setting and description of IaaApc_GetVadOut
  • 06/03/2024
    2.6
  • Add IaaApc_FilterFreqz and IaaEq_FilterFreqz
  • 07/11/2024
    2.61
  • Update ANR config constrain and description of ANR filter mode 5
  • 09/11/2024
    2.7
  • Add IaaApc_OptionReadFromJson and structure of AudioApcOption for applying IaaApc_ApplyDigitalGain through json file
  • 09/11/2024
    2.8
  • Add IaaApc_ReadJson through json file
  • 09/16/2024
    2.9
  • Add IaaEq_ReadJson and IaaAgc_ReadJson through json file
  • 10/08/2024
    2.91
  • Update description of IaaApc_NrEstimateReferAec and IaaAnr_NrEstimateReferAec
  • 01/08/2025
    2.92
  • Update description of AgcGainInfo and AudioAgcConfig
  • 01/13/2025
    2.93
  • Update description of anr_filter_mode 6
  • 03/31/2025
    2.94
  • Update file description and copyright
  • 04/19/2025
    2.95
  • Remove copyright and update file description
  • 05/15/2025
    2.96
  • Fix enum type IAA_HPF_FREQ order as description
  • 07/24/2025
    2.97
  • Fix formatting and textual errors
  • 10/28/2025
    2.98
  • Remove ANR5v1.2.4 description
  • 10/29/2025
    2.99
  • Add and update description of Chapter 1
  • 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

    API名 功能
    IaaApc_GetBufferSize 获取Apc算法运行所需要的内存大小
    IaaApc_Init 初始化Apc算法
    IaaApc_Config 配置Apc算法
    IaaApc_SetLowFreqCompressionRatioCurve 配置Apc中Agc算法分频段压缩率曲线(低频)
    IaaApc_SetMidFreqCompressionRatioCurve 配置Apc中Agc算法分频段压缩率曲线(中频)
    IaaApc_SetHighFreqCompressionRatioCurve 配置Apc中Agc算法分频段压缩率曲线(高频)
    IaaApc_SetAgcFreqBand 配置Apc中Agc算法分频段之频率
    IaaApc_GetNrResult 获取Apc算法Anr的输出数据
    IaaApc_GetNrEqResult 获取Apc算法Anr和Eq的输出数据
    IaaApc_GetVadOut 获取Apc算法中Anr计算的语音机率
    IaaApc_Run Apc算法处理
    IaaApc_Free 释放Apc算法资源
    IaaApc_Reset 重新初始化Apc算法
    IaaApc_GetConfig 获取Apc算法当前的配置参数
    IaaApc_ApplyDigitalGain 对输入数据做增益或衰减
    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_SetLowFreqCompressionRatioCurve 配置Agc算法分频段压缩率曲线(低频)
    IaaAgc_SetMidFreqCompressionRatioCurve 配置Agc算法分频段压缩率曲线(中频)
    IaaAgc_SetHighFreqCompressionRatioCurve 配置Agc算法分频段压缩率曲线(高频)
    IaaAgc_SetAgcFreqBand 配置Agc算法分频段之频率
    IaaAgc_Run Agc算法处理
    IaaAgc_Free 释放Agc算法资源
    IaaAgc_Reset 重新初始化Agc算法
    IaaAgc_GetConfig 获取当前Agc算法的配置参数
    IaaApc_SetCompressionRatioCurve 配置Apc中Agc算法压缩率曲线,可自行设定分段长度
    IaaAgc_SetCompressionRatioCurve 配置Agc算法压缩率曲线,可自行设定分段长度
    IaaApc_NrEstimateReferAec 参考Aec线性处理结果做降噪处理,避免非线性Aec造成Anr收敛异常
    IaaApc_EnhanceNNBFMode 针对串接Bf与Apc深度学习降噪算法之特化增强
    IaaApc_FilterDesign 初始化滤波器参数,可设定中心频率、峰值增益、峰值带宽,滤波器类型
    IaaApc_FilterApply 套用IIR滤波
    IaaEq_FilterDesign 初始化滤波器参数,可设定中心频率、峰值增益、峰值带宽,滤波器类型
    IaaEq_FilterApply 套用IIR滤波
    IaaAnr_EnhanceNNBFMode 针对串接Bf与Anr深度学习降噪算法之特化增强
    IaaApc_GetAPIVersion 取得Apc算法库API版本
    IaaApc_SetHandleId 配置Apc算法id
    IaaAnr_SetHandleId 配置Anr算法id
    IaaEq_SetHandleId 配置Eq算法id
    IaaAgc_SetHandleId 配置Agc算法id
    IaaApc_GetJsonFileSize Apc获取解析Json文件内容所需要的内存大小
    IaaApc_NrReadJson 配置Json参数到Apc算法
    IaaAnr_GetJsonFileSize Anr获取解析Json文件内容所需要的内存大小
    IaaAnr_NrReadJson 配置Json参数到Anr算法
    IaaApc_EnableComfortNoise 启用Apc舒适噪音算法并设定舒适噪音能量
    IaaAnr_EnableComfortNoise 启用Anr舒适噪音算法并设定舒适噪音能量
    IaaEq_EnableComfortNoise 启用Eq舒适噪音算法并设定舒适噪音能量
    IaaAgc_EnableComfortNoise 启用Agc舒适噪音算法并设定舒适噪音能量
    IaaApc_EnableAutoSmooth 启用Apc中Anr平滑噪音算法
    IaaAnr_EnableAutoSmooth 启用Anr平滑噪音算法
    IaaApc_ApplyComfortNoise 套用指定能量之舒适噪音
    IaaApc_SwitchReadFromJson 配置Json参数到Apc算法的启用设置结构体指针
    IaaApc_InitReadFromJson 配置Json参数到Apc算法的初始化结构体指针
    IaaApc_ConfigReadFromJson 配置Json参数到Apc算法的结构体指针
    IaaApc_SetAgcReadFromJson 配置Json参数到Agc频段数组
    IaaApc_FilterDesignReadFromJson 配置Json参数到Apc算法的Eq滤波器结构体指针
    IaaAnr_InitReadFromJson 配置Json参数到Anr算法的初始化结构体指针
    IaaAnr_ConfigReadFromJson 配置Json参数到Anr算法的结构体指针
    IaaEq_GetJsonFileSize Eq获取解析Json文件内容所需要的内存大小
    IaaEq_InitReadFromJson 配置Json参数到Eq算法的初始化结构体指针
    IaaEq_ConfigReadFromJson 配置Json参数到Eq算法的结构体指针
    IaaEq_FilterDesignReadFromJson 配置Json参数到Eq算法的滤波器结构体指针
    IaaAgc_GetJsonFileSize Agc获取解析Json文件内容所需要的内存大小
    IaaAgc_InitReadFromJson 配置Json参数到Agc算法的初始化结构体指针
    IaaAgc_ConfigReadFromJson 配置Json参数到Agc算法的结构体指针
    IaaAgc_SetAgcReadFromJson 配置Json参数到Agc频段数组
    IaaAnr_NrEstimateReferAec 参考Aec线性处理结果做降噪处理,避免非线性Aec造成Anr收敛异常
    IaaApc_FilterFreqz 获取配置IaaApc_FilterDesign后,数个滤波器频响迭加之结果
    IaaEq_FilterFreqz 获取配置IaaEq_FilterDesign后,数个滤波器频响迭加之结果
    IaaApc_OptionReadFromJson 配置Json参数到Apc算法的选项结构体指针
    IaaApc_ReadJson 配置通用Json参数到Apc算法
    IaaEq_ReadJson 配置通用Json参数到Eq算法
    IaaAgc_ReadJson 配置通用Json参数到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/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算法运行所需要的内存大小
    • 注意事项

    • 相关数据类型及接口

      IaaApc_GetBufferSize

      IaaApc_Init

      IaaApc_Reset


    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 数据的取样频率
    • 注意事项

      无。

    • 相关数据类型及接口

      IaaApc_Init

      IaaApc_Reset

      IaaApc_GetConfig

      IaaAnr_Init

      IaaAnr_Reset

      IaaAnr_GetConfig

      IaaEq_Init

      IaaEq_Reset

      IaaEq_GetConfig

      IaaAgc_Init

      IaaAgc_Reset

      IaaAgc_GetConfig


    3.4. 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];步长1
      anr_intensity 降噪强度,值越大降噪强度越高,但同时也会带来细节的丢失/损伤,建议值:10。
      范围[0,30];步长1
      anr_smooth_level 频域平滑程度,建议值:10
      范围[0,10];步长1
      anr_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。

    • 相关数据类型及接口

      IaaApc_Config

      IaaApc_GetConfig

      IaaAnr_Config

      IaaAnr_GetConfig

      NR_CONVERGE_SPEED


    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},每段对应一个增益值。

    • 相关数据类型及接口

      IaaApc_Config

      IaaApc_GetConfig

      IaaEq_Config

      IaaEq_GetConfig


    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获取算法运行所需要正确的内存大小。

    • 相关数据类型及接口

      IaaApc_Config

      IaaApc_GetConfig

      IaaEq_Config

      IaaEq_GetConfig


    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

        IaaApc_SetAgcFreqBand

        IaaAgc_SetLowFreqCompressionRatioCurve

        IaaAgc_SetMidFreqCompressionRatioCurve

        IaaAgc_SetHighFreqCompressionRatioCurve

        IaaAgc_SetAgcFreqBand

    • 相关数据类型及接口

      IaaApc_Config

      IaaApc_GetConfig

      IaaAgc_Config

      IaaAgc_GetConfig


    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
    • 注意事项

      无。

    • 相关数据类型及接口

      AudioAgcConfig


    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取样率
    • 注意事项

      无。

    • 相关数据类型及接口

      AudioProcessInit


    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帧更新一次噪声压抑
    • 相关数据类型及接口

      AudioAnrConfig


    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
    • 相关数据类型及接口

      AudioHpfConfig


    3.13. ANR_HANDLE


    3.14. EQ_HANDLE


    3.15. AGC_HANDLE


    3.16. APC_BF_HANDLE

    • 说明

      定义Apc算法Bf搭配深度学习降噪算法中Bf的指针类型

    • 定义

      typedef void* APC_BF_HANDLE;
      
    • 相关数据类型及接口

      IaaApc_EnhanceNNBFMode

    • 注意事项

      • 此指针仅适用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 低通滤波器
    • 相关数据类型及接口

      AudioFilterConfig


    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 峰值增益
    • 相关数据类型及接口

      EQ_FILTER_TYPE

    • 注意

      • type

        分成3种,分别为notch filter/high-pass filter/low-pass filter,三种filter的典型Frequency response请参考下图

        1. Notch fitler 是针对特定频率去压抑或增益
        2. High-pass filter 是压抑特定频率以下的能量
        3. Low-pass filter 是压抑特定频率以上的能量

      • f0

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

      • q_fctor

        Q值为品质因子,下面为Q值之公式,f_0f_1f_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 输入讯号之信道数
    • 相关数据类型及接口

      IaaApc_ApplyComfortNoise

    • 注意事项

      • 使用此API并为双信道模式时,讯号应为左右声道交叉排列

    3.20. AudioApcOption


    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 参数设置错误