namespace NSpeex { using System; internal abstract class Ltp { protected Ltp() { } protected internal static float Inner_prod(float[] x, int xs, float[] y, int ys, int len) { float num2 = 0f; float num3 = 0f; float num4 = 0f; float num5 = 0f; for (int i = 0; i < len; i += 4) { num2 += x[xs + i] * y[ys + i]; num3 += x[(xs + i) + 1] * y[(ys + i) + 1]; num4 += x[(xs + i) + 2] * y[(ys + i) + 2]; num5 += x[(xs + i) + 3] * y[(ys + i) + 3]; } return (((num2 + num3) + num4) + num5); } protected internal static void Open_loop_nbest_pitch(float[] sw, int swIdx, int start, int end, int len, int[] pitch, float[] gain, int N) { int num; float[] numArray = new float[N]; float[] numArray2 = new float[(end - start) + 1]; float[] numArray3 = new float[(end - start) + 2]; float[] numArray4 = new float[(end - start) + 1]; for (num = 0; num < N; num++) { numArray[num] = -1f; gain[num] = 0f; pitch[num] = start; } numArray3[0] = Inner_prod(sw, swIdx - start, sw, swIdx - start, len); float num4 = Inner_prod(sw, swIdx, sw, swIdx, len); for (num = start; num <= end; num++) { numArray3[(num - start) + 1] = (numArray3[num - start] + (sw[(swIdx - num) - 1] * sw[(swIdx - num) - 1])) - (sw[((swIdx - num) + len) - 1] * sw[((swIdx - num) + len) - 1]); if (numArray3[(num - start) + 1] < 1f) { numArray3[(num - start) + 1] = 1f; } } for (num = start; num <= end; num++) { numArray2[num - start] = 0f; numArray4[num - start] = 0f; } for (num = start; num <= end; num++) { numArray2[num - start] = Inner_prod(sw, swIdx, sw, swIdx - num, len); numArray4[num - start] = (numArray2[num - start] * numArray2[num - start]) / (numArray3[num - start] + 1f); } for (num = start; num <= end; num++) { if (numArray4[num - start] > numArray[N - 1]) { float num5 = numArray2[num - start] / (numArray3[num - start] + 10f); float num6 = (float)Math.Sqrt((double)((num5 * numArray2[num - start]) / (num4 + 10f))); if (num6 > num5) { num6 = num5; } if (num6 < 0f) { num6 = 0f; } for (int i = 0; i < N; i++) { if (numArray4[num - start] > numArray[i]) { for (int j = N - 1; j > i; j--) { numArray[j] = numArray[j - 1]; pitch[j] = pitch[j - 1]; gain[j] = gain[j - 1]; } numArray[i] = numArray4[num - start]; pitch[i] = num; gain[i] = num6; break; } } } } } public abstract int Quant(float[] target, float[] sw, int sws, float[] ak, float[] awk1, float[] awk2, float[] exc, int es, int start, int end, float pitch_coef, int p, int nsf, Bits bits, float[] exc2, int e2s, float[] r, int complexity); public abstract int Unquant(float[] exc, int es, int start, float pitch_coef, int nsf, float[] gain_val, Bits bits, int count_lost, int subframe_offset, float last_pitch_gain); } }