summaryrefslogtreecommitdiffstats
path: root/imbe_vocoder
diff options
context:
space:
mode:
authormax <max@65a5c917-d112-43f1-993d-58c26a4786be>2010-10-27 18:29:02 +0000
committermax <max@65a5c917-d112-43f1-993d-58c26a4786be>2010-10-27 18:29:02 +0000
commitbfa1254ca875f92fe04d8be67c1bda3d5ca5e3a3 (patch)
treef681ce1dc7fe2369ad79d495975fc7120774cdab /imbe_vocoder
parent129e9d1d8e6f7edd145d5f60c5b900f2149430b2 (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.cc1
-rw-r--r--imbe_vocoder/src/lib/pitch_est.cc75
-rw-r--r--imbe_vocoder/src/lib/sa_decode.cc2
-rw-r--r--imbe_vocoder/src/lib/sa_encode.cc4
-rw-r--r--imbe_vocoder/src/lib/sa_enh.cc2
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);