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

📄 header.c

📁 speech signal process tools
💻 C
📖 第 1 页 / 共 4 页
字号:
  for( ; n-- > 0; ) *out++ = *in++;}/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*//* Return a header structure which is an identical copy of header h. */Header *dup_header(h)    Header  *h;{    Header  *h2;    if (debug_level >= 1)	printf("dup_header: nbytes = %d.\n", h->nbytes);    if(h && (h2 = w_new_header(h->nbytes))) {	if(h->nbytes) {	    chcopy(h2->header, h->header, h->nbytes);	    h2->header[h->nbytes] = 0;	}	h2->magic = h->magic;	h2->esps_hdr = h->esps_hdr;	h2->esps_nbytes = h->esps_nbytes;	h2->strm = h->strm;	h2->npad = h->npad;	return(h2);    } else	printf("Error in dup_header\n");    return(NULL);}     /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/void setup_access(sig)     Signal *sig;{ head_a21.dest = (char*)&(sig->end_time); head_a15.dest = (char*)&(sig->start_time); head_a13.dest = (char*)&(sig->type) ; head_a12.dest = (char*)&(sig->freq) ; head_a11.dest = (char*)&(sig->band) ;  head_a9.dest = (char*)&(sig->file_size) ;  head_a7.dest = (char*)&(sig->dim) ;  head_a6.dest = (char*)&(sig->smax[0]) ;  head_a5.dest = (char*)&(sig->smin[0]) ;  head_a4.dest = (char*)&(sig->version) ; head_a0.dest = (char*)&(sig->idents) ;}/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*//* Get information from ESPS header and initialize Waves Signal   structure values accordingly. */intread_esps_hdr(sig, hdr)    Signal  	    *sig;    struct header   *hdr;{    switch (hdr->common.type)    {    case FT_SD:    	{	    static List	sd_ident = {"ESPS sampled data", NULL};	    sig->idents = &sd_ident;	}	sig->header->e_scrsd = 1;	if (get_sd_type(hdr) == SHORT) {	  sig->header->e_short = 1;	  if (debug_level >= 1) 	    printf("read_esps_hdr: FT_SD is SHORT, setting e_short\n");	}	sig->version = 1;	sig->dim = 1;	sig->file_size = hdr->common.ndrec;	if (debug_level >= 1)	    printf("read_esps_hdr: sig->file_size = %d.\n", sig->file_size);	sig->band = 0.5 * hdr->hd.sd->sf;	sig->freq = hdr->hd.sd->sf;	if (debug_level >= 1)	    printf("read_esps_hdr: sig->freq = %g.\n", sig->freq);	sig->type = P_SHORTS;	sig->start_time = get_genhd_val("start_time", hdr, 0.0);	if (genhd_type("start_time", (int *) NULL, hdr) == HD_UNDEF)	    *add_genhd_d("start_time", (double *) NULL, 1, hdr) =		sig->start_time;	sig->end_time =	    get_genhd_val("end_time", hdr,			  sig->file_size / sig->freq + sig->start_time);	if (genhd_type("end_time", (int *) NULL, hdr) == HD_UNDEF)	    *add_genhd_d("end_time", (double *) NULL, 1, hdr) =		sig->end_time;	break;    case FT_FEA:	switch (hdr->hd.fea->fea_type)	{	case FEA_SPEC:	    {		double	sf;		if (genhd_type("freq_format", (int *) NULL, hdr) != CODED)		{		    printf("%s: header item \"freq_format\" missing or not CODED\n",			   "read_esps_hdr");		    return FALSE;		}		else switch(*get_genhd_s("freq_format", hdr))		{		case SPFMT_ARB_FIXED:		    printf("%s: freq_format ARB_FIXED not supported.\n",			   "read_esps_hdr");		    return FALSE;		    break;		case SPFMT_ARB_VAR:		    printf("%s: freq_format ARB_VAR not supported.\n",			   "read_esps_hdr");		    return FALSE;		    break;		default:		    break;		}		if (genhd_type("spec_type", (int *) NULL, hdr) != CODED)		{		    printf("%s: header item \"spec_type\" missing or not CODED\n",			   "read_esps_hdr");		    return FALSE;		}		else switch(*get_genhd_s("spec_type", hdr))		{		case SPTYP_DB:		    break;		default:		    printf(			"%s: only spec_type SPTYP_DB supported in FEA_SPEC.\n",			"read_esps_hdr");		    return FALSE;		    break;		}/*!*//* idents? */		sig->version = 1;		if (genhd_type("num_freqs", (int *) NULL, hdr) == LONG)		    sig->dim = *get_genhd_l("num_freqs", hdr);		else		{		    printf("%s: header item \"num_freqs\" missing or not LONG.\n",			   "read_esps_hdr");		    return FALSE;		}		sig->file_size = hdr->common.ndrec;		if (genhd_type("sf", (int *) NULL, hdr) == FLOAT)		    sf = *get_genhd_f("sf", hdr);		else		{		    printf("%s: header item \"sf\" missing or not FLOAT.\n",			   "read_esps_hdr");		    return FALSE;		}		sig->band = 0.5 * sf;				sig->freq = get_genhd_val("record_freq", hdr, 1.0);		if (sig->freq == 0.0) sig->freq = 1.0;		sig->type = SIG_SPECTROGRAM | P_CHARS;		sig->start_time = get_genhd_val("start_time", hdr, 0.0);		sig->end_time		    = sig->start_time + sig->file_size/sig->freq;	    }	    break;	  case FEA_SD:  	                 /*if single-channel, non-complex, and if the			   fea_sd_special global is set, treat here;			  otherwise, drop through to general FEA file */	    if (get_fea_siz("samples", hdr, (short *)NULL, (long **)NULL) == 1 		&& is_field_complex(hdr, "samples") == NO		&& fea_sd_special)	      {		sig->header->e_scrsd = 1;		if (debug_level >= 1) 		  printf("read_esps_hdr: 1-chan., non-complex, FEA_SD; setting e_scrsd flag\n");		if (get_fea_type("samples", hdr) == SHORT) {		  sig->header->e_short = 1;		  if (debug_level >= 1) 		    printf("read_esps_hdr: \"samples\" is SHORT, setting e_short\n");		}		{		  static List	sd_ident = {"ESPS sampled data", NULL};	      		  sig->idents = &sd_ident;		}		sig->version = 1;		sig->dim = 1;		sig->file_size = hdr->common.ndrec;		if (debug_level >= 1) 		  printf("read_esps_hdr: sig->file_size = %d.\n", sig->file_size);				sig->band = 0.5 * get_genhd_val("record_freq", hdr, 1.0);		sig->freq = get_genhd_val("record_freq", hdr, 1.0);		if (debug_level >= 1)		  printf("read_esps_hdr: sig->freq = %g.\n", sig->freq);		sig->type = P_SHORTS;		sig->start_time = get_genhd_val("start_time", hdr, 0.0);		if (genhd_type("start_time", (int *) NULL, hdr) == HD_UNDEF)		  *add_genhd_d("start_time", (double *) NULL, 1, hdr) =		    sig->start_time;		sig->end_time =		  get_genhd_val("end_time", hdr,				sig->file_size / sig->freq + sig->start_time);		if (genhd_type("end_time", (int *) NULL, hdr) == HD_UNDEF)		  *add_genhd_d("end_time", (double *) NULL, 1, hdr) =		    sig->end_time;		break;	      }  /*if not e_src FEA_SD, fall through to general FEA*/	default:		/* General FEA file. */	    sig->version = 1;	    sig->dim = get_rec_len(hdr);	    sig->file_size = hdr->common.ndrec;	    sig->band = 0.5 * get_genhd_val("record_freq", hdr, 1.0);	    sig->freq = get_genhd_val("record_freq", hdr, 1.0);	    if (sig->freq == 0.0) sig->freq = 1.0;	    sig->start_time = get_genhd_val("start_time", hdr, 0.0);	    sig->end_time = sig->file_size / sig->freq + sig->start_time;	    sig->type = P_MIXED;	    sig->types = (int *) malloc(sig->dim * sizeof(int));	    if (!sig->types)	    {		printf("%s: can't allocate space for type array.\n",		       "read_esps_hdr");		return FALSE;	    }	    {		int 	i, k;		long	j;		List	fea_idents; /* dummy node precedes first actual node */		List	*end_ptr = &fea_idents;		long 	n = 0;		for (i = 0; i < hdr->hd.fea->field_count; i++)		{		    int		    type, real;		    int		    rank;		    long	    size, *dim;		    static unsigned maxrank;		    static long	    *coords = NULL;		    char	    buf[250], *suffix;		    switch(hdr->hd.fea->types[i])		    {		    case BYTE:		    case CHAR:			type = P_CHARS;			real = YES;			break;		    case SHORT:		    case CODED:			type = P_SHORTS;			real = YES;			break;		    case LONG:			type = P_INTS;			real = YES;			break;		    case FLOAT:			type = P_FLOATS;			real = YES;			break;		    case DOUBLE:			type = P_DOUBLES;			real = YES;			break;		    case BYTE_CPLX:			type = P_CHARS;			real = NO;			break;		    case SHORT_CPLX:			type = P_SHORTS;			real = NO;			break;		    case LONG_CPLX:			type = P_INTS;			real = NO;			break;		    case FLOAT_CPLX:			type = P_FLOATS;			real = NO;			break;		    case DOUBLE_CPLX:			type = P_DOUBLES;			real = NO;			break;		    default:			printf("%s: unrecognized ESPS data type.\n",				"read_esps_hdr");			return FALSE;		    }		    size = hdr->hd.fea->sizes[i];		    rank = (hdr->hd.fea->ranks)				? hdr->hd.fea->ranks[i] : 1;		    dim = (hdr->hd.fea->dimens && rank!=1)				? hdr->hd.fea->dimens[i] : &size;		    if (debug_level)		    {			fprintf(stderr,				"%s: size %ld,  rank %d,\n\tdim  ",				"read_esps_hdr", size, rank);			for (k = 0; k < rank; k++)			    fprintf(stderr, "%d ", dim[k]);			fprintf(stderr, "\n");		    }		    		    if (!coords)		    {			maxrank = rank;			coords = (long *)				    malloc(maxrank * sizeof(long));			if (!coords)			{			    printf("%s: can't allocate coordinate array.\n",				   "read_esps_hdr");			    return FALSE;			}		    }		    else		    if (maxrank < rank)		    {			maxrank = rank;			coords = (long *)				    realloc((char *) coords,					    maxrank * sizeof(long));			if (!coords)			{			    printf("%s: can't reallocate coordinate array.\n",				   "read_esps_hdr");			    return FALSE;			}		    }		    for (k = 0; k < rank; k++)			coords[k] = 0;		    strcpy(buf, hdr->hd.fea->names[i]);		    suffix = buf + strlen(buf);		    for (j = 0; j < size; j++)		    {			int	h;			char	*end = suffix;			for (k = 0; k < rank; k++)			{			    sprintf(end, "[%ld]", coords[k]);			    end = end + strlen(end);			}			for (h = 0; h < (real ? 1 : 2); h++)			{			    static char	*re_im[2] = {".r", ".i"};			    sig->types[n++] = type;			    end_ptr->next = (List *) malloc(sizeof(List));			    end_ptr = end_ptr->next;			    if (!end_ptr)			    {				printf("%s: can't allocate ident node.\n",				       "read_esps_hdr");				return FALSE;			    }			    if (!real)				strcpy(end, re_im[h]);			    end_ptr->str = savestring(buf);			}			/* Advance coordinates; check overflow */			for (k = rank - 1;			     k >= 0 && coords[k] == dim[k] - 1;			     k--)			    coords[k] = 0;	/* propagate carries */			if (k >= 0) coords[k]++;			else			if (j < size - 1)			{			    printf("%s: field %s has inconsistent size and dimensions.\n",				   "read_esps_hdr", hdr->hd.fea->names[i]);			    return FALSE;			}		    }		    if (k >= 0) 		    {			printf("%s: field %s has inconsistent size and dimensions.\n",			       "read_esps_hdr", hdr->hd.fea->names[i]);			return FALSE;		    }		}				end_ptr->next = NULL;		sig->idents = fea_idents.next;	    }	    break;	}	break;    case FT_SPEC:    default:	printf("The only ESPS files supported so far are %s, %s, and %s.\n",	       "sampled-data", "FEA_SPEC", "general FEA files");	return FALSE;	break;    }    return TRUE;}/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/

⌨️ 快捷键说明

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