|
|
|
@ -412,18 +412,39 @@ static void compute_svector(QCELPContext *q, const float *gain, |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Apply generic gain control. |
|
|
|
|
* Compute the gain control |
|
|
|
|
* |
|
|
|
|
* @param v_out output vector |
|
|
|
|
* @param v_in gain-controlled vector |
|
|
|
|
* @param v_ref vector to control gain of |
|
|
|
|
* |
|
|
|
|
* @return gain control |
|
|
|
|
* |
|
|
|
|
* FIXME: If v_ref is a zero vector, it energy is zero |
|
|
|
|
* and the behavior of the gain control is |
|
|
|
|
* undefined in the specs. |
|
|
|
|
* |
|
|
|
|
* TIA/EIA/IS-733 2.4.8.3-2/3/4/5, 2.4.8.6 |
|
|
|
|
*/ |
|
|
|
|
static float compute_gain_ctrl(const float *v_ref, const float *v_in, const int len) |
|
|
|
|
{ |
|
|
|
|
float scalefactor = ff_dot_productf(v_in, v_in, len); |
|
|
|
|
|
|
|
|
|
if(scalefactor) |
|
|
|
|
scalefactor = sqrt(ff_dot_productf(v_ref, v_ref, len) / scalefactor); |
|
|
|
|
else |
|
|
|
|
ff_log_missing_feature(NULL, "Zero energy for gain control", 1); |
|
|
|
|
return scalefactor; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Apply generic gain control. |
|
|
|
|
* |
|
|
|
|
* @param v_out output vector |
|
|
|
|
* @param v_in gain-controlled vector |
|
|
|
|
* @param v_ref vector to control gain of |
|
|
|
|
* |
|
|
|
|
* TIA/EIA/IS-733 2.4.8.3, 2.4.8.6 |
|
|
|
|
*/ |
|
|
|
|
static void apply_gain_ctrl(float *v_out, const float *v_ref, |
|
|
|
|
const float *v_in) |
|
|
|
|
{ |
|
|
|
@ -432,12 +453,7 @@ static void apply_gain_ctrl(float *v_out, const float *v_ref, |
|
|
|
|
|
|
|
|
|
for(i=0, j=0; i<4; i++) |
|
|
|
|
{ |
|
|
|
|
scalefactor = ff_dot_productf(v_in + j, v_in + j, 40); |
|
|
|
|
if(scalefactor) |
|
|
|
|
scalefactor = sqrt(ff_dot_productf(v_ref + j, v_ref + j, 40) |
|
|
|
|
/ scalefactor); |
|
|
|
|
else |
|
|
|
|
ff_log_missing_feature(NULL, "Zero energy for gain control", 1); |
|
|
|
|
scalefactor = compute_gain_ctrl(v_ref + j, v_in + j, 40); |
|
|
|
|
for(len=j+40; j<len; j++) |
|
|
|
|
v_out[j] = scalefactor * v_in[j]; |
|
|
|
|
} |
|
|
|
|