me_spec.c
来自「speech signal process tools」· C语言 代码 · 共 617 行 · 第 1/2 页
C
617 行
"%s: Field \"%s\" and symbol \"power\" undefined or not float.\n", ProgName, power_field); exit(1); } } if (power_field == NULL) def_power = getsym_d("power"); } else if (fana) power_field = "raw_power"; else { Fprintf(stderr, "%s: Neither field nor default value for power specified.\n", ProgName); exit(1); } if ( symtype("samp_freq_name") == ST_STRING || symtype("samp_freq") == ST_FLOAT ) { if (symtype("samp_freq_name") != ST_STRING) samp_freq = getsym_d("samp_freq"); else { samp_freq_name = getsym_s("samp_freq_name"); if (genhd_type(samp_freq_name, (int *) NULL, ihd) == FLOAT) samp_freq = get_genhd_val(samp_freq_name, ihd, (double)1); else if (symtype("samp_freq") == ST_FLOAT) samp_freq = getsym_d("samp_freq"); else { Fprintf(stderr, "%s: Header item \"%s\" and symbol \"samp_freq\" undefined or not float.\n", ProgName, samp_freq_name); exit(1); } } } else if (fana) samp_freq = get_genhd_val("src_sf", ihd, (double)(1)); else { Fprintf(stderr, "%s: No header-item name or default value for sampling frequency.\n", ProgName); exit(1); }/* Get elements, order of spec_param field. */ elements = fld_range_switch(spec_param_field, &spec_param_field, &fld_len, ihd); if (elements == NULL) { Fprintf(stderr, "%s: Input field %s undefined.\n", ProgName, spec_param_field); exit(1); } if (get_fea_type(spec_param_field, ihd) != FLOAT) { Fprintf(stderr, "%s: Input field %s undefined or not float.\n", ProgName, spec_param_field); exit(1); } if (fana) { order_vcd = get_genhd_val("order_vcd", ihd, (double) 1); order_unvcd = get_genhd_val("order_unvcd", ihd, (double) 1); input_order = MAX(order_vcd, order_unvcd); if (debug_level) Fprintf(stderr, "order_vcd = %ld; order_unvcd = %ld\n", order_vcd, order_unvcd); if (input_order > fld_len) { Fprintf(stderr, "%s: Input field length %d too small.\n", ProgName, fld_len); } if ((order_vcd == 0) || (order_unvcd == 0)) { order_vcd = order_unvcd = input_order; if (debug_level) { Fprintf(stderr, "%s: WARNING - order_vcd or order_unvcd is 0;\n", ProgName); Fprintf(stderr, "\tperhaps you need the -G option\n"); } } } else input_order = fld_len; if (!oflag || max_order > input_order) max_order = input_order; if (debug_level) Fprintf(stderr, "input_order = %d\n", input_order);/* Make output header */ if (debug_level) Fprintf(stderr, "Making output header.\n"); ohd = new_header(FT_FEA); add_source_file(ohd, iname, ihd); add_comment(ohd, cmd_line); ohd->common.tag = ihd->common.tag; (void) strcpy(ohd->common.prog, ProgName); (void) strcpy(ohd->common.vers, Version); (void) strcpy(ohd->common.progdate, Date); ohd->variable.refer = ihd->variable.refer;/* * Check file subtype (and possibly frmlen) to determine * frame_meth value - only fea_ana with frmlen != 0 are FIXED type*/ frame_meth = SPFRM_NONE; frlen = (long)get_genhd_val("frmlen", ihd, (double)0); if(fana && frlen != 0) frame_meth = SPFRM_FIXED; spsassert( !init_feaspec_hd(ohd, YES, SPFMT_SYM_EDGE, SPTYP_DB, YES, (long)num_freqs, frame_meth, (float *)NULL, samp_freq, frlen, FLOAT), "Error filling FEA_SPEC header.\n"); if(fana){ (void)add_genhd_l("order_vcd", &order_vcd, 1, ohd); (void)add_genhd_l("order_unvcd", &order_unvcd, 1, ohd); (void)add_fea_fld("voiced", 1L, (short) 0, (long *)NULL, CODED, yesno, ohd); } if((src_sf = get_genhd_val("src_sf", ihd, (double)-1)) != -1) (void)add_genhd_d("src_sf", &src_sf, (int)1, ohd);/* * update start_time and record_freq*/ update_waves_gen(ihd, ohd, (float)startrec, 1.0);/* Allocate records */ if (debug_level) Fprintf(stderr, "Allocating records.\n"); ana_rec = allo_genana_rec(ihd, fana, spec_param_field, power_field); spec_rec = allo_feaspec_rec(ohd,FLOAT); TRYALLOC(float, input_order, spec_params, "input spectral parameters") TRYALLOC(float, max_order, lpcfilter, "lpc filter") if (spec_rep == RC) reflcoef = spec_params; else TRYALLOC(float, max_order, reflcoef, "reflection coefficients")/* Position at first record, then fire away */ fea_skiprec(ifile, startrec - 1, ihd); if (debug_level) Fprintf(stderr, "%ld records.\n", nrecs); while (nrecs-- && (get_genana_rec(ana_rec, ihd, ifile) != EOF)) { /* if the file is tagged, we can use the first record to tell us the starting point; if there's only one record being processed, we also know the number of points */ if (first) { first = NO; if (fana && ihd->common.tag) { (void)add_genhd_l("start", ana_rec->tag, (int)1, ohd); if (nrecs == 0) (void)add_genhd_l("nan", ana_rec->frame_len, (int)1, ohd); } /*now we go ahead and write the header, before any records are output*/ if (debug_level) Fprintf(stderr, "Writing header.\n"); write_header(ohd, ofile); } if (ihd->common.tag) *spec_rec->tag = *ana_rec->tag; if (!fana) order = input_order; else if (*ana_rec->frame_type == VOICED || *ana_rec->frame_type == TRANSITION) { order = order_vcd; *(short *)get_fea_ptr(spec_rec->fea_rec, "voiced", ohd) = YES; } else /*all other FEA_ANA frame types are treated as unvoiced*/ { order = order_unvcd; *(short *)get_fea_ptr(spec_rec->fea_rec, "voiced", ohd) = NO; } if(frame_meth == SPFRM_VARIABLE){ frlen = fana ? *ana_rec->frame_len : (long)0; *spec_rec->frame_len = frlen; } /* invalid if ana prog used overlapping */ /* or noncontiguous frames */ total_power = raw_pwr = power_field == NULL ? def_power : !fana ? *ana_rec->raw_power : avg_raw_pwr(ana_rec, ihd); *spec_rec->tot_power = (float)total_power; for (i = 0; i < order; i++) spec_params[i] = ana_rec->spec_param[elements[i]]; if (debug_level) { Fprintf(stderr, "Locn = %ld\n", *ana_rec->tag); Fprintf(stderr, "Raw_power = %g\n", raw_pwr); Fprintf(stderr, "Spectral parameters:\n"); for (i = 1; i <= order; i++) Fprintf(stderr, "%d\t%f\n", i, spec_params[i-1]); } if (spec_rep != RC) { if ( reps_rc(spec_params, spec_rep, reflcoef, order, 0.5*samp_freq) == -1 ) { Fprintf(stderr, "%s: unknown spectral parameter type %d.\n", ProgName, spec_rep); exit(1); } } if (debug_level) { Fprintf(stderr, "Reflection coefficients:\n"); for (i = 1; i <= order; i++) Fprintf(stderr, "%d\t%f\n", i, reflcoef[i-1]); } order = MIN(order, max_order); rctoc(reflcoef - 1, order, lpcfilter - 1, &gain); /* rctoc indices start at 1 */ if (debug_level) { Fprintf(stderr, "Filter coefficients:\n"); for (i = 1; i <= order; i++) Fprintf(stderr, "%d\t%f\n", i, lpcfilter[i-1]); Fprintf(stderr, "Gain = %g\n", gain); } get_arspec(lpcfilter - 1, order, raw_pwr*gain, samp_freq, spec_rec->re_spec_val, 2*(num_freqs-1)); (void)put_feaspec_rec(spec_rec, ohd, ofile); (void) fflush(ofile); } exit(0); /*NOTREACHED*/}doubleavg_raw_pwr(ana_rec, h) /* Average raw power in analysis record */ struct genana *ana_rec; struct header *h;{ if (ana_rec->p_pulse_len[0] == 0 /* unvoiced */ || ana_rec->raw_power[1] < 0) /* only one pwr for frame */ return ana_rec->raw_power[0]; else /* voiced, one pwr per pulse */ { int i; double len, sum_len = 0, sum_energy = 0; for ( i = 0; i < *(long *) get_genhd("maxpulses", h) && ana_rec->p_pulse_len[i] != 0; i++ ) { sum_len += len = ana_rec->p_pulse_len[i]; sum_energy += len * ana_rec->raw_power[i]; } return sum_energy/sum_len; }}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?