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

📄 tag_methods.c

📁 speech signal process tools
💻 C
📖 第 1 页 / 共 2 页
字号:
/* * 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) 1993-1997  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:  David Talkin * * tag_methods.c * * A collection of methods for displaying and editing so-called *                    "tagged" ESPS files. * */static char *sccs_id = "@(#)tag_methods.c	1.9	1/18/97	ATT/ERL";#include <stdio.h>#ifndef hpux#include <sys/param.h>#else#define MAXPATHLEN 1024#endif#include <esps/esps.h>#include <Objects.h>#if !defined(HP400) && !defined(APOLLO_68K) && !defined(DS3100)#include <malloc.h>#endif#include <esps/exview.h>#include <Xp_pw.h>extern int debug_level;extern Xv_Font def_font;extern int     def_font_height, def_font_width;#define scoff(x) ((int)(yoffs + ((double)(x) * scale)))#define ALMOST 0.95/*********************************************************************/tag_time_to_x(v,time)     register View *v;     register double time;{  register int i;  register double freq, t;  /* "integerize" time */  i = time_to_index(v->sig,time);  time = v->sig->x_dat[i];  if (time < v->start_time) time = v->start_time; /* clamp */  if (time > (t = ET(v)))   time = t;  return((int)(.5 + (PIX_PER_CM *     ((time - v->start_time) / (*v->x_scale)))) + (*v->x_offset));}	 /*********************************************************************/double tag_x_to_time(v,x)     register View *v;     register int x;{  double time, t;  x -= *(v->x_offset);  if(x < 0) x = 0;  time = v->start_time + (double)x * *(v->x_scale) / PIX_PER_CM;  if (time > (t = ET(v)))   time = t;  return(v->sig->x_dat[time_to_index(v->sig,time)]);}/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*//* Aperiodic vector and scalar signals are plotted using a connect-the-dots   algorithm.  Arbitrary x-axis scaling, y_offsets and y-axis scaling are   supported. */tag_plot_waves(view)     register View *view;{  register int y, y2, j, k, npix, x;  View *vh = view;  int index, ind, nsam, maxdim, its_an_overlay = FALSE;  int val, dim;  Pixwin *pw;  Signal *sig;  Canvas canvas;  double end;  register double scale, yoffs;  struct rect	*rect;  extern int	show_labels, doing_print_graphic, print_only_plot;  List *l, *l2;  if(view && (sig = view->sig) && sig->type) {    if(view->extra && (view->extra_type == VIEW_OVERLAY)) {      vh = (View*)view->extra;      its_an_overlay = TRUE;    }        if(IS_GENERIC(view->sig->type)) {      canvas = vh->canvas;        pw = canvas_pixwin(canvas); /* get the pixwin to write to */      rect = (struct rect*)xv_get(canvas, WIN_RECT);      /* Determine the number of waveform samples to plot */      if(vh->start_time < BUF_END_TIME(sig)) {	end = ET(vh);	/* deternine starting sample in the waveform */	index = time_to_index(sig,vh->start_time);	for(nsam=0,j=index; (nsam < sig->buff_size) &&	    (sig->x_dat[j] <= end); j++) nsam++;      } else {	return(FALSE);      }      if(index+nsam >= sig->buff_size-1)	nsam = sig->buff_size - 1 - index;      /* clear window if data is NOT plotted as an overlay */      if( !its_an_overlay && !doing_print_graphic)	pw_write(pw,0,0,rect->r_width,rect->r_height,		 PIX_COLOR(BACKGROUND_COLOR)|PIX_SRC,NULL,0,0);#define PLOT_TYPE(the_type) { \  register the_type *q, *r, *p, imax, imin; \   \  if (nsam > 0 && !s_data) \    return FALSE; \   \  val = view->colors[dim]; \  scale = - PIX_PER_CM/vh->y_scale[dim]; \  yoffs = .5 + (double)vh->y_offset[dim]; /* precompute for speed */ \  switch(view->line_types[dim]) { \  case 1:		/* standard solid line type */ \  default: \      k = *(vh->x_offset) + 0.5 + \	((PIX_PER_CM * (sig->x_dat[index] - vh->start_time) / *(vh->x_scale))); \    for(ind = index+1, p = (the_type *) s_data + index, \	r = p + 1,  q = p + nsam; p < q; ind++) { \      x = *(vh->x_offset) + 0.5 + \	((PIX_PER_CM * (sig->x_dat[ind] - vh->start_time) / *(vh->x_scale))); \      pw_vector(pw, k, scoff(*p++), x, scoff(*r++), \		PIX_COLOR(val)|PIX_SRC, val); \      k = x; \    } \    break; \  case 2:			/* histogram-style */ \    k = *(vh->x_offset) + 0.5 + \        ((PIX_PER_CM * (sig->x_dat[index] - vh->start_time) / *(vh->x_scale))); \    for(ind = index+1, y2 = scoff(sig->smin[view->elements[dim]]), \	p = (the_type *) s_data + index, \	r = p + 1,  q = p + nsam; p < q; ind++) { \      x = *(vh->x_offset) + 0.5 + \	((PIX_PER_CM * (sig->x_dat[ind] - vh->start_time) / *(vh->x_scale))); \      pw_vector(pw, k, (y = scoff(*p++)), x, scoff(*r++), \		PIX_COLOR(val)|PIX_SRC, val); \      pw_vector(pw, k, y, k, y2, PIX_COLOR(val)|PIX_SRC, val); \      k = x; \    } \    break; \  case 3:			/* DSP-style */ \  case 4:			/* DSP-style with connect the dots */ \    k = *(vh->x_offset) + 0.5 + \        ((PIX_PER_CM * (sig->x_dat[index] - vh->start_time) / *(vh->x_scale))); \    for(ind = index+1, y2 = scoff(0.0), \	p = (the_type *) s_data + index, \	r = p + 1,  q = p + nsam; p < q; ind++) { \      x = *(vh->x_offset) + 0.5 + \	((PIX_PER_CM * (sig->x_dat[ind] - vh->start_time) / *(vh->x_scale))); \      y = scoff(*p++); \      if(view->line_types[dim] == 4) \	pw_vector(pw, k, y, x, scoff(*r++), \		PIX_COLOR(val)|PIX_SRC, val); \      pw_vector(pw, k, y, k, y2, PIX_COLOR(val)|PIX_SRC, val); \      k = x; \    } \    break; \  } \}  /* >>>  END of PLOT_TYPE() definition  <<< */      if (nsam > 0)      {	  maxdim = MIN(view->dims, vh->dims);	  if (maxdim > 0 && !sig->data)	      return FALSE;	  for (dim=0; dim < maxdim; dim++) /* for each dimension... */	      switch(sig->type & VECTOR_SIGNALS)	      {	      case P_CHARS:	      case P_UCHARS:		{		    char    *s_data = ((char **) sig->data)[vh->elements[dim]];		    PLOT_TYPE(char);		}		break;	      case P_SHORTS:		{		    short   *s_data = ((short **) sig->data)[vh->elements[dim]];		    PLOT_TYPE(short);		}		break;	      case P_INTS:	      case P_UINTS:		{		    int     *s_data = ((int **) sig->data)[vh->elements[dim]];		    PLOT_TYPE(int);		}		break;	      case P_FLOATS:		{		    float   *s_data = ((float **) sig->data)[vh->elements[dim]];		    PLOT_TYPE(float);		}		break;	      case P_DOUBLES:		{		    double  *s_data = ((double **) sig->data)[vh->elements[dim]];		    PLOT_TYPE(double);		}		break;	      case P_MIXED:		{		    caddr_t s_data = ((caddr_t *) sig->data)[vh->elements[dim]];		    switch (sig->types[vh->elements[dim]])		    {		    case P_CHARS:		    case P_UCHARS:			PLOT_TYPE(char);			break;		    case P_SHORTS:			PLOT_TYPE(short);			break;		    case P_INTS:		    case P_UINTS:			PLOT_TYPE(int);			break;		    case P_FLOATS:			PLOT_TYPE(float);			break;		    case P_DOUBLES:			PLOT_TYPE(double);			break;		    default:			sprintf(notice_msg,				"Unknown component data type in plot_waves(%x)\n",				sig->types[vh->elements[dim]]);			show_notice(1,notice_msg);			return(FALSE);		    }		}		break;	      default:		goto arrgh;	      } /* end switch (sig->type ...) */      } /* end if (nsam ...) */    } else {    arrgh:      sprintf(notice_msg,"Unknown data type in plot_waves(%x)\n",                          view->sig->type );      show_notice(1,notice_msg);      return(FALSE);    }        if((!its_an_overlay) && (l = sig->idents)) {      int curi, i;/*      double sigmin; */            for(dim=0; dim < view->dims; dim++) { /* for each dimension... */	if(view->show_labels[dim]) {	  curi = view->elements[dim];	  for(i = 0, l2 = l; i < curi; i++)	    if(l2->next)	      l2 = l2->next;/*	  sigmin = view->sig->smin[curi];	  if (plot_min != 0)	    sigmin = plot_min;	  if (view->sig->smax[curi] - sigmin == 0.0)	      sigmin -= 0.5; */	/* Cf. comment on similar adjustment				 * in print_y.				 */	  scale = - PIX_PER_CM/view->y_scale[dim];	  yoffs = .5 + (double)view->y_offset[dim];	  	  if(!(doing_print_graphic && print_only_plot))	      pw_text(pw, *(view->x_offset), scoff(view->plot_min[dim]),		  PIX_SRC|PIX_COLOR(TEXT_COLOR), def_font, l2->str);	}      }    }    return(TRUE);  }  return(FALSE);#undef PLOT_TYPE}/*********************************************************************/View *tag_setup_view(s, c)     Signal *s;     Canvas c;{View *v, *setup_generic_view();if(s && c) {  if((v = setup_generic_view(s,c))) {    v->data_plot = tag_plot_waves;    v->time_to_x = tag_time_to_x;    v->x_to_time = tag_x_to_time;    }    return(v);  }  return(NULL);}/*******************************************************************/tag_save_seg(s, start_time, duration, file)     Signal *s;     double start_time, duration;     char *file;{  Signal *so;  char comment[200];  char **dpp, **dppi;  int n, i, j, size;  double etr, ets;  char *ptr;  /* Pixrect   *pr, *pro; */  if(!((start_time >= s->start_time) &&       ((etr = start_time+duration) <=	(ets = (s->start_time + SIG_DURATION(s)))))) {    if((start_time >= ets) || (etr <= s->start_time)) {      sprintf(notice_msg, "Bogus times passed to tag_save_seg(%s %f %f)",	     s->name, start_time, duration);      show_notice(1,notice_msg);      return(FALSE);    }    if(start_time < s->start_time) start_time = s->start_time;    if(ets < etr) etr = ets;    duration = etr - start_time;    sprintf(notice_msg,              "Limits requested in tag_save_seg exceeded signal limits.\n");    ptr = notice_msg + strlen(notice_msg);    sprintf(ptr,"adjusted to: start_time=%lf  duration=%lf",	   start_time,duration);    show_notice(1,notice_msg);  }  if((so=new_signal(file, SIG_NEW, dup_header(s->header),		    (caddr_t) NULL, 0, s->freq, s->dim))) {    sprintf(comment,"tag_save_seg: start_time %f duration %f signal %s",	    start_time, duration, s->name);    so->start_time = start_time;    so->end_time = etr;    clone_methods(so,s);    if (so->header	&& so->header->magic == ESPS_MAGIC	&& so->header->esps_hdr)

⌨️ 快捷键说明

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