00001 #include <math.h>
00002 #include "c_lpc10.h"
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038 VOID vparms( INDEX vwin[AF][2], FLOAT inbuf[], FLOAT lpbuf[],
00039 INDEX half, FLOAT *dither, INDEX mintau, INDEX *zc,
00040 INDEX *lbe, INDEX *fbe, FLOAT *qs, FLOAT *rc1,
00041 FLOAT *ar_b, FLOAT *ar_f )
00042 {
00043 INDEX i, vlen, start, stop;
00044 BOOL oldsgn, sign;
00045 FLOAT lp_rms, ap_rms, e_pre, e0ap, e_0, e_b, r_b, e_f, r_f, tmp;
00046 FLOAT *ptr1, *ptr2;
00047
00048
00049
00050
00051
00052 lp_rms = ap_rms = e_pre = e0ap = (FLOAT)0.0;
00053 e_0 = e_b = e_f = r_f = r_b = (FLOAT)0.0;
00054 *rc1 = (FLOAT)0.0;
00055 *zc = 0;
00056
00057 vlen = vwin[AF-1][1] - vwin[AF-1][0] + 1;
00058 start = vwin[AF-1][0] + half * (vlen >> 1) + 1;
00059 stop = start + (vlen >> 1);
00060 oldsgn = (inbuf[start-1] - (*dither) < 0);
00061 ptr1 = lpbuf + start;
00062 ptr2 = inbuf + start;
00063 for (i = start; i < stop; i++) {
00064 lp_rms += (FLOAT)fabs(*ptr1);
00065 ap_rms += (FLOAT)fabs(*ptr2);
00066 e_pre += (FLOAT)fabs((*ptr2) - (*(ptr2-1)));
00067 e0ap += (*ptr2) * (*ptr2);
00068 *rc1 += (*ptr2) * (*(ptr2-1));
00069 e_0 += (*ptr1) * (*ptr1);
00070 e_b += (*(ptr1 - mintau)) * (*(ptr1 - mintau));
00071 e_f += (*(ptr1 + mintau)) * (*(ptr1 + mintau));
00072 r_f += (*ptr1) * (*(ptr1 + mintau));
00073 r_b += (*ptr1) * (*(ptr1 - mintau));
00074 sign = (*ptr2 + (*dither) < 0);
00075 if (sign != oldsgn) {
00076 (*zc)++;
00077 oldsgn = sign;
00078 }
00079 *dither = -(*dither);
00080 ptr1++;
00081 ptr2++;
00082 }
00083
00084
00085 if (e0ap>(FLOAT)1.0)
00086 *rc1 /= e0ap;
00087
00088
00089
00090 if (ap_rms>(FLOAT)0.5)
00091 *qs = e_pre / ((FLOAT)2.0 * ap_rms);
00092 else
00093 *qs = e_pre;
00094
00095
00096
00097 *ar_b = (r_b * r_b);
00098 if (e_b>(FLOAT)1.0)
00099 *ar_b /= e_b;
00100 if (e_0>(FLOAT)1.0)
00101 *ar_b /= e_0;
00102
00103
00104 *ar_f = (r_f * r_f);
00105 if (e_f>(FLOAT)1.0)
00106 *ar_f /= e_f;
00107 if (e_0>(FLOAT)1.0)
00108 *ar_f /= e_0;
00109
00110
00111
00112
00113
00114
00115
00116 tmp = (FLOAT)LFRAME / (FLOAT)vlen;
00117 *zc = (INDEX)( (FLOAT)(*zc) * tmp + (FLOAT)0.5 );
00118 lp_rms *= tmp * (FLOAT)0.125;
00119 *lbe = (lp_rms>(FLOAT)32767.0) ? (INDEX)32767
00120 : (INDEX)(lp_rms + (FLOAT)0.5);
00121 ap_rms *= tmp * (FLOAT)0.125;
00122 *fbe = (ap_rms>(FLOAT)32767.0) ? (INDEX)32767
00123 : (INDEX)(ap_rms + (FLOAT)0.5);
00124 }
00125
00126