/*-------------------------------------------------------------------------------------------------------------------- (C) Copyright 2019 ASR Ltd. All Rights Reserved -------------------------------------------------------------------------------------------------------------------*/ /****************************************************************************** * MODULE IMPLEMENTATION FILE ******************************************************************************* * Title: Header for Audio calibration * * Filename: acm_calibration.h * * Authors: Jackie Fan * * Description: Header file for Audio calibration. * * Last Updated: * * Notes: ******************************************************************************/ #ifndef _ACMCALIBRATION_H_ #define _ACMCALIBRATION_H_ #ifdef __cplusplus extern "C"{ #endif #include "acm_comm.h" #include "AudioHAL.h" #include "Biquad_IIR.h" //For each VE parameter, fill a tag to mark the end #define ASR_BOARD_VE_TAG 0xBEEF #define ACM_VOLUME_CNT AUDIOHAL_SPK_VOL_QTY #define ACM_RATE_CNT 2 //voice enhancement rate number #define ACM_DSP_RXSIDETONE_BIT (0x1 << ACMDSP_CONTROL_BITS_RX_SIDETONE) #define ACM_DSP_RXVOLUME_BIT (0x1 << ACMDSP_CONTROL_BITS_RX_VOLUME) #define ACM_DSP_TXVOLUME_BIT (0x1 << ACMDSP_CONTROL_BITS_TX_VOLUME) #define ACM_CODEC_MIC_BIT (0x1 << ACMCODEC_CONTROL_BITS_MIC) #define ACM_CODEC_SIDETONE_BIT (0x1 << ACMCODEC_CONTROL_BITS_SIDETONE) /******************************************************************************************************** ACMCodec_GainT.CodecControl defines board specific configuration: bit 0 : mic selection bit 1 : codec sidetone selection *********************************************************************************************************/ #define ACMCODEC_MIC1 0 #define ACMCODEC_MIC2 1 #define ACMMEDIA_CONTROL_BITS_RX_EQ (0x0001) #define ACMMEDIA_CONTROL_BITS_RX_DRC_AND_HFP (0x0002) #define ACMMEDIA_CONTROL_BITS_RX_SPK_PRO (0x0004) #define ASR_BOARD_MEDIA_VE_SETTING \ ( (ACMMEDIA_CONTROL_BITS_RX_DRC_AND_HFP) \ ) //ICAT EXPORTED ENUM typedef enum { ACMCODEC_CONTROL_BITS_MIC = 0, ACMCODEC_CONTROL_BITS_SIDETONE = 1, ACMCODEC_CONTROL_BITS_CNT = 16 //16 control bits } ACMCODEC_CONTROL_BITS; /******************************************************************************************************** ACMDSP_VEParametersT.VoiceControl defines board specific configuration: bit 0 : Tx EC bit 1 : Tx Dual-Mic bit 2 : Tx NS bit 3 : TX EQ bit 4 : TX AVC bit 5 : TX Volume bit 6 : reserved bit 7 : reserved bit 8 : Rx NS bit 9 : Rx EQ bit 10: Rx Boost bit 11: Rx BiQuadIIR bit 12: Rx Rx Volume bit 13: Rx sidetone bit 14: reserved bit 15: reserved *********************************************************************************************************/ //ICAT EXPORTED ENUM typedef enum { ACMDSP_CONTROL_BITS_TX_EC = 0, ACMDSP_CONTROL_BITS_TX_DUALMIC = 1, ACMDSP_CONTROL_BITS_TX_NS = 2, ACMDSP_CONTROL_BITS_TX_EQ = 3, ACMDSP_CONTROL_BITS_TX_AVC = 4, ACMDSP_CONTROL_BITS_TX_VOLUME = 5, ACMDSP_CONTROL_BITS_RESERVED6 = 6, ACMDSP_CONTROL_BITS_RESERVED7 = 7, ACMDSP_CONTROL_BITS_RX_NS = 8, ACMDSP_CONTROL_BITS_RX_EQ = 9, ACMDSP_CONTROL_BITS_RX_BOOST = 10, ACMDSP_CONTROL_BITS_RX_BIQUADIIR= 11, ACMDSP_CONTROL_BITS_RX_VOLUME = 12, ACMDSP_CONTROL_BITS_RX_SIDETONE = 13, ACMDSP_CONTROL_BITS_RX_SLOWVOICE= 14, ACMDSP_CONTROL_BITS_MP3_MODE = 15, ACMDSP_CONTROL_BITS_CNT = 16 //16 control bits } ACMDSP_CONTROL_BITS; //#ifdef CRANEL_8MRAM #if defined(CRANEL_4MRAM) || defined(CRANEL_8MRAM) || defined(CRANEGT_DDR) || defined(CRANELS_SUPPORT) || defined(CRANELG_SUPPORT) //ICAT EXPORTED ENUM typedef enum { ACMCODEC_PGA_STAGE1_M6dB = 0, ACMCODEC_PGA_STAGE1_M3dB, ACMCODEC_PGA_STAGE1_0dB, ACMCODEC_PGA_STAGE1_3dB, ACMCODEC_PGA_STAGE1_6dB, ACMCODEC_PGA_STAGE1_9dB, ACMCODEC_PGA_STAGE1_12dB, ACMCODEC_PGA_STAGE1_15dB, ACMCODEC_PGA_STAGE1_18dB, ACMCODEC_PGA_STAGE1_21dB, ACMCODEC_PGA_STAGE1_CNT, ACMCODEC_PGA_STAGE1_ENUM_16_BIT = 0x7FFF //16bit enum compiling enforcement } ACMCODEC_PGA_STAGE1; #else //ICAT EXPORTED ENUM typedef enum { ACMCODEC_PGA_STAGE1_0dB = 0, ACMCODEC_PGA_STAGE1_6dB, ACMCODEC_PGA_STAGE1_12dB, ACMCODEC_PGA_STAGE1_18dB, ACMCODEC_PGA_STAGE1_EXT_24dB = 7,/*0b111, only for cranG(3603) and craneM(1603)*/ ACMCODEC_PGA_STAGE1_CNT, ACMCODEC_PGA_STAGE1_ENUM_16_BIT = 0x7FFF //16bit enum compiling enforcement } ACMCODEC_PGA_STAGE1; #endif //ICAT EXPORTED ENUM typedef enum { ACMCODEC_PGA_STAGE2_M6dB = 0, ACMCODEC_PGA_STAGE2_M3dB, ACMCODEC_PGA_STAGE2_0dB, ACMCODEC_PGA_STAGE2_3dB, ACMCODEC_PGA_STAGE2_6dB, ACMCODEC_PGA_STAGE2_CNT, ACMCODEC_PGA_STAGE2_ENUM_16_BIT = 0x7FFF //16bit enum compiling enforcement } ACMCODEC_PGA_STAGE2; //ICAT EXPORTED ENUM typedef enum {//0~31, RSNUM = 4 ACMCODEC_ADC_DIGGAIN_BYPASS = 0, //0 ACMCODEC_ADC_DIGGAIN_M24dB = 1, ACMCODEC_ADC_DIGGAIN_M18dB = 2, ACMCODEC_ADC_DIGGAIN_M14dB = 3, ACMCODEC_ADC_DIGGAIN_M12dB = 4, ACMCODEC_ADC_DIGGAIN_M10dB = 5, ACMCODEC_ADC_DIGGAIN_M8dB = 6, ACMCODEC_ADC_DIGGAIN_M7dB = 7, ACMCODEC_ADC_DIGGAIN_M6dB = 8, ACMCODEC_ADC_DIGGAIN_M5dB = 9, ACMCODEC_ADC_DIGGAIN_M4dB = 10, ACMCODEC_ADC_DIGGAIN_M3dB = 11, ACMCODEC_ADC_DIGGAIN_M2dB = 12, ACMCODEC_ADC_DIGGAIN_M1dB = 14, ACMCODEC_ADC_DIGGAIN_0dB = 16, ACMCODEC_ADC_DIGGAIN_1dB = 18, ACMCODEC_ADC_DIGGAIN_2dB = 20, ACMCODEC_ADC_DIGGAIN_3dB = 23, ACMCODEC_ADC_DIGGAIN_4dB = 25, ACMCODEC_ADC_DIGGAIN_5dB = 28, ACMCODEC_ADC_DIGGAIN_6dB = 31, ACMCODEC_ADC_DIGGAIN_ENUM_16_BIT = 0x7FFF //16bit enum compiling enforcement } ACMCODEC_ADC_DIGGAIN; //ICAT EXPORTED ENUM typedef enum {//0~255, RSNUM = 4 ACMCODEC_DAC_DIGGAIN_BYPASS = 0, //0 ACMCODEC_DAC_DIGGAIN_M24dB = 1, ACMCODEC_DAC_DIGGAIN_M18dB = 2, ACMCODEC_DAC_DIGGAIN_M14dB = 3, ACMCODEC_DAC_DIGGAIN_M12dB = 4, ACMCODEC_DAC_DIGGAIN_M10dB = 5, ACMCODEC_DAC_DIGGAIN_M8dB = 6, ACMCODEC_DAC_DIGGAIN_M7dB = 7, ACMCODEC_DAC_DIGGAIN_M6dB = 8, ACMCODEC_DAC_DIGGAIN_M5dB = 9, ACMCODEC_DAC_DIGGAIN_M4dB = 10, ACMCODEC_DAC_DIGGAIN_M3dB = 11, ACMCODEC_DAC_DIGGAIN_M2dB = 12, ACMCODEC_DAC_DIGGAIN_M1dB = 14, ACMCODEC_DAC_DIGGAIN_0dB = 16, ACMCODEC_DAC_DIGGAIN_1dB = 18, ACMCODEC_DAC_DIGGAIN_2dB = 20, ACMCODEC_DAC_DIGGAIN_3dB = 23, ACMCODEC_DAC_DIGGAIN_4dB = 25, ACMCODEC_DAC_DIGGAIN_5dB = 28, ACMCODEC_DAC_DIGGAIN_6dB = 32, ACMCODEC_DAC_DIGGAIN_7dB = 36, ACMCODEC_DAC_DIGGAIN_8dB = 40, ACMCODEC_DAC_DIGGAIN_9dB = 45, ACMCODEC_DAC_DIGGAIN_10dB = 51, ACMCODEC_DAC_DIGGAIN_11dB = 57, ACMCODEC_DAC_DIGGAIN_12dB = 64, ACMCODEC_DAC_DIGGAIN_13dB = 71, ACMCODEC_DAC_DIGGAIN_14dB = 80, ACMCODEC_DAC_DIGGAIN_15dB = 90, ACMCODEC_DAC_DIGGAIN_16dB = 101, ACMCODEC_DAC_DIGGAIN_17dB = 113, ACMCODEC_DAC_DIGGAIN_18dB = 127, ACMCODEC_DAC_DIGGAIN_19dB = 143, ACMCODEC_DAC_DIGGAIN_20dB = 160, ACMCODEC_DAC_DIGGAIN_21dB = 180, ACMCODEC_DAC_DIGGAIN_22dB = 201, ACMCODEC_DAC_DIGGAIN_23dB = 226, ACMCODEC_DAC_DIGGAIN_24dB = 254, ACMCODEC_DAC_DIGGAIN_ENUM_16_BIT = 0x7FFF //16bit enum compiling enforcement } ACMCODEC_DAC_DIGGAIN; //ICAT EXPORTED ENUM typedef enum {//0~255, RSNUM = 8 ACMCODEC_SIDETONE_GAIN_BYPASS = 0, //0 ACMCODEC_SIDETONE_GAIN_M48dB = 1, ACMCODEC_SIDETONE_GAIN_M42dB = 2, ACMCODEC_SIDETONE_GAIN_M38dB = 3, ACMCODEC_SIDETONE_GAIN_M36dB = 4, ACMCODEC_SIDETONE_GAIN_M34dB = 5, ACMCODEC_SIDETONE_GAIN_M32dB = 6, ACMCODEC_SIDETONE_GAIN_M30dB = 8, ACMCODEC_SIDETONE_GAIN_M28dB = 10, ACMCODEC_SIDETONE_GAIN_M26dB = 13, ACMCODEC_SIDETONE_GAIN_M24dB = 16, ACMCODEC_SIDETONE_GAIN_M22dB = 20, ACMCODEC_SIDETONE_GAIN_M20dB = 26, ACMCODEC_SIDETONE_GAIN_M18dB = 32, ACMCODEC_SIDETONE_GAIN_M16dB = 41, ACMCODEC_SIDETONE_GAIN_M14dB = 51, ACMCODEC_SIDETONE_GAIN_M12dB = 64, ACMCODEC_SIDETONE_GAIN_M10dB = 81, ACMCODEC_SIDETONE_GAIN_M9dB = 91, ACMCODEC_SIDETONE_GAIN_M8dB = 102, ACMCODEC_SIDETONE_GAIN_M7dB = 114, ACMCODEC_SIDETONE_GAIN_M6dB = 128, ACMCODEC_SIDETONE_GAIN_M5dB = 144, ACMCODEC_SIDETONE_GAIN_M4dB = 161, ACMCODEC_SIDETONE_GAIN_M3dB = 181, ACMCODEC_SIDETONE_GAIN_M2dB = 203, ACMCODEC_SIDETONE_GAIN_M1dB = 228, ACMCODEC_SIDETONE_GAIN_0dB = 255, ACMCODEC_SIDETONE_GAIN_ENUM_16_BIT = 0x7FFF //16bit enum compiling enforcement } ACMCODEC_SIDETONE_GAIN; //ICAT EXPORTED ENUM typedef enum { ACMCODEC_DAC_GAIN_6dB = 0, ACMCODEC_DAC_GAIN_3dB, ACMCODEC_DAC_GAIN_0dB, ACMCODEC_DAC_GAIN_M3dB, ACMCODEC_DAC_GAIN_M6dB, ACMCODEC_DAC_GAIN_CNT, ACMCODEC_DAC_GAIN_ENUM_16_BIT = 0x7FFF //16bit enum compiling enforcement } ACMCODEC_DAC_GAIN; //ICAT EXPORTED ENUM typedef enum { //ACMCODEC_RCV_GAIN_NOTUSED = 0, //ACMCODEC_RCV_GAIN_M6dB = 1, ACMCODEC_RCV_GAIN_M6dB = 0, ACMCODEC_RCV_GAIN_M3dB, ACMCODEC_RCV_GAIN_0dB, ACMCODEC_RCV_GAIN_3dB, ACMCODEC_RCV_GAIN_6dB, ACMCODEC_RCV_GAIN_CNT, ACMCODEC_RCV_GAIN_ENUM_16_BIT = 0x7FFF //16bit enum compiling enforcement } ACMCODEC_RCV_GAIN; //ICAT EXPORTED ENUM typedef enum { ACMCODEC_CLASSG_MODE_0_9V = 0, ACMCODEC_CLASSG_MODE_1_8V, ACMCODEC_CLASSG_MODE_CNT, ACMCODEC_CLASSG_MODE_ENUM_16_BIT = 0x7FFF //16bit enum compiling enforcement } ACMCODEC_CLASSG_MODE; //ICAT EXPORTED ENUM typedef enum { ACMCODEC_CLASSD_GAIN_1_5VV = 0, ACMCODEC_CLASSD_GAIN_2_0VV, ACMCODEC_CLASSD_GAIN_2_3VV, ACMCODEC_CLASSD_GAIN_CNT, ACMCODEC_CLASSD_GAIN_ENUM_16_BIT = 0x7FFF //16bit enum compiling enforcement } ACMCODEC_CLASSD_GAIN; //ICAT EXPORTED STRUCT typedef struct { ACMCODEC_PGA_STAGE1 PGA_Stage1; //00:0dB;01:6dB;10:12dB;11:18dB ACMCODEC_PGA_STAGE2 PGA_Stage2; //000:-6dB;001:-2.5dB;010:0dB;011:3.5dB;100:6dB ACMCODEC_ADC_DIGGAIN ADC_DigGain; //AdcDigGain[4:0]:1~31 ACMCODEC_SIDETONE_GAIN SideTone_Gain; //SideToneGain[8:0] :[-256,255] signed short Reserved1; //Reserved1 signed short Reserved2; //Reserved2 } ACMCodec_GainInT; //ICAT EXPORTED STRUCT typedef struct { ACMCODEC_DAC_DIGGAIN DAC_DigGain; //DacDigGain[7:0]:1~255 ACMCODEC_DAC_GAIN DAC_Gain; //000:6dB;001:3.5dB;010:0dB;011:-2.5dB;100:-6dB ACMCODEC_RCV_GAIN RCV_Gain; //001:-6dB;010:-2.5dB;011:0dB;100:3.5dB;101:6dB ACMCODEC_CLASSG_MODE ClassG_Mode; //0=+/-0.9V; 1=+/-1.8V ACMCODEC_CLASSD_GAIN ClassD_Gain; //0=1.5V/V;1=2V/V;2=2.33V/V;3=0 signed short Reserved1; //Reserved1 } ACMCodec_GainOutT; //ICAT EXPORTED STRUCT typedef struct { ACM_PROFILE_ID Profile; unsigned short CodecControl; ACMCodec_GainInT Tx_CodecGain; //tx has same gain for every volume signed short Tx_DSPGain; //dB, tx has same gain for every volume ACMCodec_GainOutT Rx_CodecGain[ACM_VOLUME_CNT]; signed short Rx_DSPGain[ACM_VOLUME_CNT]; //dB signed short Rx_DSPSideToneGain; //dB } ACMCodec_GainT; //ICAT EXPORTED STRUCT typedef struct { signed short SampleDelay; // reference delay to echo signed short NumOfTaps; // Fir filter length signed short ConvergenceSpeed; // slowdown signed short Ref2EchoPowerRatio; // ratio of ref to echo, [-12 ~30]db, decimal number signed short DC_factor; //[14000 ~16350] but default should be 16200 signed short reserved0; } ACMDSP_ECParamsT; //ICAT EXPORTED STRUCT typedef struct { signed short BoostMode; // 0 , 1, 2, 3 signed short BoostGainDb; signed short PeakGainDb; signed short BoostNoiseGainDb; signed short NoiseLevel; signed short BoostAttach; signed short BoostRelease; signed short reserved; signed short TargetLevel; signed short AgcMaxGainDb; signed short AgcMaxRMS; signed short AgcEnvStep; //expert parameters signed short RMStrackStep; //expert parameters } ACMDSP_AGCParamsT; //ICAT EXPORTED STRUCT typedef struct { signed short a[3]; signed short b[3]; } ACMDSP_BiQuadCoeffsT; //ICAT EXPORTED STRUCT typedef struct { unsigned short PeriodDelta; unsigned short ExpandRate; unsigned short CorrectionThreshold; signed short reserved; } ACMDSP_SlowVoiceParamsT; //ICAT EXPORTED STRUCT typedef struct { signed short MaxSuppressDb; // [-40,0)db. signed short PeakNoiseDb; // [-70,-12)db. signed short NoiseMatrix; // following is expert parameters signed short FrameSmoothFactor; signed short reserved; } ACMDSP_NSParamsT; //noise suppression para, for both TX&RX //ICAT EXPORTED STRUCT typedef struct {// res parameters signed short ResMode; signed short DtGainDb; signed short FestGainDb; signed short NoiseFloorDbov; signed short CnGaindb; signed short DtThresh; signed short Gamma; //following is expert paramters signed short AuditoryMasking; signed short NonlinearModel; signed short WinitCntThresh; signed short EstResMatrix; signed short VadhangRef; signed short VadhangNear; signed short reserved; } ACMDSP_NSResParamsT; //ICAT EXPORTED STRUCT typedef struct {// reserved parameters for dual_mic signed short TapsNum; signed short Oversuppression; signed short OverAuditoryMasking; signed short DualMicVmThresh; signed short DualMicVmOffset; signed short DualMicNoiseThresh; signed short DualMicVadHang; signed short DualMicVmRelease; signed short NonStationaryLeftDb; } ACMDSP_NSDmParamsT; //ICAT EXPORTED STRUCT typedef struct { ACMDSP_NSParamsT NsParams; ACMDSP_NSResParamsT ResParams; ACMDSP_NSDmParamsT DmParams; } ACMDSP_NSTxParamsT; //TX only //CATStudio could not support union definition which has bit filed and short types #if 0 //ICAT EXPORTED STRUCT typedef struct { BOOL Tx_EC_On:1; //bit 0 BOOL Tx_DualMic_On:1; //bit 1 BOOL Tx_NS_On:1; //bit 2 BOOL Tx_EQ_On:1; //bit 3 BOOL Tx_AVC_On:1; //bit 4 BOOL Tx_Volume_On:1; //bit 5 BOOL Reserved6:1; //bit 6 BOOL Reserved7:1; //bit 7 BOOL Rx_NS_On:1; //bit 8 BOOL Rx_EQ_On:1; //bit 9 BOOL Rx_Boost_On:1; //bit 10 BOOL Rx_BiQuadIIR_On:1; //bit 11 BOOL Rx_Volume_On:1; //bit 12 BOOL Rx_Sidetone_On:1; //bit 13 BOOL Reserved14:1; //bit 14 BOOL Reserved15:1; //bit 15 } ACMDSP_VCBitsT; //ICAT EXPORTED UNION typedef union { ACMDSP_VCBitsT Bits; unsigned short VC; } ACMDSP_VoiceControlT; //TX only #endif //ICAT EXPORTED STRUCT typedef struct { ACM_PROFILE_ID Profile; signed short Version; unsigned short VoiceControl; //TX path signed short ExpertParam1[ACM_RATE_CNT]; ACMDSP_ECParamsT EcParams[ACM_RATE_CNT]; ACMDSP_NSTxParamsT NsParamsTx[ACM_RATE_CNT]; signed short TxFreq_eqCoeffArray[ACM_RATE_CNT][24]; ACMDSP_AGCParamsT TxAgcParams[ACM_RATE_CNT]; //RX path signed short ExpertParam2[ACM_RATE_CNT]; ACMDSP_NSParamsT NsParamsRx[ACM_RATE_CNT]; signed short RxFreq_eqCoeffArray[ACM_RATE_CNT][24]; ACMDSP_AGCParamsT RxAgcParams[ACM_RATE_CNT]; ACMDSP_BiQuadCoeffsT BiQuadIIR[ACM_RATE_CNT]; //can be used as hpf/lpf or notch filter ACMDSP_SlowVoiceParamsT SlowVoiceParam; //Reserved unsigned short Reserved[6]; unsigned short Tag; //Fixed as 0xBEEF } ACMDSP_VEParametersT; //ICAT EXPORTED STRUCT typedef struct { unsigned short drcGain; unsigned short cutOffFreqIdx; unsigned short resv1; unsigned short resv2; } ACMCP_MediaDRCParaT; //ICAT EXPORTED STRUCT typedef struct { unsigned short maxRms; unsigned short Alpha; unsigned short N2cos; unsigned short resv; } ACMCP_SPKProParaT; //ICAT EXPORTED STRUCT typedef struct { unsigned int index; unsigned int onoffCtl; // bit0:eq, bit1: drc, bit2: spkPro EqParamIn eqParam; ACMCP_MediaDRCParaT drcParam; ACMCP_SPKProParaT spkProParam; unsigned short Reserved[7]; unsigned short Tag; //Fixed as 0xBEEF } ACMCP_MediaVEarametersT; int ACMCalibration_GetVEParam(unsigned short profile, ACMDSP_VEParametersT *out_params); int ACMCalibration_GetMediaVEParam(unsigned int index, ACMCP_MediaVEarametersT* out_param); int ACMCalibration_GetCodecGainParam(unsigned short profile, ACMCodec_GainT *out_params); void ACMCalibration_ConfigVE(short *pData); void ACMCalibration_ConfigMediaVE(short *pData); void ACMCalibration_ConfigCodec(short *pData); #ifdef __cplusplus } #endif #endif //_ACMCALIBRATION_H_