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

📄 stats.c

📁 speech signal process tools
💻 C
字号:
/*  stats - compute statistics on SPS files				       Joseph T. Buck							     									     stats considers an SPS file to be a series of vectors. It computes mean,   standard deviation, maximum, and minimum values on an element-by-element   basis. The number of vectors used may be controlled with the -o switch.    The -n switch suppresses the header.					     									     From SDS version 1.3 of 10/28/85					     Joe Buck started converting it to SPS; Alan Parker finsished it.  Dave Burton made ESPS modifications.  This material contains proprietary software of Entropic Speech, Inc.     Any reproduction, distribution, or publication without the the prior	     written permission of Entropic Speech, Inc. is strictly prohibited.  Any public distribution of copies of this work authorized in writing by  Entropic Speech, Inc. must bear the notice			 								      "Copyright (c) 1987 Entropic Speech, Inc.; All rights reserved"*/#ifdef SCCS	static char *sccs_id = "@(#)stats.c	1.7	6/25/87 ESI";#endif#include <values.h> /* maybe MASSCOMP specific */#define MAXFLOAT ((float)3.4e+37)  /* fix around Masscomp 68010 compiler				      bug */#include <stdio.h>#include <sps/sps.h>#include <math.h>#define MAXL 100#define SYNTAX USAGE ("stats [-r rec_range] [-e el_range] [-m magnitude] [-n] file")#define MAGNITUDE(x, m) (((x-m) > (m-x)) ? (x-m) : (m-x))void lrange_switch(), range_switch();void exit();short get_rec_len();main (argc, argv)int   argc;char  **argv;{    extern  optind;    extern char *optarg;    short l_rec;    int     c, hflag = 1, mflag = 0;    long s_rec, e_rec, i_rec, i;    long    tag;    char   *prange = NULL, *erange = NULL, *filename = NULL;    double  data [MAXL], mins[MAXL], maxs[MAXL], avgs[MAXL], devs[MAXL], 	    mag[MAXL];    int     minl [MAXL], maxl[MAXL];    int     s_ele, e_ele;    double  scale, bias, sqrt ();    FILE   *istrm = stdin;    struct header *h;    while ((c = getopt (argc, argv, "nmr:e:")) != EOF) {	switch (c) {	    case 'n':		hflag = 0;		break;	    case 'm':		mflag++;		break;	    case 'r': 		prange = optarg;		break;	    case 'e':	        erange = optarg;		break;	    default:		SYNTAX;	}    }    if (argc == optind + 1)	filename = argv[optind];        read_params((char *)NULL,SC_CHECK_FILE,filename);    if (filename == NULL) {	if(symtype("filename") == ST_UNDEF) {	  fprintf (stderr, "stats: no input file.\n");	  exit(1);    	}	filename = getsym_s("filename");    }    /*     * Check for stdin    */    if(strcmp(filename, "-") == 0)	filename = "<stdin>";    else	TRYOPEN(argv[0], filename, "r", istrm);    if (!(h = read_header (istrm)))	NOTSPS ("stats", filename);    l_rec = get_rec_len(h);    if (l_rec > MAXL) {	fprintf (stderr, "stats: record length (%d) too long\n", l_rec);	exit (1);    }    s_rec = 1;    e_rec = MAXLONG;    if(symtype("start") != ST_UNDEF) 	s_rec = getsym_i("start");    if(symtype("nan") != ST_UNDEF) 	e_rec = s_rec + getsym_i("nan") - 1;    lrange_switch (prange, &s_rec, &e_rec, 1);    (void) putsym_s("filename",filename);    (void) putsym_s("prog","stats");    (void) putsym_i("start",(int)s_rec);    s_ele = 1;    e_ele = l_rec;    range_switch (erange, &s_ele, &e_ele, 1);    if (e_ele > l_rec) {	fprintf (stderr, "stats: only %d elements per record\n", l_rec);	exit (1);    }/* Initialize statistics */    for (i = s_ele - 1; i < e_ele; i++) {	avgs[i] = devs[i] = 0.0;	mins[i] = MAXFLOAT;	maxs[i] = -MAXFLOAT;	mag[i] = 0.;    }    skiprec (istrm, s_rec - 1, size_rec (h));    for (i_rec = s_rec; 	 i_rec <= e_rec && get_gen_recd(data,&tag,h,istrm) != EOF; 	 i_rec++) {	for (i = s_ele - 1; i < e_ele; i++) {	    if (data[i] < mins[i]) {		mins[i] = data[i];		minl[i] = i_rec;	    }	    if (data[i] > maxs[i]) {		maxs[i] = data[i];		maxl[i] = i_rec;	    }	    avgs[i] += data[i];	    devs[i] += data[i] * data[i];	}    }    e_rec = i_rec - 1;     (void) putsym_i("nan",(int)(e_rec-s_rec+1));    if (hflag) printf("stats: filename: %s, start: %ld, end: %ld\n",	filename, s_rec, e_rec);    scale = 1.0 / (double) (e_rec-s_rec+1);/* bias is the factor that converts the biased estimate of the variance to   the unbiased estimate: (e_rec-s_rec+1)/((e_rec-s_rec)-1).*/    bias = 0.0;    if ((e_rec-s_rec+1) > 1)	bias = (double) (e_rec-s_rec+1) / (double) (e_rec-s_rec);    for (i = s_ele - 1; i < e_ele; i++) {	avgs[i] *= scale;/* * for some cases this expression yields a negative number very close * zero that should be treated as zero. */	if ((bias * (devs[i] * scale - avgs[i] * avgs[i])) <= 0)	  devs[i] = 0;	 else	  devs[i] = sqrt (bias * (devs[i] * scale - avgs[i] * avgs[i]));    }/* * Now compute average adjusted magnitude, if required*/    if(mflag > 0){    /* first rewind file and reread header*/    rewind(istrm);    h = read_header (istrm);    skiprec (istrm, s_rec - 1, size_rec (h));	    for (i_rec = s_rec; 		 i_rec <= e_rec && get_gen_recd(data,&tag,h,istrm) != EOF; 		 i_rec++) {		for (i = s_ele - 1; i < e_ele; i++) {		    mag[i] += MAGNITUDE(data[i], avgs[i]);		}	    }    /* divide by number of records*/    for(i=s_ele-1;i<e_ele;i++)	mag[i] *= scale;    }    if (hflag)	printf ("Element   Minimum    at     Maximum    at      Mean      Std. Dev     Magnitude\n");        for (i = s_ele - 1; i < e_ele; i++) {	printf ("%5d%12g%6d%12g%6d%12g%12g%12g\n", i + 1, mins[i], minl[i],		maxs[i], maxl[i], avgs[i], devs[i], mag[i]);	}        return 0;}

⌨️ 快捷键说明

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