diff options
author | max <max@65a5c917-d112-43f1-993d-58c26a4786be> | 2010-10-27 18:29:02 +0000 |
---|---|---|
committer | max <max@65a5c917-d112-43f1-993d-58c26a4786be> | 2010-10-27 18:29:02 +0000 |
commit | bfa1254ca875f92fe04d8be67c1bda3d5ca5e3a3 (patch) | |
tree | f681ce1dc7fe2369ad79d495975fc7120774cdab /imbe_vocoder | |
parent | 129e9d1d8e6f7edd145d5f60c5b900f2149430b2 (diff) |
add changes from Pavel
git-svn-id: http://op25.osmocom.org/svn/trunk@223 65a5c917-d112-43f1-993d-58c26a4786be
Diffstat (limited to 'imbe_vocoder')
-rw-r--r-- | imbe_vocoder/src/lib/encode.cc | 1 | ||||
-rw-r--r-- | imbe_vocoder/src/lib/pitch_est.cc | 75 | ||||
-rw-r--r-- | imbe_vocoder/src/lib/sa_decode.cc | 2 | ||||
-rw-r--r-- | imbe_vocoder/src/lib/sa_encode.cc | 4 | ||||
-rw-r--r-- | imbe_vocoder/src/lib/sa_enh.cc | 2 |
5 files changed, 42 insertions, 42 deletions
diff --git a/imbe_vocoder/src/lib/encode.cc b/imbe_vocoder/src/lib/encode.cc index 262d2dd..a8f12ff 100644 --- a/imbe_vocoder/src/lib/encode.cc +++ b/imbe_vocoder/src/lib/encode.cc @@ -48,6 +48,7 @@ void imbe_vocoder::encode_init(void) pitch_est_init(); fft_init(); dc_rmv_mem = 0; + sa_encode_init(); } diff --git a/imbe_vocoder/src/lib/pitch_est.cc b/imbe_vocoder/src/lib/pitch_est.cc index 4d0eb75..25ba61a 100644 --- a/imbe_vocoder/src/lib/pitch_est.cc +++ b/imbe_vocoder/src/lib/pitch_est.cc @@ -193,6 +193,7 @@ void imbe_vocoder::pitch_est(IMBE_PARAM *imbe_param, Word16 *frames_buf) UWord32 UL_tmp; Word16 e_p_cur, pb, pf, ceb, s_tmp; Word16 cef_est, cef, p0_est, p0, p1, p2, p1_max_index, p2_max_index, e1p1_e2p2_est, e1p1_e2p2; + Word16 e_p_arr2_min[203]; // Calculate E(p) function for current and two future frames e_p(&frames_buf[0], e_p_arr0); @@ -233,45 +234,41 @@ void imbe_vocoder::pitch_est(IMBE_PARAM *imbe_param, Word16 *frames_buf) cef_est = e_p_arr0[p0] + e_p_arr1[p0] + e_p_arr2[p0]; e1p1_e2p2 = 1; - while(p0 < 203) - { - e1p1_e2p2_est = e_p_arr1[p0] + e_p_arr2[p0]; - - p1 = HI_BYTE(min_max_tbl[p0]); - p1_max_index = LO_BYTE(min_max_tbl[p0]); - - while(p1 <= p1_max_index) - { - p2 = HI_BYTE(min_max_tbl[p1]); - p2_max_index = LO_BYTE(min_max_tbl[p1]); - - s_tmp = sub(e1p1_e2p2_est, e_p_arr1[p1]); - - while(p2 <= p2_max_index) - { - //e1p1_e2p2 = add(e_p_arr1[p1], e_p_arr2[p2]); - //if(e1p1_e2p2 < e1p1_e2p2_est) - if(e_p_arr2[p2] < s_tmp) - { - //printf("p0 = %d p1 = %d p2 = %d %g\n", p0, p1, p2, (double)e1p1_e2p2/4096.); - e1p1_e2p2_est = add(e_p_arr1[p1], e_p_arr2[p2]);//e1p1_e2p2; - s_tmp = e_p_arr2[p2]; - } - p2++; - } - p1++; - } - - e1p1_e2p2_est_save[p0] = e1p1_e2p2_est; - - cef = add(e_p_arr0[p0], e1p1_e2p2_est); - if(cef < cef_est) - { - cef_est = cef; - p0_est = p0; - } - p0++; - } + p1 = 0; + while(p1 < 203) + { + p2 = HI_BYTE(min_max_tbl[p1]); + p2_max_index = LO_BYTE(min_max_tbl[p1]); + s_tmp = e_p_arr2[p1]; + while(p2 <= p2_max_index) + { + if(e_p_arr2[p2] < s_tmp) + s_tmp = e_p_arr2[p2]; + p2++; + } + e_p_arr2_min[p1] = s_tmp; + p1++; + } + while(p0 < 203) + { + e1p1_e2p2_est = e_p_arr1[p0] + e_p_arr2_min[p0]; + p1 = HI_BYTE(min_max_tbl[p0]); + p1_max_index = LO_BYTE(min_max_tbl[p0]); + while(p1 <= p1_max_index) + { + if(add(e_p_arr1[p1], e_p_arr2_min[p1]) < e1p1_e2p2_est) + e1p1_e2p2_est = add(e_p_arr1[p1], e_p_arr2_min[p1]); + p1++; + } + e1p1_e2p2_est_save[p0] = e1p1_e2p2_est; + cef = add(e_p_arr0[p0], e1p1_e2p2_est); + if(cef < cef_est) + { + cef_est = cef; + p0_est = p0; + } + p0++; + } pf = p0_est; // Sub-multiples analysis diff --git a/imbe_vocoder/src/lib/sa_decode.cc b/imbe_vocoder/src/lib/sa_decode.cc index 9a50377..27c30aa 100644 --- a/imbe_vocoder/src/lib/sa_decode.cc +++ b/imbe_vocoder/src/lib/sa_decode.cc @@ -161,7 +161,7 @@ void imbe_vocoder::sa_decode(IMBE_PARAM *imbe_param) for(i = 0; i < num_harms; i++) { index = (UWord16)(k_acc >> 24); // Get integer part - si_coef = (Word16)((k_acc - (index << 24)) >> 9); // Get fractional part + si_coef = (Word16)((k_acc - ((UWord32)index << 24)) >> 9); // Get fractional part if(si_coef == 0) { diff --git a/imbe_vocoder/src/lib/sa_encode.cc b/imbe_vocoder/src/lib/sa_encode.cc index 8ee827a..7553f74 100644 --- a/imbe_vocoder/src/lib/sa_encode.cc +++ b/imbe_vocoder/src/lib/sa_encode.cc @@ -93,7 +93,7 @@ void imbe_vocoder::sa_encode(IMBE_PARAM *imbe_param) for(i = 0; i < num_harms; i++) { index = (UWord16)(k_acc >> 24); // Get integer part - si_coef = (Word16)((k_acc - (index << 24)) >> 9); // Get fractional part + si_coef = (Word16)((k_acc - ((UWord32)index << 24)) >> 9); // Get fractional part if(si_coef == 0) @@ -268,7 +268,7 @@ void imbe_vocoder::sa_encode(IMBE_PARAM *imbe_param) for(i = 0; i < num_harms; i++) { index = (UWord16)(k_acc >> 24); // Get integer part - si_coef = (Word16)((k_acc - (index << 24)) >> 9); // Get fractional part + si_coef = (Word16)((k_acc - ((UWord32)index << 24)) >> 9); // Get fractional part if(si_coef == 0) { diff --git a/imbe_vocoder/src/lib/sa_enh.cc b/imbe_vocoder/src/lib/sa_enh.cc index 3b34045..c6586eb 100644 --- a/imbe_vocoder/src/lib/sa_enh.cc +++ b/imbe_vocoder/src/lib/sa_enh.cc @@ -108,6 +108,8 @@ void sa_enh(IMBE_PARAM *imbe_param) nm2 = norm_l(w0); L_den = L_mpy_ls(L_den, extract_h(L_shl(w0, nm2))); // Calculate w0 * Rm0 * (Rm0^2 - Rm1^2) nm1 += nm2; // total denominator shift + + if (L_den < 1) return; // fix bug infinite loop due to invalid input L_sum_Rm02_Rm12 = L_add(L_shr(L_Rm0_2, 2), L_shr(L_Rm1_2, 2)); Rm0Rm1 = shr(mult_r(Rm0_s, Rm1_s), 1); |