void WebRtcIsac_Time2Spec(double *inre1, double *inre2, int16_t *outreQ7, int16_t *outimQ7, FFTstr *fftstr_obj) { int k; int dims[1]; double tmp1r, tmp1i, xr, xi, yr, yi, fact; double tmpre[FRAMESAMPLES_HALF], tmpim[FRAMESAMPLES_HALF]; dims[0] = FRAMESAMPLES_HALF; /* Multiply with complex exponentials and combine into one complex vector */ fact = 0.5 / sqrt(FRAMESAMPLES_HALF); for (k = 0; k < FRAMESAMPLES_HALF; k++) { tmp1r = costab1[k]; tmp1i = sintab1[k]; tmpre[k] = (inre1[k] * tmp1r + inre2[k] * tmp1i) * fact; tmpim[k] = (inre2[k] * tmp1r - inre1[k] * tmp1i) * fact; } /* Get DFT */ WebRtcIsac_Fftns(1, dims, tmpre, tmpim, -1, 1.0, fftstr_obj); /* Use symmetry to separate into two complex vectors and center frames in time around zero */ for (k = 0; k < FRAMESAMPLES_QUARTER; k++) { xr = tmpre[k] + tmpre[FRAMESAMPLES_HALF - 1 - k]; yi = -tmpre[k] + tmpre[FRAMESAMPLES_HALF - 1 - k]; xi = tmpim[k] - tmpim[FRAMESAMPLES_HALF - 1 - k]; yr = tmpim[k] + tmpim[FRAMESAMPLES_HALF - 1 - k]; tmp1r = costab2[k]; tmp1i = sintab2[k]; outreQ7[k] = (int16_t)WebRtcIsac_lrint((xr * tmp1r - xi * tmp1i) * 128.0); outimQ7[k] = (int16_t)WebRtcIsac_lrint((xr * tmp1i + xi * tmp1r) * 128.0); outreQ7[FRAMESAMPLES_HALF - 1 - k] = (int16_t)WebRtcIsac_lrint((-yr * tmp1i - yi * tmp1r) * 128.0); outimQ7[FRAMESAMPLES_HALF - 1 - k] = (int16_t)WebRtcIsac_lrint((-yr * tmp1r + yi * tmp1i) * 128.0); } }
/* Update filter parameters based on the pitch-gains and pitch-lags. */ static void Update(PitchFilterParam* parameters) { double fraction; int fraction_index; /* Compute integer lag-offset. */ parameters->lag_offset = WebRtcIsac_lrint(parameters->lag + PITCH_FILTDELAY + 0.5); /* Find correct set of coefficients for computing fractional pitch. */ fraction = parameters->lag_offset - (parameters->lag + PITCH_FILTDELAY); fraction_index = WebRtcIsac_lrint(PITCH_FRACS * fraction - 0.5); parameters->interpol_coeff = kIntrpCoef[fraction_index]; if (parameters->mode == kPitchFilterPreGain) { /* If in this mode make a differential change to pitch gain. */ parameters->gain_mult[parameters->sub_frame] += 0.2; if (parameters->gain_mult[parameters->sub_frame] > 1.0) { parameters->gain_mult[parameters->sub_frame] = 1.0; } if (parameters->sub_frame > 0) { parameters->gain_mult[parameters->sub_frame - 1] -= 0.2; } } }