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

📄 ereader.c

📁 speech signal process tools
💻 C
字号:
/* * 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) 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:   * Checked by: * Revised by: * * Brief description: * */static char *sccs_id = "@(#)ereader.c	1.2	3/13/92	ERL";/* ereader.c */#include <stdio.h>#include <math.h>#include <fcntl.h>#include <esps/esps.h>#include <esps/sd.h>			/* SD file stuff */#include <esps/fea.h>#include <esps/feasd.h>#define ERR 4#define REALLY_HUGE_INTEGER 1000000000#define MAXDA  32767extern int debug_level, da_location, max_buff_bytes, w_verbose, position;int qflag = 0, clip = 0, gflag = 0, right = 0, left = 0, bflag = 0;float gain = 1.0;/* Take advantage of some of the type independence offered by entropic   data-reading routines. */read_any_file(data, size, np, istrm, ih, fd)     struct header *ih;		/* an ESPS header */     int size,			/* size (in bytes) of each sample */       np,	     /* Number of samples to read */       fd;	     /* open file descriptor (alternate to stream I/O) */     FILE *istrm;    /* an open and positioned stream */     short *data;    /* data output buffer; assumed to be at least size*np long */{  if(! ih ) {    if(istrm)      return(fread(data, size, np, istrm));    if(fd >= 0)      return(read(fd,data,size*np)/size);    else {      fprintf(stderr,"Bad args passed to read_any_file()\n");      return(0);    }  } else    if(istrm) {      int     data_type = SHORT; /* holds type of data in sampled data files*/      register int i;      static   float *dataf = NULL;      static int nfloat = 0;      data_type = get_sd_type(ih);      /* Allocate float buffer, if not already allocated */      if(data_type != CHAR && data_type != SHORT){	if( np > nfloat ) {	  if(dataf && nfloat)	    dataf = (float*)realloc(dataf, np*sizeof(float));	  else	    dataf = (float*)malloc(np * sizeof(float));	  if(!dataf) {	    Fprintf(stderr,"Cannot alloc %ld floats\n",np);	    exit(1);	  }	  nfloat = np;	}      }      if(data_type == CHAR || data_type == SHORT){	if ((i = get_sd_recs(data,np,ih,istrm)) != np) {	  if (i == 0) {	    return(i);	  } else {	    np = i;	  }	}      } else{	if ((i = get_sd_recf(dataf,np,ih,istrm)) != np) {	  if (i == 0) {	    return(i);	  }	  else {	    np = i;	  }	}      }	      if (clip) {	if (data_type != CHAR && data_type != SHORT){	  register float *fp, plim=MAXDA, ft;	  register short *sp;	  for (i=np, fp = dataf, sp = data; i--; ) {	    if((ft = *fp++) > plim)	      ft = plim;	    else	      if(ft < -plim)		ft = -plim;	    *sp++ = ft;	  }	} else {	  register short *sp, smax = MAXDA, st;	  for (i=np, sp = data; i--; ) {	    if((st = *sp) > smax)	      st = smax;	    else	      if(st < -smax)		st = -smax;	    *sp++ = st;	  }	}      }	      /* either, 1) multiply sample by gain factor (slow), 2) shift sample	 bits to right (faster), or 3) just copy sample (fastest)	 */      if(data_type != CHAR && data_type != SHORT) {	register short *sp;	register float *fp, ft, g=gain, round = 0.5;	if (gflag) 	  for (i=np, sp = data, fp = dataf; i--; ) {	    if((ft = *fp++ * g) >= 0.0)	      *sp++ = ft + round;	    else	      *sp++ = ft - round;	  } else	    if (bflag && left) {	      register int shift = left;	      for (i=np, sp = data, fp = dataf ; i--;)		*sp++ = (int)(dataf[i]) << shift;	    } else	      if (bflag && right) {		register int shift = right;		for (i=np, sp = data, fp = dataf ; i--;)		  *sp++ = (int)(dataf[i]) >> shift;	      } else 		for (i=np, sp=data, fp=dataf; i--;) {		  if((ft = *fp++) >= 0.0)		    *sp++ = ft + round;		  else		    *sp++ = ft - round;		}      } else {	register short *sp;	register float ft, g=gain, round = 0.5;	if (gflag)  {	  for (i=np, sp = data ; i--;)	    if((ft = *sp * g) >= 0.0)	      *sp++ = ft + round;	    else	      *sp++ = ft - round;	} else	  if (bflag && left) {	    register int shift = left;	    for (i=np, sp = data; i--; )	      *sp++ <<= shift;	  } else	    if (bflag && right) {	      register int shift = right;	      for (i=np, sp = data; i--; )		*sp++ >>= shift;	    }      }      return(np);    } else      fprintf(stderr,"Bad arguments to read_any_file()\n");  return(0);}

⌨️ 快捷键说明

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