

#include "SamsungSolomonVoiceW_FFT_functions.h"

#if(FLAG_SELECT_C_DSP == 1)
#include <stdio.h>
#include <stdlib.h>
#endif

//typedef long long INT64;
#ifndef FN_2ndIIR_FILTERING_OPT
#define DVTX_SMLAL( c,   a,   b )				c + ((INT64)(a)*(INT64)(b))
#else
#define DVTX_SMLAL( c,   a,   b )				(c +(long long)(AE_MUL32_LL(a, b)))
#endif
#define DVTX_NOISEBITS							4
#define DVTX_QCOEFFLARGE			     		30
#define DVTX_QERMASK							(((INT64)1<<32)-1)

/* Filter */
#define framelen WINDOWLEN
#define FRAME framelen

extern int FN_2ndIIR_FILTERING(short(*inout), short n, int* coeffs, int *state);

#ifndef KHW_OPTI_20191216_HIFI
void Fx_vector_copy_s(short *Out, short *A, short N);
#else
#define Fx_vector_copy_s(Out,A,N) (__vec_memcpy(Out,A,(N<<1)))
#endif
#if 1	//hoon_test
#ifndef KHW_OPTI_20191216_HIFI
void Fx_vector_copy_s_for(short *Out, short *A, short N);
#else
#define Fx_vector_copy_s_for(Out,A,N) (__vec_memcpy(Out,A,(N<<1)))
#endif
#endif

void Fx_vector_gain(short* A, short gain, short gain_q, short N);
int Fx_vector_sum_squares(short *A, short N, short *sum_q);
short Fx_10log10(int pwr, short pwr_q);
short Fx_time_vector_power_dB(short *A, short N);
#ifndef	Fx_convolve_OPT_DSP
int Fx_convolve(const short *signal, const short *filter, const short signal_length, const short filter_length);
#else
int Fx_convolve_optimized(const short *signal, const short *filter, const short filter_length);
#endif

extern int Fx_recursive_avg(int A, int B, short beta);
extern void fx_SolomonVoice_FFT_to_FFTpwr_ave(int *FFTpwrVecAve, int *FFTpwrVec, short *FFTbinVec, short shift, short alpha, short oneminusalpha, short Nffthalf);
extern void fx_SolomonVoice_FFT_to_Phi_ave(int *phi_cross_r, int *phi_cross_i, short *data_buffer_WB_main, short *data_buffer_WB_sub, short shift_main, short shift_sub, short alpha, short oneminusalpha, short Nffthalf);
extern void fx_SolomonVoice_FFT_to_FFTpwr(int *FFTpwrVec, short *FFTbinVec, short Nffthalf);
extern void fx_SolomonVoice_FFTpwr_to_FFTband(int *FFTband, int *FFTbin, short CHindex[][2], short CHbin[][2], short Nband);
extern void fx_SolomonVoice_PwrBin_FixQ_BlkDeNorm(int *out, int *in, short blk_norm, short Q, short minval, short NhalfFFT);
extern int HysteresisHangoverThresholding_MultiState(int val, int thr_table[][2], int table_length, int hangover_up, int hangover_down, int state, short *p_cnt_up, short *p_cnt_down);
extern void Fn_vector_smoothing_over_3_rectangularwin_length(int *Out, int* A, short N, short LEN);
extern int fx_SolomonVoice_peak_peaking_based_Harmonic_Contour_estimation(short *f0Contour, short SPPminlocal, short VAD, int *EEii, int *EXooS, short wl, short fh, short NfftHalf);
extern void fx_SolomonVoice_VectorAdd_ll(int *Out, int *A, int *B, short N);
extern void fx_SolomonVoice_64point_cepstrum_transform(int *inSNR, short *outCeps, short Nband);
extern void fx_SolomonVoice_64point_INVERSE_cepstrum_transform(int *outSNR, short *inCeps, short Nband);
extern void fx_SolomonVoice_cepstral_smoothing_softForgetting(short *outSNRcepsAvg, short *outSNRcepsAvgTMP, short *inSNRceps, short *forgetVec);
extern void fx_SolomonVoice_cepstral_smoothing_FixForgetting(short Flag_loud, short *outSNRcepsAvg, short *outSNRcepsAvgTMP, short *inSNRceps,
			short BetaBand1_slow, short BetaBand2_slow, short BetaBand3_slow, short BetaBand1_fast, short BetaBand2_fast, short BetaBand3_fast);
extern int HysteresisHangoverThresholding(int a, int hangover_up, int hangover_down, int s, int* p_cnt);
short int_rcp_exp(short num);
extern short bayes_prob(int rg, short xi_db, int zeta, short increase_flag);
extern void fx_SolomonVoice_PwrBand_FixQ_BlkDeNorm(int *out, int *in, short blk_norm, short Q, short Nband);
extern void fx_SolomonVoice_Rx_ringbacktone_bandpwr_estimation(AECStatus* AEC_buf, int *L_DDBin2, short FFT_HALFLEN, short BLK_NORM);
extern void Fn_vector_smoothing_over_3_win_length(int *Out, int* A, short N, short LEN);
