atoarray.c

来自「speech signal process tools」· C语言 代码 · 共 480 行

C
480
字号
/* * This material contains unpublished, proprietary software of  * Entropic Research Laboratory, Inc. Any reproduction, distribution,  * or publication of this work must be authorized in writing by Entropic  * Research Laboratory, Inc., and must bear the notice:  * *    "Copyright (c) 1986-1990  Entropic Speech, Inc.  *    "Copyright (c) 1990-1991  Entropic Research Laboratory, Inc.  *                   All rights reserved" * * The copyright notice above does not evidence any actual or intended  * publication of this source code.      * * Written by:  John Shore (atoarrayf, atoarray2),  *              Rodney Johnson (atoarray) * Checked by:  Alan Parker (atoarrayf) * Revised by: * * Brief descriptions:  * *     atoarrayf, converts an ASCII file to a float array		 *     atoarrays, converts an ASCII file to a string array	 *     atoarray,  which converts an ASCII file to an array of any type.	 * * The file contains numerical values separated by white space or new   * lines.							        */static char *sccs_id = "@(#)atoarray.c	1.9	2/20/96	ERL/ESI";/* * include files */#include <stdio.h>#include <esps/esps.h>#include <esps/unix.h>#include <math.h>/* * defines */#define DATA_CHUNK 25000	/* number of ASCII points handled at a time */#define ABS(a) (((a) >= 0) ? (a) : -(a))/* * system functions and variables */#if !defined(DEC_ALPHA) && !defined(HP700)char	    *realloc();char	    *calloc();double	    sqrt();void        addstr();#endif/* * ESPS functions */  int 	    typesiz();char        *savestring();/* * local functions */static int  numeric();/* * main functions */float *atoarrayf(strm, nvalues, max)    FILE    *strm;	/*ASCII file stream*/    long    *nvalues;	/*pointer to number of values found*/    float   *max;	/*pointer to return maximum absolute value found*/{    float *data;	    /*pointer to data*/    unsigned dsize = 0;		/* count of currently allocated floats */    unsigned cnt = 0;		/* count within current chunk */    int nchar;			/* number of characters matched by fscanf */    spsassert(strm != NULL, "atoarrayf: NULL file pointer");    spsassert(nvalues != NULL, "atoarrayf: NULL pointer for nvalues");    spsassert(max != NULL, "atoarrayf: NULL pointer for max value");    *max = 0.0;    *nvalues = 0;	    /*     * allocate space for first DATA_CHUNK of floats     */    data = (float*) calloc ((unsigned) DATA_CHUNK, sizeof(float));    dsize = DATA_CHUNK;    spsassert(data != NULL, "memory allocation failure");    while ((nchar = fscanf(strm, "%f", &data[*nvalues])) != EOF) {	spsassert(nchar != 0, "atoarrayf: input not in float format");	if (ABS(data[*nvalues]) > *max) *max = ABS(data[*nvalues]);	(*nvalues)++;	cnt++;	/*	 * get more space if we've used up the chunk	 */	 if (cnt == DATA_CHUNK) {	    dsize += DATA_CHUNK;	    data = (float*) realloc	        ((char *)data, (unsigned)dsize*sizeof(float));	    spsassert(data != NULL, "atoarrayf: memory allocation failure");	    cnt = 0;	 }    }    /*     * don't return more memory than needed     */    data = (float*) realloc((char *)data, (unsigned) *nvalues * sizeof(float));    spsassert(data != NULL, "atoarrayf: realloc failed to reduce Size");    return data;}#define MAXLINE 250char **atoarrays(strm, nvalues, max)    FILE    *strm;	/*ASCII file stream*/    long    *nvalues;	/*pointer to number of values found*/    int      *max;	/*pointer to return maximum string length found*/{    char **data = NULL;	    /*pointer to data*/    char *string_item = (char *) malloc(MAXLINE);    int length = 0;		/* length of latest string */    spsassert(strm != NULL, "atoarrays: NULL file pointer");    spsassert(nvalues != NULL, "atoarrays: NULL pointer for nvalues");    if (max != NULL)       *max = 0;    *nvalues = 0;	    while (fgets(string_item, MAXLINE, strm) != NULL) {	length = strlen(string_item);	if (length > 0) {	    /* remove trailing line feed*/	    if (string_item[length-1] == '\n')	      string_item[length-1] = '\0';	    length = strlen(string_item);	    if (length > 0) {		addstr(savestring(string_item), &data);		if ((max != NULL) && (length > *max))		  *max = length; 		(*nvalues)++;	      }	  }      }    return data;}#define CHUNK_SIZE  (DATA_CHUNK * sizeof(float))char *atoarray(strm, type, nvalues, max)    FILE    *strm;    int	    type;    long    *nvalues;    double  *max;{    char	*data;		/* pointer to data*/    unsigned	dsize;		/* count of currently allocated elements */    unsigned	d_chunk;	/* number of elements to allocate at a time */    unsigned	tsize;		/* size of one data element */    long	cnt;		/* count of items read */    int	    	nitem;		/* number of items matched by fscanf */    double  	absval;		/* absolute value of data element */    double  	reval, imval;	/* real & imaginary parts of data element */    double  	maxabs;		/* max absolute value */    spsassert(strm, "atoarray: NULL file pointer");    spsassert(nvalues, "atoarray: NULL pointer for nvalues");    spsassert(numeric(type), "atoarray: non-numeric type code");    tsize = typesiz(type);    cnt = 0;    if (max) maxabs = 0.0;    /*     * allocate space for first data chunk     */    d_chunk = CHUNK_SIZE / tsize;    data = calloc(d_chunk, tsize);    spsassert(data, "atoarray: can't allocate space for data");    dsize = d_chunk;        for ( ; ; )		/* Will break out of loop on EOF or bad data. */    {	switch(type)	{	case DOUBLE: {	    double	*arr = (double *) data;	    for ( ;		 (cnt < dsize		  && (nitem = fscanf(strm, "%lf", &arr[cnt])) == 1);		 cnt++)	    {		if (max)		{		    absval = arr[cnt];		    if (absval < 0) absval = -absval;		    if (absval > maxabs) maxabs = absval;		}	    }	    break; }	case FLOAT: {	    float	*arr = (float *) data;	    for ( ;		 (cnt < dsize		  && (nitem = fscanf(strm, "%f", &arr[cnt])) == 1);		 cnt++)	    {		if (max)		{		    absval = arr[cnt];		    if (absval < 0) absval = -absval;		    if (absval > maxabs) maxabs = absval;		}	    }	    break; }	case LONG: {	    long	*arr = (long *) data;	    for ( ;		 (cnt < dsize		  && (nitem = fscanf(strm, "%ld", &arr[cnt])) == 1);		 cnt++)	    {		if (max)		{		    absval = arr[cnt];		    if (absval < 0) absval = -absval;		    if (absval > maxabs) maxabs = absval;		}	    }	    break; }	case SHORT: {	    short	*arr = (short *) data;	    for ( ;		 (cnt < dsize		  && (nitem = fscanf(strm, "%hd", &arr[cnt])) == 1);		 cnt++)	    {		if (max)		{		    absval = arr[cnt];		    if (absval < 0) absval = -absval;		    if (absval > maxabs) maxabs = absval;		}	    }	    break; }	case BYTE: {	    char	*arr = (char *) data;	    short	item;	    for ( ;		 (cnt < dsize		  && (nitem = fscanf(strm, "%hd", &item)) == 1);		 cnt++)	    {		arr[cnt] = item;		if (max)		{		    absval = arr[cnt];		    if (absval < 0) absval = -absval;		    if (absval > maxabs) maxabs = absval;		}	    }	    break; }	case DOUBLE_CPLX: {	    double_cplx	*arr = (double_cplx *) data;	    for ( ;		 (cnt < dsize		  && (nitem = fscanf(strm, "%lf%lf",				     &arr[cnt].real, &arr[cnt].imag)) == 2);		 cnt++)	    {		if (max)		{		    reval = arr[cnt].real;		    if (reval < 0) reval = -reval;		    imval = arr[cnt].imag;		    if (imval < 0) imval = -imval;		    if (reval > imval)		    {			imval /= reval;			absval = reval * sqrt(1.0 + imval*imval);		    }		    else if (imval > reval)		    {			reval /= imval;			absval = imval * sqrt(1.0 + reval*reval);		    }		    else absval = reval * sqrt(2.0);		    if (absval > maxabs) maxabs = absval;		}	    }	    break; }	case FLOAT_CPLX: {	    float_cplx	*arr = (float_cplx *) data;	    for ( ;		 (cnt < dsize		  && (nitem = fscanf(strm, "%f%f",				     &arr[cnt].real, &arr[cnt].imag)) == 2);		 cnt++)	    {		if (max)		{		    reval = arr[cnt].real;		    if (reval < 0) reval = -reval;		    imval = arr[cnt].imag;		    if (imval < 0) imval = -imval;		    if (reval > imval)		    {			imval /= reval;			absval = reval * sqrt(1.0 + imval*imval);		    }		    else if (imval > reval)		    {			reval /= imval;			absval = imval * sqrt(1.0 + reval*reval);		    }		    else absval = reval * sqrt(2.0);		    if (absval > maxabs) maxabs = absval;		}	    }	    break; }	case LONG_CPLX: {	    long_cplx	*arr = (long_cplx *) data;	    for ( ;		 (cnt < dsize		  && (nitem = fscanf(strm, "%ld%ld",				     &arr[cnt].real, &arr[cnt].imag)) == 2);		 cnt++)	    {		if (max)		{		    reval = arr[cnt].real;		    imval = arr[cnt].imag;		    absval = sqrt(reval*reval + imval*imval);		    if (absval > maxabs) maxabs = absval;		}	    }	    break; }	case SHORT_CPLX: {	    short_cplx	*arr = (short_cplx *) data;	    for ( ;		 (cnt < dsize		  && (nitem = fscanf(strm, "%hd%hd",				     &arr[cnt].real, &arr[cnt].imag)) == 2);		 cnt++)	    {		if (max)		{		    reval = arr[cnt].real;		    imval = arr[cnt].imag;		    absval = sqrt(reval*reval + imval*imval);		    if (absval > maxabs) maxabs = absval;		}	    }	    break; }	case BYTE_CPLX: {	    byte_cplx	*arr = (byte_cplx *) data;	    short	re_item, im_item;	    for ( ;		 (cnt < dsize		  && (nitem = fscanf(strm, "%hd%hd",				     &re_item, &im_item)) == 2);		 cnt++)	    {		arr[cnt].real = re_item;		arr[cnt].imag = im_item;		if (max)		{		    reval = arr[cnt].real;		    imval = arr[cnt].imag;		    absval = sqrt(reval*reval + imval*imval);		    if (absval > maxabs) maxabs = absval;		}	    }	    break; }	}	if (cnt != dsize) break; /* Exit loop on EOF or bad data. */	else	{	    dsize += d_chunk;	    data = realloc(data, dsize*tsize);	    spsassert(data, "atoarray: can't reallocate space for data");	}    }    switch (nitem)    {    case 0:	Fprintf(stderr, "%s: badly formatted input item.\n", "atoarray");	exit(1);	break;    case 1:	Fprintf(stderr,		"%s:  badly formatted input item or missing re/im part.\n",		"atoarray");	exit(1);	break;    case EOF:	data = realloc(data, dsize*tsize);	spsassert(data, "atoarray: realloc failed to reduce size");	if (max) *max = maxabs;	*nvalues = cnt;	return data;	break;    default:	Fprintf(stderr, "%s: error reading data. fscanf returned %d\n",	       "atoarray", nitem);	exit(1);	break;    }    /*NOTREACHED*/}/* * Check for numeric data type. */static intnumeric(type)    int	    type;{    switch (type)    {    case BYTE:    case SHORT:    case LONG:    case FLOAT:    case DOUBLE:    case BYTE_CPLX:    case SHORT_CPLX:    case LONG_CPLX:    case FLOAT_CPLX:    case DOUBLE_CPLX:	return YES;	break;    default:	return NO;	break;    }    /*NOTREACHED*/}

⌨️ 快捷键说明

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