www.pudn.com > eval-1.2.zip > stat.c
#include#include #include #include #include #include "def.h" #include "stat.h" void CalcDist(dump_t *pD, unsigned l, loss_t *pS) { unsigned long i, j; for (i=0; i = CN) j = CN - 1; pS->cl[j].size++; switch (pD[i].type) { case 'I': pS->cl[j].I++; break; case 'P': pS->cl[j].P++; break; case 'B': pS->cl[j].B++; break; default : break; } if (pD[i].lost) pS->cl[j].lost++; } } void CalcLoss(dump_t *pD, unsigned l, loss_t *pS, char *id) { FILE *f; unsigned long i, w = 0; char s[32]; for (i=0; i nH++; if (pD[i].lost) pS->lH++; break; case 'I': pS->nI++; if (pD[i].lost) pS->lI++; break; case 'P': pS->nP++; if (pD[i].lost) pS->lP++; break; case 'B': pS->nB++; if (pD[i].lost) pS->lB++; break; default : if (pD[i].lost) w++; break; } pS->nA = pS->nH + pS->nI + pS->nP + pS->nB; pS->lA = pS->lH + pS->lI + pS->lP + pS->lB; if (id) { sprintf(s, "loss_%s.txt", id); if ((f = fopen(s, "w")) == 0) { fprintf(stderr, "Could not open %s\n", s); return; } if (!w) fprintf(f, "%8.1f%8.1f%8.1f%8.1f\n", pS->nI ? 100. * pS->lI / pS->nI : 0, pS->nP ? 100. * pS->lP / pS->nP : 0, pS->nB ? 100. * pS->lB / pS->nB : 0, pS->nA ? 100. * pS->lA / pS->nA : 0); else fprintf(f, "%8.1f\n", l ? 100. * w / l : 0); fclose(f); } } void CalcJitter(dump_t *pD, unsigned l) { int i, j; double tmp; for (i=0; i =0; j--) if (!pD[j].lost) { tmp = pD[i].t2 - pD[j].t2; break; } }/* else tmp = pD[i].j1;*/ pD[i].d2 = tmp - pD[i].j1; } pD[0].j1 = 0; pD[0].j2 = 0; } void CalcDelay(dump_t *pD, unsigned l) { int i, j; double tmp; for (i=0; i =0; j--) if (!pD[j].lost) { tmp = pD[i].t2 - pD[j].t2; break; } } */ /* else tmp = pD[i].j1;*/ /*pD[i].d2 = tmp - pD[i].j1;*/ if (pD[i].lost == 0) pD[i].d2 = pD[i].t2 - pD[i].t1; else pD[i].d2 = 0.0; } pD[0].j1 = 0; pD[0].j2 = 0; } #if 0 void CalcJitter(dump_t *pD, unsigned l) { double tb=0, j1=0, j2=0; unsigned i, tbi=0; if (pD[0].t1 != 0) { i = l; while (i--) pD[i].j1 = pD[i].t1 - pD[0].t1; } if (pD[0].t2 != 0) { i = l; while (i--) pD[i].j2 = pD[i].t2 - pD[0].t2; } for (i=0; i = tbi ? pD[i-1].t2 + (pD[i].t1 - pD[i-1].t1) : tb; for (i=0; i 25) id[25] = 0; for (i=0, hist[i] = 0; i max / width) j = max / width; hist[j]++; } if (id) { sprintf(s, "jitt_%s", id); if ((f = fopen(s, "w")) == 0) { fprintf(stderr, "Could not open %s\n", s); return; } for (i=0; i tdrop) F[i].lost = 1, F[i].d2 = F[i-1].d2 + tdrop; else F[i].d2 = F[i-1].d2 + (F[i].t2 - F[i-1].t2); for (i=0; i nF; i++) if (!D->F[i].lost && D->F[i].d2 > tdrop) D->F[i].lost = 1; } #endif void PoBLoss(data_t *D, unsigned PoB) { double cjit = 0, tdrop = PoB / 1000.; unsigned i,j; j = 0; for (i=1; i nF; i++) { if (j==425) printf("here\n"); #ifndef PLAYOUT_TIME_LMTD cjit += D->F[i].d2; #else cjit = D->F[i].d2; #endif if (!D->F[i].lost && cjit > tdrop) #ifndef PLAYOUT_TIME_LMTD { D->F[i].lost = 1; } #else { D->F[i].lost = (int) ((cjit-tdrop)/0.03333)+2; D->F[i].play = j + D->F[i].lost - 1; /* Point to which frame instance this frame can be sed */ } #endif if (D->F[i].type != 'H') j++; } } void CalcTime(dump_t *P, unsigned l, char *id) { FILE *f; char s[32]; if (id) { sprintf(s, "time_%s", id); if ((f = fopen(s, "w")) == 0) { fprintf(stderr, "Could not open %s\n", s); return; } } else f = stdout; fprintf(f, "%.2f\n", P[l-1].t2 - P[0].t2); fclose(f); } double avg(avg_t *pD, DIR dir, double start, double end) { int i = 0, j = 0; double sum = 0; while (i < pD->nP && pD->P[i].t[dir] < start) i++; while (i < pD->nP && (pD->P[i].t[dir] < end || pD->P[i].t[dir] == -1 || end == -1)) { if (pD->P[i].signal[dir] != -1 && pD->P[i].t[dir] != -1) { sum += pD->P[i].signal[dir]; j++; } i++; } return j ? sum / j : 0; } double std(avg_t *pD, DIR dir, double start, double end, double mean) { int i = 0, j = 0; double v = 0; if (mean == DBL_MAX) mean = avg(pD, dir, start, end); while (i < pD->nP && pD->P[i].t[dir] < start) i++; while (i < pD->nP && (pD->P[i].t[dir] < end || pD->P[i].t[dir] == -1 || end == -1)) { if (pD->P[i].signal[dir] != -1 && pD->P[i].t[dir] != -1) { v += (pD->P[i].signal[dir] - mean) * (pD->P[i].signal[dir] - mean); j++; } i++; } return sqrt(j - 1 ? v / (j - 1) : 0); } double expsmooth(avg_t *pD, DIR dir, double start, double end, double p) { int i = 0; double g = -424242; while (i < pD->nP && pD->P[i].t[dir] < start) i++; while (i < pD->nP && (pD->P[i].t[dir] < end || pD->P[i].t[dir] == -1 || end == -1)) { if (pD->P[i].signal[dir] != -1 && pD->P[i].t[dir] != -1) { if (g == -424242) g = pD->P[i].signal[dir]; else { g = p * pD->P[i].signal[dir] + (1 - p) * g; } } i++; } return g; } /* double min(avg_t *pD, DIR dir, double start, double end) { int i = 0; double min; while (i < pD->nP && pD->P[i].t[dir] < start) i++; min = pD->P[i++].signal[dir]; while (i < pD->nP && (pD->P[i].t[dir] < end || pD->P[i].t[dir] == -1 || end == -1)) { if (pD->P[i].signal[dir] != 0 && pD->P[i].t[dir] != -1) { if (pD->P[i].signal[dir] < min) min = pD->P[i].signal[dir]; } i++; } return min; } double max(avg_t *pD, DIR dir, double start, double end) { int i = 0; double max; while (i < pD->nP && pD->P[i].t[dir] < start) i++; max = pD->P[i++].signal[dir]; while (i < pD->nP && (pD->P[i].t[dir] < end || pD->P[i].t[dir] == -1 || end == -1)) { if (pD->P[i].signal[dir] != 0 && pD->P[i].t[dir] != -1) { if (pD->P[i].signal[dir] > max) max = pD->P[i].signal[dir]; } i++; } return max; } void norm(avg_t *pD) { unsigned i; double min1, max1, min2, max2; MINV(min1, pD, TO_MOBILE, pD->P[0].t[TO_MOBILE], pD->P[pD->nP - 1].t[TO_MOBILE], signal); MINV(min2, pD, FROM_MOBILE, pD->P[0].t[FROM_MOBILE], pD->P[pD->nP - 1].t[FROM_MOBILE], signal); MAXV(max1, pD, TO_MOBILE, pD->P[0].t[TO_MOBILE], pD->P[pD->nP - 1].t[TO_MOBILE], signal); MAXV(max2, pD, FROM_MOBILE, pD->P[0].t[FROM_MOBILE], pD->P[pD->nP - 1].t[FROM_MOBILE], signal); MINV(min1, pD, TO_MOBILE, pD->P[0].t[TO_MOBILE], pD->P[pD->nP - 1].t[TO_MOBILE], signal); MINV(min2, pD, FROM_MOBILE, pD->P[0].t[FROM_MOBILE], pD->P[pD->nP - 1].t[FROM_MOBILE], signal); MAXV(max1, pD, TO_MOBILE, pD->P[0].t[TO_MOBILE], pD->P[pD->nP - 1].t[TO_MOBILE], signal); MAXV(max2, pD, FROM_MOBILE, pD->P[0].t[FROM_MOBILE], pD->P[pD->nP - 1].t[FROM_MOBILE], signal); min1 = min(pD, TO_MOBILE, pD->P[0].t[TO_MOBILE], pD->P[pD->nP - 1].t[TO_MOBILE]); min2 = min(pD, FROM_MOBILE, pD->P[0].t[FROM_MOBILE], pD->P[pD->nP - 1].t[FROM_MOBILE]); max1 = max(pD, TO_MOBILE, pD->P[0].t[TO_MOBILE], pD->P[pD->nP - 1].t[TO_MOBILE]); max2 = max(pD, FROM_MOBILE, pD->P[0].t[FROM_MOBILE], pD->P[pD->nP - 1].t[FROM_MOBILE]); for (i=0; i nP; i++) { if (pD->P[i].signal[TO_MOBILE]) pD->P[i].signal[TO_MOBILE] = 2 * (pD->P[i].signal[TO_MOBILE] - min1) / (max1 - min1) - 1; if (pD->P[i].signal[FROM_MOBILE]) pD->P[i].signal[FROM_MOBILE] = 2 * (pD->P[i].signal[FROM_MOBILE] - min2) / (max2 - min2) - 1; } } */ void norm1(avg_t *pD, double iv) { unsigned i, j; double avg1, avg2; i = 0; while (i < pD->nP && pD->P[i].t[TO_MOBILE] < iv) i++; for (j=i; j nP; j++) { avg1 = avg(pD, TO_MOBILE, pD->P[j].t[TO_MOBILE] - iv, pD->P[j].t[TO_MOBILE]); if (pD->P[j].signal[TO_MOBILE] != -1 && pD->P[j].t[TO_MOBILE] != -1 && avg1 != 0) pD->P[j].avg[TO_MOBILE] = pD->P[j].signal[TO_MOBILE] - avg1; else pD->P[j].avg[TO_MOBILE] = -424242; } i = 0; while (i < pD->nP && pD->P[i].t[FROM_MOBILE] < iv) i++; for (j=i; j nP; j++) { avg2 = avg(pD, FROM_MOBILE, pD->P[j].t[FROM_MOBILE] - iv, pD->P[j].t[FROM_MOBILE]); if (pD->P[j].signal[FROM_MOBILE] != -1 && pD->P[j].t[FROM_MOBILE] != -1 && avg2 != 0) pD->P[j].avg[FROM_MOBILE] = pD->P[j].signal[FROM_MOBILE] - avg2; else pD->P[j].avg[FROM_MOBILE] = -424242; } } int pred(avg_t *pD, DIR dir, int n, double hor) { unsigned i = n; if (pD->P[n].t[dir] == -1) return -1; while (i < pD->nP && (pD->P[i].t[dir] <= pD->P[n].t[dir] + hor + TT || pD->P[i].t[dir] == -1)) i++; --i; if (pD->P[i].t[dir] == -1 || pD->P[i].t[dir] <= pD->P[n].t[dir] + hor - TT) return -1; return i; } double KorrKoeff(avg_t *pD, double start, double end) { int i = 0, j = 0, k = 0; double avg1, avg2, std1, std2, r = 0; avg1 = avg(pD, TO_MOBILE, start, end); std1 = std(pD, TO_MOBILE, start, end, avg1); avg2 = avg(pD, FROM_MOBILE, start, end); std2 = std(pD, FROM_MOBILE, start, end, avg2); while (i < pD->nP && pD->P[i].t[TO_MOBILE] < start) i++; while (k < pD->nP && pD->P[k].t[FROM_MOBILE] < start) k++; while (i < pD->nP && k < pD->nP && pD->P[i].t[TO_MOBILE] < end && pD->P[k].t[FROM_MOBILE] < end) { if (pD->P[i].signal[TO_MOBILE] != 0 && pD->P[k].signal[FROM_MOBILE] != 0) { r += (pD->P[i].signal[TO_MOBILE] - avg1) * (pD->P[k].signal[FROM_MOBILE] - avg2); j++; } i++; k++; } return j && std1 * std2 ? (r / j) / (std1 * std2) : 0; } double AutoKorr(avg_t *pD, double start, double end) { int i = 0, j = 0; double a = 0; while (i < pD->nP && pD->P[i].t[TO_MOBILE] < start) i++; while (i < pD->nP && pD->P[i].t[TO_MOBILE] < end) { if (pD->P[i].signal[TO_MOBILE] != 0) { a += pD->P[i].signal[TO_MOBILE] * pD->P[j].signal[FROM_MOBILE]; j++; } i++; } return j ? a / j : 0; } void Hist(double *D, unsigned l, double min, double max, unsigned interv) { int i, k, *hist, num = 0; double cdf = 0; if ((hist = calloc(interv, sizeof *hist)) == 0) { fprintf(stderr, "malloc error!"); return; } for (i=0; i = interv) k = interv - 1; ++hist[k]; ++num; } for (i=0; i