feafiltsupp.c

来自「speech signal process tools」· C语言 代码 · 共 552 行 · 第 1/2 页

C
552
字号
		feafilt_rec->zeros[i].imag = 0;	      }	    }	    /* Next 12 lines do nothing to change FILT_BS zeros, but	       Need these 'magic' lines, or run time error for FILT_BS,	       IIR, order 3, wideband 1000-3000 */	    if(type == FILT_BS){	      for(i=0;i<*feafilt_rec->zero_dim; i++){		tmp[i].real = feafilt_rec->zeros[i].real;		tmp[i].imag = feafilt_rec->zeros[i].imag;	      }	      feafilt_rec->zeros = (double_cplx *) 	      realloc( (void *) feafilt_rec->zeros,numc *sizeof(double_cplx));	      for(i=0; i<*feafilt_rec->zero_dim; i++){		feafilt_rec->zeros[i].real = tmp[i].real;		feafilt_rec->zeros[i].imag = tmp[i].imag;	      }	    }	      			    /* A wideband filter, odd order. See7.25, 7.23 Parks & Burrus */	    for(i=0; i<*feafilt_rec->pole_dim; i++) 	      if( feafilt_rec->poles[i].imag == 0) chpole = i;	    if(chpole >= 0){	      num = *feafilt_rec->pole_dim;	      *feafilt_rec->pole_dim = numc = num+1;	      	      for(i=0;i<num;i++){    /* need this awkward tmp, due    					   to realloc distroys data */		tmp[i].real = feafilt_rec->poles[i].real;		tmp[i].imag = feafilt_rec->poles[i].imag;	      }	      feafilt_rec->poles = (double_cplx *) 		realloc((void *)feafilt_rec->poles,numc *sizeof(double_cplx));	      spsassert(feafilt_rec->poles, 			"get_feafilt_rec: feafilt_rec->poles malloc fails");	      	      for(i=0;i<num;i++){		feafilt_rec->poles[i].real = tmp[i].real;		feafilt_rec->poles[i].imag = tmp[i].imag;	      }	      feafilt_rec->poles[numc-1].real= tmp[chpole].real;	      feafilt_rec->poles[numc-1].imag = 0;	    }	    break;	    	  defaults:	    break;	  }	}      }  }  return(status);  }struct zfuncfeafilt_to_zfunc( feafiltrec ) struct feafilt *feafiltrec;{  struct zfunc res;  int k;  spsassert( feafiltrec != NULL, "feafiltrec_to_zfunc: passed null feafilt rec.");  res.nsiz = *feafiltrec->num_size;  res.dsiz = *feafiltrec->denom_size;  if ( res.nsiz ) {      res.zeros = (float *) calloc( res.nsiz, sizeof(float));      spsassert( res.zeros != NULL, "feafiltrec_to_zfunc: can't allocate zeros.");    }  for (k=0; k<res.nsiz; k++)    res.zeros[k] = feafiltrec->re_num_coeff[k];  if (res.dsiz) {      res.poles = (float *) calloc( res.dsiz, sizeof(float));      spsassert( res.poles != NULL, "feafiltrec_to_zfunc: can't allocate poles.");    }  for (k=0; k<res.dsiz; k++)    res.poles[k] = feafiltrec->re_denom_coeff[k];  return( res );}voidprint_feafilt_rec(p, hd, file)struct feafilt *p;struct header *hd;FILE *file;{	short *filter_complex, *define_pz, j, i;	long max_num, max_denom;	char	**xfields;	spsassert(p, "print_feafilt_rec: p is NULL");	spsassert(hd, "print_feafilt_rec: hd is NULL");	spsassert(file, "print_feafilt_rec: file is NULL");	max_num = get_genhd_val("max_num", hd, -1.0);	max_denom = get_genhd_val("max_denom", hd, -1.0);	filter_complex = get_genhd_s("filter_complex", hd);	define_pz = get_genhd_s("define_pz", hd);	if (!filter_complex) {		fprintf(file, "Warning: header item filter_complex is missing.\n");		filter_complex = (short *)calloc(1,sizeof(short));	}		if (!define_pz) {		fprintf(file, "Warning: header item define_pz is missing.\n");		define_pz = (short *)calloc(1,sizeof(short));	}		if (max_num == -1) {		fprintf(file, "Warning: header item max_num is missing.\n");		max_num = 0;	}	if (max_denom == -1) {		fprintf(file, "Warning: header item max_denom is missing.\n");		max_denom = 0;	}	spsassert(p->num_size,"field num_size missing.");	spsassert(p->denom_size,"field denom_size missing.");	if(*define_pz) {		spsassert(p->pole_dim,			"field pole_dim missing w/ define_pz true");		spsassert(p->zero_dim,			"field zero_dim missing w/ define_pz true");	}		fprintf(file, "num_size: %d, denom_size: %d",		*(p->num_size), *(p->denom_size));	if (*define_pz) 	  fprintf(file, ", zero_dim: %d, pole_dim: %d\n",		*(p->zero_dim), *(p->pole_dim));	else	  fprintf(file, "\n");	if (*(p->num_size)) {	  fprintf(file, "\nre_num_coeff:\n  0: ");	  j=1;	  for(i=0; i<*(p->num_size); i++) {	  	fprintf(file, "%10.5lg ",p->re_num_coeff[i]);		if(j++ == 5 && i+1<*(p->num_size)) {		  fprintf(file,"\n%3d: ",i+1);		  j=1;	        }	  }	  fprintf(file,"\n");	}	if (*filter_complex && *(p->num_size)) {	  fprintf(file, "\nim_num_coeff:\n  0: ");	  j=1;	  for(i=0; i<*(p->num_size); i++) {	  	fprintf(file, "%10.5lg ",p->im_num_coeff[i]);		if(j++ == 5 && i+1<*(p->num_size)) {		  fprintf(file,"\n%3d: ",i+1);		  j=1;	        }	  }	  fprintf(file,"\n");	}	if (*(p->denom_size)) {	  fprintf(file, "\nre_denom_coeff:\n  0: ");	  j=1;	  for(i=0; i<*(p->denom_size); i++) {	  	fprintf(file, "%10.5lg ",p->re_denom_coeff[i]);		if(j++ == 5 && i+1<*(p->denom_size)) {		  fprintf(file,"\n%3d: ",i+1);		  j=1;	        }	  }	  fprintf(file,"\n");	}	if (*filter_complex && *(p->denom_size)) {	  fprintf(file, "\nim_denom_coeff:\n  0: ");	  j=1;	  for(i=0; i<*(p->denom_size); i++) {	  	fprintf(file, "%10.5lg ",p->im_denom_coeff[i]);		if(j++ == 5 && i+1<*(p->denom_size)) {		  fprintf(file,"\n%3d: ",i+1);		  j=1;	        }	  }	  fprintf(file,"\n");	}	if (*define_pz && *(p->zero_dim)) {	  fprintf(file, "\nzeros:\n  0: ");	  j=1;	  for(i=0; i<*(p->zero_dim); i++) {	  	fprintf(file, "[%10.5lg,%10.5g] ",p->zeros[i].real,p->zeros[i].imag);		if(j++ == 2 && i+1<*(p->zero_dim)) {		  fprintf(file,"\n%3d: ",i+1);		  j=1;	        }	  }	  fprintf(file,"\n");	}	if (*define_pz && *(p->pole_dim)) {	  fprintf(file, "\npoles:\n  0: ");	  j=1;	  for(i=0; i<*(p->pole_dim); i++) {	  	fprintf(file, "[%10.5lg,%10.5g] ",p->poles[i].real,p->poles[i].imag);		if(j++ == 2 && i+1<*(p->pole_dim)) {		  fprintf(file,"\n%3d: ",i+1);		  j=1;	        }	  }	  fprintf(file,"\n");	}/* print any fields that are not part of the standard fea_filt file here */	xfields = get_feafilt_xfields(hd);	print_fea_recf(p->fea_rec, hd, file, xfields);	free_feafilt_xfields(xfields);}	staticchar *standard_fields[] = {"num_size", "denom_size", "zero_dim",	"pole_dim", "re_num_coeff", "im_num_coeff", "re_denom_coeff",	"im_denom_coeff", "zeros", "poles", NULL};char **get_feafilt_xfields(hd)struct header *hd;{char **list;int  list_size = 1;long i,j;	spsassert(hd, "get_feafilt_xfields: hd is NULL");	spsassert(hd->common.type == FT_FEA && hd->hd.fea->fea_type == FEA_FILT,		"get_feafilt_xfields: hd is not FEA or not FEA_FILT");	list = (char **)malloc(sizeof(char *));	list[0] = NULL;	for (i=0; hd->hd.fea->names[i] != NULL; i++) {		for (j=0; standard_fields[j] != NULL; j++) {		   if (strcmp(hd->hd.fea->names[i], standard_fields[j]) == 0)			break;		}		if (standard_fields[j] == NULL) {		   list = (char **)realloc((char *)list, 			(list_size+1)*sizeof(char *));		   list[list_size-1] = savestring(hd->hd.fea->names[i]);		   list[list_size++] = NULL;		}	}	return list;}voidfree_feafilt_xfields(list)    char    **list;{    int	    i;    for (i = 0; list[i]; i++)	free(list[i]);    free((char *) list);}

⌨️ 快捷键说明

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