📄 pitch_ol.c
字号:
{ Word16 i, j; Word16 max1, max2, max3; Word16 p_max1, p_max2, p_max3; Word16 scal_flag = 0; Word32 t0;#ifdef VAD2 Word32 r01, r02, r03; Word32 rmax1, rmax2, rmax3;#else Word16 corr_hp_max;#endif Word32 corr[PIT_MAX+1], *corr_ptr; /* Scaled signal */ Word16 scaled_signal[L_FRAME + PIT_MAX]; Word16 *scal_sig, scal_fac;#ifndef VAD2 if (dtx) { /* no test() call since this if is only in simulation env */ /* update tone detection */ ////////////////test(); test(); if ((sub(mode, MR475) == 0) || (sub(mode, MR515) == 0)) { vad_tone_detection_update (vadSt, 1); } else { vad_tone_detection_update (vadSt, 0); } }#endif scal_sig = &scaled_signal[pit_max];// move16 (); t0 = 0L; // move32 (); //add for jzmedia accerative instruction sets#ifdef JZ4740_MXU_OPT#define ADD_MASK 0xFFFFFFFC#define REF_MASK 0x03 Word16 *ptr1, *ptr2; Word32 ref1, ref2; ptr1 = (unsigned int)(signal -pit_max) & ADD_MASK; ref1 = 4 - (unsigned int)(signal - pit_max) & REF_MASK; S32LDD(xr10, ptr1, 0x00); Q16SLL(xr11, xr0,xr0,xr12,0); for (i = 0; i < (L_frame + pit_max) / 2; i++) { S32LDI(xr1, ptr1, 0x04); S32ALN(xr2, xr10, xr1, ref1); Q16SLL(xr10, xr1, xr0, xr0, 0); D16MAC_AA_WW(xr11, xr2, xr2, xr12); } D32SLL(xr3, xr11, xr12, xr4,1); D32ADD_AA(xr1,xr3,xr4,xr2); t0 = S32M2I(xr1); if( pit_max % 2){ t0 = L_mac(t0, signal[L_frame-1],signal[L_frame-1]); }#else for (i = -pit_max; i < L_frame; i++) { t0 = L_mac (t0, signal[i], signal[i]); } #endif /*--------------------------------------------------------* * Scaling of input signal. * * * * if Overflow -> scal_sig[i] = signal[i]>>3 * * else if t0 < 1^20 -> scal_sig[i] = signal[i]<<3 * * else -> scal_sig[i] = signal[i] * *--------------------------------------------------------*/ /*--------------------------------------------------------* * Verification for risk of overflow. * *--------------------------------------------------------*/ //test (); if (L_sub (t0, MAX_32) == 0L) /* Test for overflow */ { for (i = -pit_max; i < L_frame; i++) { scal_sig[i] = shr (signal[i], 3); //move16 (); } scal_fac = 3; //move16 (); } else if (L_sub (t0, (Word32) 1048576L) < (Word32) 0) /* if (t0 < 2^20) */ { //test (); for (i = -pit_max; i < L_frame; i++) { scal_sig[i] = shl (signal[i], 3); //move16 (); } scal_fac = -3; //move16 (); } else { //test (); for (i = -pit_max; i < L_frame; i++) { scal_sig[i] = signal[i]; //move16 (); } scal_fac = 0; //move16 (); } /* calculate all coreelations of scal_sig, from pit_min to pit_max */ corr_ptr = &corr[pit_max]; //move32 (); comp_corr (scal_sig, L_frame, pit_max, pit_min, corr_ptr); /*--------------------------------------------------------------------* * The pitch lag search is divided in three sections. * * Each section cannot have a pitch multiple. * * We find a maximum for each section. * * We compare the maximum of each section by favoring small lags. * * * * First section: lag delay = pit_max downto 4*pit_min * * Second section: lag delay = 4*pit_min-1 downto 2*pit_min * * Third section: lag delay = 2*pit_min-1 downto pit_min * *--------------------------------------------------------------------*/ /* mode dependent scaling in Lag_max */ //test (); if (sub(mode, MR122) == 0) { scal_flag = 1; //move16 (); } else { scal_flag = 0; //move16 (); } #ifdef VAD2 j = shl (pit_min, 2); p_max1 = Lag_max (corr_ptr, scal_sig, scal_fac, scal_flag, L_frame, pit_max, j, &max1, &rmax1, &r01, dtx); //move16 (); /* function result */ i = sub (j, 1); j = shl (pit_min, 1); p_max2 = Lag_max (corr_ptr, scal_sig, scal_fac, scal_flag, L_frame, i, j, &max2, &rmax2, &r02, dtx); //move16 (); /* function result */ i = sub (j, 1); p_max3 = Lag_max (corr_ptr, scal_sig, scal_fac, scal_flag, L_frame, i, pit_min, &max3, &rmax3, &r03, dtx); //move16 (); /* function result */#else j = shl (pit_min, 2); p_max1 = Lag_max (vadSt, corr_ptr, scal_sig, scal_fac, scal_flag, L_frame, pit_max, j, &max1, dtx); //move16 (); /* function result */ i = sub (j, 1); j = shl (pit_min, 1); p_max2 = Lag_max (vadSt, corr_ptr, scal_sig, scal_fac, scal_flag, L_frame, i, j, &max2, dtx); //move16 (); /* function result */ i = sub (j, 1); p_max3 = Lag_max (vadSt, corr_ptr, scal_sig, scal_fac, scal_flag, L_frame, i, pit_min, &max3, dtx); //move16 (); /* function result */ if (dtx) { /* no test() call since this if is only in simulation env */ //test (); if (sub(idx, 1) == 0) { /* calculate max high-passed filtered correlation of all lags */ hp_max (corr_ptr, scal_sig, L_frame, pit_max, pit_min, &corr_hp_max); /* update complex background detector */ vad_complex_detection_update(vadSt, corr_hp_max); } }#endif /*--------------------------------------------------------------------* * Compare the 3 sections maximum, and favor small lag. * *--------------------------------------------------------------------*/ //test (); if (sub (mult (max1, THRESHOLD), max2) < 0) { max1 = max2; //move16 (); p_max1 = p_max2; //move16 (); #ifdef VAD2 if (dtx) { rmax1 = rmax2; //move32 (); r01 = r02; //move32 (); }#endif } //test (); if (sub (mult (max1, THRESHOLD), max3) < 0) { p_max1 = p_max3; //move16 (); #ifdef VAD2 if (dtx) { rmax1 = rmax3; //move32 (); r01 = r03; //move32 (); }#endif }#ifdef VAD2 if (dtx) { vadSt->L_Rmax = L_add(vadSt->L_Rmax, rmax1); /* Save max correlation */ vadSt->L_R0 = L_add(vadSt->L_R0, r01); /* Save max energy */ }#endif return (p_max1);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -