acf.c

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

C
1,039
字号
    }    if ( last == LONG_MAX || nan == 0 ) {	last = ihd->common.ndrec;	REQUIRE(last != -1,		"Must specify endpoint when input is a pipe or has variable record length.");	nan = last - start + 1;    }    REQUIRE(start >= 1, "can't start before beginning of input file");    REQUIRE(last >= start, "empty range specified for input file");    if (symtype("frame_len") == ST_UNDEF) 	frame_len = 0;    else       frame_len = (units==0) ?	(long) getsym_d("frame_len") : (long) (getsym_d("frame_len")*src_sf);    if (frame_len == 0) {	frame_len = nan;	if (debug_level>1) 	  Fprintf(stderr, "%s: frame_len changed from 0 to %ld\n", PROG, frame_len);    }    if (symtype("step") != ST_UNDEF && getsym_d("step") != 0.0)      step = (units==0) ? 	(long) getsym_d("step") : (long)(getsym_d("step")*src_sf);    else      step = frame_len;    n_frames =      (nan == 0) ? 0	: (nan <= frame_len) ? 1	  : 2 + (nan - frame_len - 1) / step;        if (n_frames > 0 && (n_frames - 1) * step + frame_len > nan)	Fprintf(stderr,	    "%s: WARNING - last frame will exceed specified range.\n",	    PROG);    window_type = (symtype("window_type") != ST_UNDEF) ? 	getsym_s("window_type") : "RECT";    pref_w_type =	malloc((unsigned)(strlen(WT_PREFIX) + strlen(window_type) + 1));    REQUIRE(pref_w_type, "can't allocate space for window type name");    (void) strcpy(pref_w_type, WT_PREFIX);    (void) strcat(pref_w_type, window_type);    win = lin_search(window_types, pref_w_type);    if (win <= 0) {      Fprintf(stderr, "acf: window type not recognized, using RECT");      win = WT_RECT;    }    /* get processing parameters from params file */    sd_flag = GPFLAGSET("sd_flag") ? 1 : 0;    if (sd_flag) 	sd_fname = GPSTRING("sd_fname", "sd");        p_flag = GPFLAGSET("pwr_flag") ? 1 : 0;    if (p_flag)	p_fname = GPSTRING("pwr_fname", "power");    zc_flag = GPFLAGSET("zc_flag") ? 1 : 0;    if (zc_flag)	zc_fname = GPSTRING("zc_fname", "zero_crossing");    ac_flag = GPFLAGSET("ac_flag") ? 1 : 0;    if (ac_flag) {      ac_yes = 1;      ac_fname = GPSTRING("ac_fname", "auto_corr");    }        rc_flag = GPFLAGSET("rc_flag") ? 1 : 0;    if (rc_flag) {      ac_yes = rc_lpc_yes = 1;      rc_fname = GPSTRING("rc_fname", "refcof");    }    lsf_flag = GPFLAGSET("lsf_flag") ? 1 : 0;    if (lsf_flag) {      ac_yes = rc_lpc_yes = 1;      lsf_fname = GPSTRING("lsf_fname", "line_spec_freq");    }    lar_flag = GPFLAGSET("lar_flag") ? 1 : 0;    if (lar_flag) {      ac_yes = rc_lpc_yes = 1;      lar_fname = GPSTRING("lar_fname", "log_area_ratio");    }    lpc_flag = GPFLAGSET("lpc_flag") ? 1 : 0;    if (lpc_flag) {      ac_yes = rc_lpc_yes = 1;      lpc_fname = GPSTRING("lpc_fname", "lpc_coeffs");    }	    fft_flag = GPFLAGSET("fft_flag") ? 1 : 0;    lpccep_flag = GPFLAGSET("lpccep_flag") ? 1 : 0;    if (lpccep_flag) {      ac_yes = rc_lpc_yes = 1;      lpccep_fname = GPSTRING("lpccep_fname", "lpc_cepstrum");    }    fftcep_flag = GPFLAGSET("fftcep_flag") ? 1 : 0;    if (fftcep_flag) {      fftcep_fname = GPSTRING("fftcep_fname", "fft_cepstrum");    }    /* get compute params */    if (ac_yes) {      if (symtype("ac_order") != ST_UNDEF)	ac_order = getsym_i("ac_order");      else {	Fprintf(stderr,"%s: ac_order undefined in parameter file.\n", PROG);	exit(1);      }      if (ac_order <= 0)	Fprintf(stderr,"%s: WARNING! Value of 0 or less found for auto corr order.\n", PROG);    }    if (lpccep_flag) {      if (symtype("lpccep_order") == ST_UNDEF)	  lpccep_order = ac_order;      else	  lpccep_order = getsym_i("lpccep_order");      spsassert(ac_order!=0 || lpccep_order!=0, "both ac_order and lpccep_order are 0.");	        if (lpccep_order < ac_order) {	Fprintf(stderr, "%s: setting lpc cepstrum order to auto corr order.\n", PROG);	lpccep_order = ac_order;      }      if (ac_order==0) {	Fprintf(stderr, "%s: ac_order is zero - setting it to lpccep_order (%d).\n", 		PROG, lpccep_order);	ac_order = lpccep_order;      }      if (symtype("lpccep_deriv")!=ST_UNDEF) {	  lpccep_range = getsym_s("lpccep_deriv");	  if ( strlen(lpccep_range) ) { 	      lpccep_index = grange_switch( lpccep_range, &j);	      if ( lpccep_index != NULL ) {		  for (k=0; k<j; k++)		      spsassert(lpccep_index[k] >= 0 && lpccep_index[k] < lpccep_order, 				"invalid subrange of lpc_cepstrum elements specified by lpccep_deriv.");		  lpccep_deriv_flag = 1;		  lpccep_field_len = j;	      } 	  }      }      if ( !lpccep_deriv_flag ) {	  lpccep_range = malloc(15);	  lpccep_field_len = lpccep_order;	  Sprintf( lpccep_range, "0:%d", lpccep_order-1);      }    }    if (lsf_flag)       if (symtype("lsf_freq_res")!=ST_UNDEF)	lsf_freq_res = (float) getsym_d("lsf_freq_res");    if (fftcep_flag) {      if (symtype("fftcep_order")!=ST_UNDEF)	fftcep_order = getsym_i("fftcep_order");      else {	Fprintf(stderr, "%s: fft cepstrum order undefined.\n", PROG);	exit(1);      }      spsassert( fftcep_order>0, "fftcep_order must be positive.");      fftcep_tlen = 1 << fftcep_order;      if (symtype("fftcep_deriv")!=ST_UNDEF) {	  fftcep_range = getsym_s("fftcep_deriv");	  if ( strlen(fftcep_range) ) {	      fftcep_index = grange_switch( fftcep_range, &j);	      if ( fftcep_index != NULL ) {		  for (k=0; k<j; k++)		      spsassert(fftcep_index[k] >= 0 && fftcep_index[k] < fftcep_tlen, 				"invalid subrange of fft_cepstrum elements specified by fftcep_deriv.");		  fftcep_deriv_flag = 1;		  fftcep_field_len = j;	      } 	  }      }      if ( !fftcep_deriv_flag ) {	  fftcep_range = malloc(15);	  fftcep_field_len = fftcep_tlen;	  Sprintf( fftcep_range, "0:%d", fftcep_tlen-1);      }    }    if ( symtype("preemphasis") != ST_UNDEF )      preemphasis = (float) getsym_d("preemphasis");    REQUIRE( preemphasis >=0.0 && preemphasis <=1.0, "preemphasis outside [0.0,1.0]");    if (fftcep_flag || lpccep_flag) 	if (symtype("warp_param")!=ST_UNDEF)  	    warp_param = (float) getsym_d("warp_param");    REQUIRE(warp_param>-1.0 && warp_param<1.0, "warping parameter outside (-1,1).");		    if (fft_flag) {      if (symtype("fft_order")!=ST_UNDEF) 	fft_order = getsym_i("fft_order");      else {	Fprintf(stderr, "acf: parameter fft_order undefined.\n");	exit(1);      }      fft_tlen = 1 << fft_order;      hf = fft_tlen / 2;      num_freqs = hf + 1;      scale = 10 * log10(2.0/(fft_tlen*src_sf));    }    /* Create output-file header */    ohd = new_header(FT_FEA);    add_source_file(ohd, iname, ihd);    ohd->common.tag = YES;    (void) strcpy(ohd->common.prog, PROG);    (void) strcpy(ohd->common.vers, Version);    (void) strcpy(ohd->common.progdate, Date);    ohd->variable.refer = iname;    add_comment(ohd, get_cmd_line(argc, argv));    *add_genhd_l("frmlen", (long *) NULL, 1, ohd) = frame_len;    *add_genhd_l("nan", (long *) NULL, 1, ohd) = nan;    *add_genhd_l("start", (long *) NULL, 1, ohd) = start;    *add_genhd_l("step", (long *) NULL, 1, ohd) = step;    *add_genhd_e("window_type", (short *) NULL, 1, window_types, ohd) = win;    /* processing flags */    *add_genhd_s("flag_sd", (short *) NULL, 1, ohd) = sd_flag;    *add_genhd_s("flag_pwr", (short *) NULL, 1, ohd) = p_flag;    *add_genhd_s("flag_zc", (short *) NULL, 1, ohd) = zc_flag;    *add_genhd_s("flag_rc", (short *) NULL, 1, ohd) = rc_flag;    *add_genhd_s("flag_autoc", (short *) NULL, 1, ohd) = ac_flag;    *add_genhd_s("flag_lsf", (short *) NULL, 1, ohd) = lsf_flag;    *add_genhd_s("flag_lar", (short *) NULL, 1, ohd) = lar_flag;    *add_genhd_s("flag_lpc", (short *) NULL, 1, ohd) = lpc_flag;    *add_genhd_s("flag_fft", (short *) NULL, 1, ohd) = fft_flag;    *add_genhd_s("flag_lpccep", (short *) NULL, 1, ohd) = lpccep_flag;    *add_genhd_s("flag_fftcep", (short *) NULL, 1, ohd) = fftcep_flag;    *add_genhd_f("src_sf", (float *) NULL, 1, ohd) = (float) src_sf;    if (ac_yes)       *add_genhd_s("ac_order", (short *) NULL, 1, ohd) = ac_order;    if (lpccep_flag) {      *add_genhd_s("lpccep_order", (short *) NULL, 1, ohd) = lpccep_order;      (void) add_genhd_c("lpccep_deriv", lpccep_range, (int)0, ohd);    }    if (lsf_flag)      *add_genhd_f("lsf_freq_res", (short *) NULL, 1, ohd) = lsf_freq_res;    if (fftcep_flag) {      *add_genhd_s("fftcep_order", (short *) NULL, 1, ohd) = fftcep_order;      (void) add_genhd_c("fftcep_deriv", fftcep_range, (int)0, ohd);    }    *add_genhd_f("warping_param", (float *) NULL, 1, ohd) = warp_param;    *add_genhd_f("preemphasis", (float *) NULL, 1, ohd) = preemphasis;    if(debug_level>1)	Fprintf(stderr, "%s: adding fields.\n", PROG);    /* create output fields */    if (sd_flag)	REQUIRE( add_fea_fld(sd_fname, (long)frame_len, (short) 1, (long *) NULL,			     FLOAT, (char **) NULL, ohd) != -1,		"can't create sd_field_name field in output file header" );    if (p_flag)	REQUIRE( add_fea_fld(p_fname, (long )1, (short) 1, (long *) NULL,			     FLOAT, (char **) NULL, ohd) != -1,		"can't create power_field_name field in output file header" );    if (zc_flag)	REQUIRE( add_fea_fld(zc_fname, (long) 1, (short) 1, (long *) NULL,			     FLOAT, (char **) NULL, ohd) != -1,		"can't create zc_field_name field in output file header" );    if (rc_flag)	REQUIRE( add_fea_fld(rc_fname, (long)ac_order, (short) 1, (long *) NULL,			     FLOAT, (char **) NULL, ohd) != -1,		"can't create refcof field in output file header" );    if (ac_flag) 	REQUIRE( add_fea_fld(ac_fname, (long)(ac_order+1), (short) 1, (long *) NULL,			     FLOAT, (char **) NULL, ohd) != -1,		"can't create autocor field in output file header" );    if (lsf_flag)	REQUIRE( add_fea_fld(lsf_fname, (long)ac_order, (short) 1, (long *) NULL,			     FLOAT, (char **) NULL, ohd) != -1,		"can't create lsf field in output file header" );    if (lar_flag)	REQUIRE( add_fea_fld(lar_fname, (long)ac_order, (short) 1, (long *) NULL,			     FLOAT, (char **) NULL, ohd) != -1,		"can't create lar field in output file header" );    if (lpc_flag)	REQUIRE( add_fea_fld(lpc_fname, (long)ac_order, (short) 1, (long *) NULL,			     FLOAT, (char **) NULL, ohd) != -1,		"can't create lpc field in output file header" );    if (lpccep_flag)	REQUIRE( add_fea_fld(lpccep_fname, (long)lpccep_field_len, (short) 1, 			     (long *) NULL, FLOAT, (char **) NULL, ohd) != -1,		"can't create lpccep field in output file header" );    if (fftcep_flag) {	REQUIRE( add_fea_fld(fftcep_fname, (long)fftcep_field_len, (short) 1, 			     (long *) NULL, FLOAT, (char **) NULL, ohd) != -1,		"can't create fftcep field in output file header" );    }    update_waves_gen(ihd, ohd, (float) start, (float) step);    if (debug_level) {	Fprintf(stderr, "%s: Input file: %s \t Output file: %s\n", PROG,	    iname, oname);	Fprintf(stderr, "start: %ld   last: %ld    nan: %ld\n", start, last, nan);	Fprintf(stderr, "frame_len: %ld    step: %ld   frames: %ld\n", 		frame_len, step, n_frames);	Fprintf(stderr, "preemphasis: %f\n", preemphasis);	Fprintf(stderr, "window_type: %s\n", window_type);	if (ac_yes) 	  Fprintf(stderr, "autocorrelation order: %ld\n", ac_order);	if (rc_lpc_yes)	  Fprintf(stderr, "lpc and reflection coefs: order %ld\n", ac_order);	if (lar_flag) 	  Fprintf(stderr, "log area ratios order: %ld\n", ac_order);	if (lsf_flag)	  Fprintf(stderr, "line spectral frequencies order: %ld,   frequency resolution %f\n",		  ac_order, lsf_freq_res);	if (lpccep_flag)	  Fprintf(stderr, "lpc cepstrum: order %ld  formed from elements %s: warping param: %f\n", 		  lpccep_order, lpccep_range, warp_param);	if (fftcep_flag)	  Fprintf(stderr, "fft cepstrum: order %ld (%ld) formed from elements %s; warping param %f\n", 		  fftcep_order, fftcep_tlen, fftcep_range, warp_param);	if (fft_flag)	  Fprintf(stderr, "fft: order %ld (%ld)\n", fft_order, fft_tlen);    }    if (fft_flag)	REQUIRE( 0==init_feaspec_hd(ohd, NO, SPFMT_SYM_EDGE, SPTYP_DB, YES, (long) num_freqs, SPFRM_FIXED, 				    (float *)NULL,(double) src_sf,(long) frame_len, FLOAT), 		"can't initialize fea spec header.");    if ( ohd->hd.fea->field_count == 0  ) {	Fprintf(stderr, "%s: No output fields defined in parameter file - exiting\n", PROG);	exit(1);    }    if (debug_level>1)      Fprintf(stderr, "%s:writing output header to file\n", PROG);    write_header(ohd, ofile);    /* Allocate buffer and set up output record. */    x = (float *) calloc((unsigned) frame_len, sizeof(float));    sd_preemp_ptr = (float *) calloc((unsigned) frame_len, sizeof(float));    REQUIRE((x != NULL) && (sd_preemp_ptr != NULL), 	    "can't allocate memory for input frame");

⌨️ 快捷键说明

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