⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 helpfun.c

📁 视频监控vc源代码.对于做视频系统的朋友们很有帮助
💻 C
字号:
/******************************************************************    iLBC Speech Coder ANSI-C Source Code    helpfun.c     Copyright (C) The Internet Society (2004).     All Rights Reserved.******************************************************************/#include <math.h>#include "iLBC_define.h"#include "helpfun.h"#include "constants.h"/*----------------------------------------------------------------* *  calculation of auto correlation  *---------------------------------------------------------------*/void autocorr(     float *r,       /* (o) autocorrelation vector */    const float *x, /* (i) data vector */    int N,          /* (i) length of data vector */    int order       /* largest lag for calculated                        autocorrelations */){    int     lag, n;    float   sum;        for (lag = 0; lag <= order; lag++) {        sum = 0;        for (n = 0; n < N - lag; n++) {            sum += x[n] * x[n+lag];        }        r[lag] = sum;    }}/*----------------------------------------------------------------* *  window multiplication   *---------------------------------------------------------------*/void window(     float *z,       /* (o) the windowed data */    const float *x, /* (i) the original data vector */    const float *y, /* (i) the window */    int N           /* (i) length of all vectors */){    int     i;        for (i = 0; i < N; i++) {        z[i] = x[i] * y[i];    }}/*----------------------------------------------------------------* *  levinson-durbin solution for lpc coefficients *---------------------------------------------------------------*/void levdurb(     float *a,       /* (o) lpc coefficient vector starting                            with 1.0 */    float *k,       /* (o) reflection coefficients */    float *r,       /* (i) autocorrelation vector */    int order       /* (i) order of lpc filter */){    float  sum, alpha;    int     m, m_h, i;    a[0] = 1.0;        if (r[0] < EPS) { /* if r[0] <= 0, set LPC coeff. to zero */        for (i = 0; i < order; i++) {            k[i] = 0;            a[i+1] = 0;        }       } else {        a[1] = k[0] = -r[1]/r[0];        alpha = r[0] + r[1] * k[0];        for (m = 1; m < order; m++){            sum = r[m + 1];            for (i = 0; i < m; i++){                sum += a[i+1] * r[m - i];            }            k[m] = -sum / alpha;            alpha += k[m] * sum;            m_h = (m + 1) >> 1;            for (i = 0; i < m_h; i++){                sum = a[i+1] + k[m] * a[m - i];                a[m - i] += k[m] * a[i+1];                a[i+1] = sum;            }            a[m+1] = k[m];        }    }}/*----------------------------------------------------------------* *  interpolation between vectors  *---------------------------------------------------------------*/void interpolate(     float *out,      /* (o) the interpolated vector */    float *in1,     /* (i) the first vector for the                            interpolation */    float *in2,     /* (i) the second vector for the                            interpolation */    float coef,      /* (i) interpolation weights */    int length      /* (i) length of all vectors */){    int i;    float invcoef;    invcoef = (float)1.0 - coef;    for (i = 0; i < length; i++) {        out[i] = coef * in1[i] + invcoef * in2[i];    }}/*----------------------------------------------------------------* *  lpc bandwidth expansion                    *---------------------------------------------------------------*/void bwexpand(     float *out,      /* (o) the bandwidth expanded lpc                            coefficients */    float *in,      /* (i) the lpc coefficients before bandwidth                            expansion */    float coef,     /* (i) the bandwidth expansion factor */    int length      /* (i) the length of lpc coefficient vectors */){    int i;    float  chirp;        chirp = coef;        out[0] = in[0];    for (i = 1; i < length; i++) {        out[i] = chirp * in[i];        chirp *= coef;    }}/*----------------------------------------------------------------* *  vector quantization  *---------------------------------------------------------------*/void vq(     float *Xq,      /* (o) the quantized vector */    int *index,     /* (o) the quantization index */    const float *CB,/* (i) the vector quantization codebook */    float *X,       /* (i) the vector to quantize */    int n_cb,       /* (i) the number of vectors in the codebook */    int dim         /* (i) the dimension of all vectors */){    int     i, j;    int     pos, minindex;    float   dist, tmp, mindist;    pos = 0;    mindist = FLOAT_MAX;    minindex = 0;    for (j = 0; j < n_cb; j++) {        dist = X[0] - CB[pos];        dist *= dist;        for (i = 1; i < dim; i++) {            tmp = X[i] - CB[pos + i];            dist += tmp*tmp;        }                if (dist < mindist) {            mindist = dist;            minindex = j;        }        pos += dim;    }    for (i = 0; i < dim; i++) {        Xq[i] = CB[minindex*dim + i];    }    *index = minindex;}/*----------------------------------------------------------------* *  split vector quantization  *---------------------------------------------------------------*/void SplitVQ(     float *qX,      /* (o) the quantized vector */    int *index,     /* (o) a vector of indexes for all vector                           codebooks in the split */    float *X,       /* (i) the vector to quantize */    const float *CB,/* (i) the quantizer codebook */    int nsplit,     /* the number of vector splits */    const int *dim, /* the dimension of X and qX */    const int *cbsize /* the number of vectors in the codebook */){    int    cb_pos, X_pos, i;        cb_pos = 0;    X_pos= 0;    for (i = 0; i < nsplit; i++) {        vq(qX + X_pos, index + i, CB + cb_pos, X + X_pos,             cbsize[i], dim[i]);        X_pos += dim[i];        cb_pos += dim[i] * cbsize[i];    }}/*----------------------------------------------------------------* *  scalar quantization  *---------------------------------------------------------------*/void sort_sq(     float *xq,      /* (o) the quantized value */    int *index,     /* (o) the quantization index */    float x,    /* (i) the value to quantize */    const float *cb,/* (i) the quantization codebook */    int cb_size      /* (i) the size of the quantization codebook */){    int i;        if (x <= cb[0]) {        *index = 0;        *xq = cb[0];    } else {        i = 0;        while ((x > cb[i]) && i < cb_size - 1) {            i++;        }                if (x > ((cb[i] + cb[i - 1])/2)) {            *index = i;            *xq = cb[i];        } else {            *index = i - 1;            *xq = cb[i - 1];        }    }}/*----------------------------------------------------------------* *  check for stability of lsf coefficients *---------------------------------------------------------------*/int LSF_check(    /* (o) 1 for stable lsf vectors and 0 for                           nonstable ones */    float *lsf,     /* (i) a table of lsf vectors */    int dim,    /* (i) the dimension of each lsf vector */    int NoAn    /* (i) the number of lsf vectors in the                            table */){    int k,n,m, Nit=2, change=0,pos;    float tmp;    static float eps=(float)0.039; /* 50 Hz */    static float eps2=(float)0.0195;    static float maxlsf=(float)3.14; /* 4000 Hz */    static float minlsf=(float)0.01; /* 0 Hz */        /* LSF separation check*/    for (n=0; n<Nit; n++) { /* Run through a couple of times */        for (m=0; m<NoAn; m++) { /* Number of analyses per frame */            for (k=0; k<(dim-1); k++) {                pos=m*dim+k;                                if ((lsf[pos+1]-lsf[pos])<eps) {                                        if (lsf[pos+1]<lsf[pos]) {                        tmp=lsf[pos+1];                        lsf[pos+1]= lsf[pos]+eps2;                        lsf[pos]= lsf[pos+1]-eps2;                    } else {                        lsf[pos]-=eps2;                        lsf[pos+1]+=eps2;                    }                    change=1;                }                                if (lsf[pos]<minlsf) {                     lsf[pos]=minlsf;                    change=1;                }                                if (lsf[pos]>maxlsf) {                     lsf[pos]=maxlsf;                    change=1;                }                           }        }    }        return change;  }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -