#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#include "SamsungSolomonVoiceW_Int.h"
#include "SamsungSolomonVoiceW_Table.h"
#include "SamsungSolomonVoiceW_basic_op.h"
#include "SamsungSolomonVoiceW_FFT_functions.h"


#define W_COEF_Q 13 //(Q2.13)
#define Mu_Q 17 

void SolomonVoiceWBFInit(BFStatus* BF_buf, SamsungSolomonVoiceWTxBFParam* BF_param, COMMONBUF* common_buf);
void SolomonVoiceW_BF_ParamConfig(SamsungSolomonVoiceWTxBFParam* BF_param, SamsungSolomonVoiceWTxBFParam* param);
void fltfx_SolomonVoice_FFT_to_FFTpwr(int *FFTpwrVec, short *FFTbinVec, short Nffthalf);
int fltfn_LogPwrSum(int *FFTpwrVec, short fl, short fh, short Q);
int fltfn_LogPwrSumHighBand(int *FFTpwrVec, short fl, short fh, short Q);
void fltfn_spectralavg(int *Out, int *In, short Nbin, short Nsmth);
void fltfn_RecursiveVectorAvg(int *Out, int *In, short Nbin, int beta);
short fltfn_RecursiveVectorAvg_q(int *Out, short qOut, int *In, short qIn, short Nbin, int beta);
void fltfn_FreqBinGain(short *X, int *G, short Nbin);
int fltfn_LTSV_VAD(int SxMtx[][DVTX_M_LTSV_R], int *phxix, int *XX, short BLK_NORM, short Ksrt, short Nltsvbin, short R, short ColomnIndex);
void fltfn_unbiasedMMSE_Npsd_SPP(int *XX, int *Npsd, short BLK_NORM, int *Npsdfast, short *pH1avg, short *pH1, int *postSNR, short Nbin, short Flag_FrmNoiseFree, short Flag_NoiseOnly, short VAD_LTSVgsc_multiFlag, short Flag_Tx_silent_mode_BF, short debug, VADACCStatus *VADACC_buf);
short PowerRatio2Gain(int a, int b, short q_diff);
void fn_BF_PitchEnhance_1_preNS(/*out*/int *ps, /*in*/int *XXgsc, /*in*/int *Npsdgsc, short BLK_NORM, SamsungSolomonVoiceWTxBFParam* BF_param, VADACCStatus *VADACC_buf, short BLOCK_NORM);
void fn_BF_PitchEnhance_2_cepstrum(/*out*/int *ps_ceps, /*in*/int *ps, short BLK_NORM);
void fn_BF_PitchEnhance_3_pitch_enhencement(/*out(Q16.15)*/int *ps_cepsavg, /*in(Q16.15)*/int *ps_ceps, short BLK_NORM, BFStatus* BF_buf, SamsungSolomonVoiceWTxBFParam* BF_param, FRAMEStatus*   FRAME_buf);
void fn_BF_PitchEnhance_4_Invcepstrum(int *XX_GSCcpes, /*Q?*/int *ps_cepsavg, short BLK_NORM);
void fn_BF_PitchEnhance_5_cepstrumNS(short *XoutGSC, int *XX_GSCcpes, int *Npsdgsc, BFStatus* BF_buf, short Flag_Tx_silent_mode_BF, VADACCStatus *VADACC_buf, FRAMEStatus*   FRAME_buf, CONTEXT_NOISE_LEVLE ContextNoiseLevel);
void fn_MODULE_100_maxNSR_filtering(/*out*/short *X_F_NSR, short *X_B_NSR, /*in*/short *Xo1, short *Xo2, short DOAindex, BFStatus* BF_buf);
short fn_MODULE_115_MaxNSR_filter_out_adjustment(/*InOut*/short *X_F_NSR, /*InOut*/short *X_B_NSR, short BLK_NORM, short *Xo1, short *Xo2, int PwrMic1, short Flag_AbnormalMic, short Flag_Tx_silent_mode_BF, short Flag_wind, SamsungSolomonVoiceWTxBFParam* BF_param);
void fn_freqGSCMIC(/*out*/short *Out_GSC, /*in*/short *X_FB, short *X_BM, short BLK_NORM, short *W, short VADFrm, short mu, short *WgscFreqUpdate);
//void fn_freqGSCMIC_Nframe(/*out*/short *Out_GSC, /*in*/short *X_FB, short(*X_BMNfrm)[(DVTX_FFT_HALFLEN_WB/* + 1*/) * 2], short BLK_NORM, short(*WNfrm)[(DVTX_FFT_HALFLEN_WB/* + 1*/) * 2], short VADFrm, short *mu, short *WgscFreqUpdate, short NgscDMA);
void fn_MODULE_110_GSC(/*out*/short *XoutGSC, /*in*/short *XoutFBF, /*in*/short *XoutBM, short BLK_NORM, short *pH1mic, short Flag_FrmNoiseFree, short Flag_AbnormalMic, short VAD_LTSVgsc_multiFlag, short NgscDMA, BFStatus *BF_buf, SamsungSolomonVoiceWTxBFParam *BF_param, VADACCStatus *VADACC_buf, FRAMEStatus*   FRAME_buf);
void fn_MODULE_120_GSC_adjustment(/*out*/int *XXgsc, /*in/out*/short *XoutGSC, /*in*/int *XXo1, /*in*/short *Xo1, /*in*/short *X_F_NSR, BFStatus *BF_buf, short Flag_wind);
void fx_WindEnergy_Norm(short *Xo1, short *Xo2, int *E_mic1_L, int *E_mic2_L, short tx_ch_tbl_nswb[][2], short N);
void FN_BF(DVTX_ECNS_Cfg_t* DVTX_ECNS_vars);

void fltfn_NpsdBM_estimation(int *NpsdBM, int *G_gsc_bm, short *pH1gsc, int *PwrXXgsc, int * XXgsc, int *PwrXXbm, int *XXbm, short BLK_NORM_Outer1, int *tmpvec256B, short FFT_HALFLEN, FRAMEStatus*   FRAME_buf);
int fltfn_NpsdBM_Npsdgsc_Mixing(int *NpsdBFout, int *Npsdgsc, int *NpsdBM, int THDnoisepwr, int THDnoisdPSDmask, short FFT_HALFLEN);

int fltfn_Npsd_Under_Eatimation(int *NpsdBFout, short under_est_factor, short FFT_HALFLEN);


short  fltfx_LTSV_multi_VAD_flag(int L_PwrNpsdgsc, int LTSV);