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

📄 snr.c

📁 Reference Implementation of G.711 standard and other voice codecs
💻 C
字号:
/* General symbols */#define get_dB(x) ((x)==0?-100:10*log10((x)))#define get_sqr(x) ((x)*(x))#define SNR_RESET	 1#define SNR_MEASURE	 0#define SNR_STOP	-1#define SNR_DEALLOC	-2/* Data structure */typedef struct{  long            smpno, tot_smpno, count;  float          *snr_vector, *sqr_vector;  double          total_err, total_snr_dB, total_sqr_dB, max_sqr, min_sqr, avg_sqr,                  avg_snr, var_sqr, var_snr, max_snr, min_snr, total_sqr,                  thr, sqr, err;}               SNR_state;/* Prototypes */float get_SNR ARGS ((int mode, short *a, short *b, long N, long N2, 		     SNR_state *s));int get_min_max ARGS ((float *x, int n, double *min, double *max));/* ---------------------- Begin of get_SNR ------------------------------*/float           get_SNR(mode, a, b, N, N2, s)  char            mode;  short          *a, *b;  long            N, N2;  SNR_state      *s;{  double          tmp;  int             i, j;/* *  DEALLOCATION OF MEMORY FOR SNR VALUES */  if (mode == SNR_DEALLOC)  {    free(s->snr_vector);    free(s->sqr_vector);    return (-1000);  }  else  {    /* RESET STATE VARIABLES, IF REQUESTED */    if (mode == SNR_RESET)    {      /* Allocate memory for SNR vector */      if ((s->snr_vector = (float *) calloc(N2, sizeof(float))) == NULL)      {	fprintf(stderr, "Error allocating memory for SNR vector\n");	return (-1001);      }      /* Allocate memory for squared samples' vector */      if ((s->sqr_vector = (float *) calloc(N2, sizeof(float))) == NULL)      {	fprintf(stderr, "Error allocating memory for sqr vector\n");	return (-1002);      }      s->count = 0;      s->max_sqr = -1000;      s->total_sqr = 0;      s->thr = 50;      s->smpno = 0;      s->tot_smpno = 0;      s->total_err = 0;      s->total_sqr = 0;    }    /* MEASUREMENT OF INTERMEDIATE VALUES FOR POWER AND SNR */    for (s->err = s->sqr = 0, s->smpno = 0, j = 0; j < N; j++)    {      s->sqr += (double) get_sqr(a[j]);      s->err += (double) get_sqr(a[j] - b[j]);      s->smpno++;    }    s->sqr /= s->smpno;    s->err /= s->smpno;    s->tot_smpno += s->smpno;    /* Limit is -100 dB */    if (s->sqr == 0)      s->sqr = 10E-10;    if (s->err == 0)      s->err = 10E-10;    s->snr_vector[s->count] = (float) get_dB(s->sqr / s->err);    s->sqr_vector[s->count] = (float) get_dB(s->sqr);    s->total_sqr += s->sqr;    s->total_err += s->err;    if (s->max_sqr < s->sqr_vector[s->count])      s->max_sqr = s->sqr_vector[s->count];    s->count++;    /* MEASUREMENT OF FINAL VALUES FOR POWER AND SNR */    if (mode == SNR_STOP)    {      /* Calculate the minimum value of the power to be considered */      s->min_sqr = (s->max_sqr - s->thr) < 0.1 ? 0.1 : (s->max_sqr - s->thr);      /* Calculate statistics */      s->avg_sqr = s->avg_snr = s->var_sqr = s->var_snr = tmp = 0;      for (i = 0; i < N2; i++)      {	if (s->sqr_vector[i] > (float) s->min_sqr)	{	  tmp++;		/* "active" blocks counter */	  s->avg_sqr += s->sqr_vector[i];	  s->avg_snr += s->snr_vector[i];	  s->var_sqr += s->sqr_vector[i] * s->sqr_vector[i];	  s->var_snr += s->snr_vector[i] * s->snr_vector[i];	}      }      s->avg_sqr /= tmp;      s->avg_snr /= tmp;      s->var_sqr = sqrt(s->var_sqr / tmp - s->avg_sqr * s->avg_sqr);      s->var_snr = sqrt(s->var_snr / tmp - s->avg_snr * s->avg_snr);      get_min_max(s->sqr_vector, N2, &s->min_sqr, &s->max_sqr);      get_min_max(s->snr_vector, N2, &s->min_snr, &s->max_snr);      /* Output of results */      s->total_sqr_dB = get_dB(s->total_sqr);      s->total_snr_dB = (s->total_err == 0) ?	100 /* dB */ :	get_dB(s->total_sqr / s->total_err);      s->count = tmp;    }    return (s->total_snr_dB);  }}/* ---------------------- End of get_SNR ------------------------------*//* ---------------------- Begin of get_min_max ------------------------------*/int             get_min_max(x, n, min, max)  float          *x;  double         *min, *max;  int             n;{  int             i;  *min = 1E+38;  *max = -1E+38;  for (i = 0; i < n; i++)  {    if (x[i] > *max)      *max = x[i];    else if (x[i] < *min)      *min = x[i];  }  return (1);}/* ---------------------- End of get_min_max ------------------------------*/

⌨️ 快捷键说明

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