aec.h 4 KB
#ifndef	__AEC_H__
#define	__AEC_H__

#include "optek_hifi2.h"


#define __AEC_TEXT	//	__attribute__ ((section (".internal_ram_1_text")))


#define	AEC_CVSD_LIB_RELEASE
//#define	AEC_CALIBRATE_RAM_DUMP
//#define	AEC_CVSD_CALIBRATE_PRINT	<- can't work, too slow



//#define	AEC_PROCESS
//#define	AEC_TEST	: dead ? why?

#define	AEC_BUF_ALLOC_DYNAMIC

#define	AEC_DT_BY_FREQUENCY

// https://developer.android.com/about/dashboards/index.html



typedef	enum {

	en_AEC_PRINT_DISABLE,
	//en_AEC_PRINT_ENABLE_ALL,

	//giegel
	en_GIEGEL_PFAR,	
	en_GIEGEL_MAX_ABS_FAR,	
	en_GIEGEL_ABS_MIC,
	en_GIEGEL_GIEGEL,
	
	//freq
	en_FREQ_P_FAR,
	en_FREQ_P_MIC_LOW,
	en_FREQ_P_MIC_HIGH,

	//common
	en_DATA_FAR,		
	en_DATA_MIC,
	en_DATA_ERR,

	//debug
	en_FAR_CVSD,
	en_FAR_CVSD_DEC,
	en_FAR_CVSD_DEC_FILT
	
}	enum_AEC_PRINT_TYPE;


/*
	common mode	for ramdump:
	en_DATA_FAR + en_DATA_MIC; U16x2/8k
	en_DATA_MIC:	U16/32k

	en_GIEGEL_MAX_ABS_FAR + en_GIEGEL_ABS_MIC:	U16x2/8K

	en_FREQ_P_MIC_LOW + en_FREQ_P_MIC_HIGH:	U32x2/8k

	en_FREQ_P_FAR/en_GIEGEL_PFAR:	U32/8k
*/

#ifdef	AEC_CALIBRATE_RAM_DUMP
//#define	RAM_DUMP_NONE



//#define	RAM_DUMP_DATA_FAR_MIC	// U16x2, 8K
//#define	RAM_DUMP_DATA_MIC		// U16, 32K
//#define	RAM_DUMP_DATA_ERR		// U16, 8K 

//#define	RAM_DUMP_FREQ_P_MIC_LOW_HIGH	// U32x2 -> U16x2		32K
//#define	RAM_DUMP_FREQ_P_FAR			// U32 -> U16	8K

//below are all 8K Hz
//#define	RAM_DUMP_GIEGEL_P_FAR		// U32	-> U16
//#define	RAM_DUMP_GIGEL_ABS_FAR_MIC	// U16x2	, 8K
//#define	RAM_DUMP_GIEGEL_GEIGEL		// U16

//#define	RAM_DUMP_FAR_END_CVSD			// 64k, 1bit per sample	-->  8KB/s	U8
//#define	RAM_DUMP_FAR_END_CVSD_DEC		// 64k/16bits		-->	 128KB/s		U16
//#define	RAM_DUMP_FAR_END_CVSD_DEC_FILT	// same as RAM_DUMP_FAR_END_CVSD_DEC		U16

//#define	RAM_DUMP_MIC_CVSD
#endif



void ramDump_dump( int dataSource, int data );
void ramDump_dump2( int dataSource, int data );




int aec_printf(int prtType, int data );
int aecFunc_isPrintEnable(void);




#define	SHIFT_DOUBLE_BUFFER

#define	FILTER_TAP_512	// 64ms
//#define	FILTER_TAP_256	// 32ms


#define	AEC_UNIT	short

#define	P_TYPE	I64
//#define	P_TYPE	I32


typedef enum {
	en_AEC_ALGO_GIEGEL,
	en_AEC_ALGO_FREQ_DIVIDE
}	enum_AEC_ALGORITHM;

typedef struct {

	int enable;
	int algorithm;
	int nlpon;

	int filterTaps;
	AEC_UNIT *filterCoeff;
	AEC_UNIT *filterCoeff0;
	AEC_UNIT *filterCoeff1;
	int pointCnt;
	
	AEC_UNIT *inputVector;
#ifdef	SHIFT_DOUBLE_BUFFER	
	AEC_UNIT *inputVectorBuf;
	int vectorBufLen;
#endif

	int mu;
	//int lambda;
	P_TYPE	lambda;

//	int farEndIndx;
//	int nearEndIndex;

	P_TYPE P0;

	int tt;
	int inOld;

	// nlp
	int nlpResidualThreshold;
	int nlpDelta_f;
	int nlpDelta_r;
	int nlpAmp0;

	//lfsr
	U16 lfsr;

	//aec data buffer
	I16 *farEndData;
	I16 *farEndData2;
	int farEndDataIndx;
	
	I16 *nearEndData;
	I16 *errSigData;
	int maxDataBufNums;
	int dataSamples;

	//double talk
	int hangoverMaxCnt;

	int dtHangoverCnt;
	int	dtFlag;

	int flagFarSpeech;
	int hangcntFar;
	int powerFar;
	int	powerFar0;
//	int farAlpha;
	int farAlphaRshift;

	int maxAbsFarend;

	int flagNearSpeech;
	int hangcntNear;
	int powerNear;
	int	powerNear0;

	//threshold
	int farSpeechPowerthreshold;
	int	giegelThreshold;

#ifdef	AEC_DT_BY_FREQUENCY	
	// near end low/high power
	int powerLow;
	int powerLow0;
	int powerLowThreshold;
	//int powerLowFlag;

	int powerHigh;
	int powerHigh0;
	int powerHighThreshold;
	//int powerHighFlag;

	int freqAlphaShift;

	I16 *nearLowData;
	I16 *nearHighData;
	int	nearDataSzBytes;
#endif

	/*
	int errSigPowerThreshold;
	int farEndPowerThreshold;
	int dtCheckThreshold;
	*/
}	AEC_DATA;





#define	IN
#define	OUT
#define	INOUT

int aec_init( int algorithm );
int aec_enable( int ena );


/*
	far end/near end/output signal data always have same sample size
*/
int aec_process( IN I16 *farEndData, IN  I16 *nearEndData, OUT I16 *outData, int sampleNum );

int aec_processII( void );

int aec_farEndSigProc( INOUT I16 *data, int size );	// data filtered
int aec_micSigProc( INOUT I16 *data, int size );
int aec_errSigPostProc( I16 *data, int maxSize );


int aec_isFarEndSignalSilent(void);

	
#endif