prnt_dist.c
来自「speech signal process tools」· C语言 代码 · 共 1,741 行 · 第 1/3 页
C
1,741 行
int i_rec; /* record index */ int i_ele; /* element index */ int j; /* temporary element index *//* * External Variables Referenced: * * int s_rec, e_rec; start record, end record * int s_ele, e_ele; start element, end element **/ (void) pr_table_hdr1(); /* Print Table for -E option */ n_rec = (e_rec - s_rec + 1); for ( i_rec = 0, rec_num = s_rec; i_rec < n_rec; i_rec++, rec_num++ ) { (void) fprintf ( stdout, " %d ", rec_num); for (i_ele = s_ele, j = 0; i_ele <= e_ele; i_ele++, j++) { if ( i_ele == s_ele) (void) fprintf ( stdout, " \t" ); else (void) fprintf ( stdout, " \t" ); (void) fprintf ( stdout, "element%d\t%4.3e\t%4.3e\t%4.3e\n", i_ele, diff[i_rec][j], ABS (diff[i_rec][j]), SQUARE (diff[i_rec][j]) ); } (void) fprintf (stdout, "\n"); }}pr_gen_ele_avg (diff) /* Print Generic Element Average */double **diff;{ int n_rec; /* total number of records */ int i_rec; /* record index */ int i_ele; /* element index */ int j; /* temporary element index */ float diff_sum; /* sum of differences across all records */ float mag_sum; /* sum of magnitudes across all records */ float sqrd_sum; /* sum of magnitude squared " " " */ int count; /* number of records to average */ float avg_diff; /* average difference across records */ float avg_mag; /* average magnitudes " " */ float avg_sqrd; /* average magnitude squared " " */ float max_mag; /* maximum magnitude across records */ float max_sqrd; /* maximum magnitude squared across records */ int max_rec; /* record position where maximum occurs *//* * External Variables Referenced: * * int s_rec, e_rec; start record, end record * int s_ele, e_ele; start element, end element **/ (void) pr_table_hdr2(); /* print Element Average Table Header */ n_rec = (e_rec - s_rec + 1); for (i_ele = s_ele, j = 0; i_ele <= e_ele; i_ele++, j++) { diff_sum = 0.0; mag_sum = 0.0; sqrd_sum = 0.0; count = 0; max_mag = 0.0; max_sqrd = 0.0; for ( i_rec = 0; i_rec < n_rec; i_rec++ ) { diff_sum += diff[i_rec][j]; mag_sum += ABS (diff[i_rec][j]); sqrd_sum += SQUARE (diff[i_rec][j]); ++count; if (i_rec == 0) { max_mag = ABS (diff[i_rec][j]); max_sqrd = SQUARE (diff[i_rec][j]); max_rec = i_rec; } else { max_mag = MAX (max_mag, ABS (diff[i_rec][j])); max_sqrd = MAX (max_sqrd, SQUARE (diff[i_rec][j])); max_rec = i_rec; } } if (debug_level > 4) { (void) fprintf (stderr, "pr_ana_ele_avg: elements: diff_sum = %4.3e, mag_sum = %4.3e\n", diff_sum, mag_sum); (void) fprintf (stderr, " sqrd_sum = %e, count = %d\n", sqrd_sum, count); } if (count != 0) { avg_diff = diff_sum / (float) count; avg_mag = mag_sum / (float) count; avg_sqrd = sqrd_sum / (float) count; (void) fprintf ( stdout, "element%d\t", i_ele); (void) fprintf ( stdout, (avg_diff > 0) ? " " : "" ); (void) fprintf ( stdout, "%4.3e %4.3e %4.3e %4.3e %4.3e\n", avg_diff, avg_mag, avg_sqrd, max_mag, max_sqrd ); } } (void) fprintf (stdout, "\n");}pr_gen_rec_avg (diff) /* print Record Average */double **diff;{ int n_rec; /* total number of records */ int rec_num; /* current record number */ int i_rec; /* record index */ int i_ele; /* element index */ int j; /* temporary element index */ float diff_sum; /* sum of differences across all elements */ float mag_sum; /* sum of magnitudes across all elements */ float sqrd_sum; /* sum of magnitude squared " " " */ int count; /* number of elements to average */ float avg_diff; /* average difference across elements */ float avg_mag; /* average magnitudes " " */ float avg_sqrd; /* average magnitude squared " " *//* * External Variables Referenced: * * int s_rec, e_rec; start record, end record * int s_ele, e_ele; start element, end element **/ (void) pr_table_hdr3(); /* Print Record Average Table Header */ n_rec = (e_rec - s_rec + 1); for ( i_rec = 0, rec_num = s_rec; i_rec < n_rec; i_rec++, rec_num++ ) { diff_sum = 0.0; mag_sum = 0.0; sqrd_sum = 0.0; count = 0; for (i_ele = s_ele, j = 0; i_ele <= e_ele; i_ele++, j++ ) { diff_sum += diff[i_rec][j]; mag_sum += ABS (diff[i_rec][j]); sqrd_sum += SQUARE (diff[i_rec][j]); ++count; } if (debug_level > 4) { (void) fprintf (stderr, "pr_gen_rec_avg: elements: diff_sum = %4.3e, mag_sum = %4.3e\n", diff_sum, mag_sum); (void) fprintf (stderr, " sqrd_sum = %4.3e, count = %d\n", sqrd_sum, count); } if (count != 0) { avg_diff = diff_sum / (float) count; avg_mag = mag_sum / (float) count; avg_sqrd = sqrd_sum / (float) count; (void) fprintf ( stdout, " %d \t * \t%4.3e\t%4.3e\t%4.3e\n", rec_num, avg_diff, avg_mag, avg_sqrd ); } } /* record loop */ (void) fprintf (stdout, "\n");}pr_gen_file_avg (diff) /* Print File Average */double **diff;{ int n_rec; /* total number of records */ int i_rec; /* record index */ int i_ele; /* element index */ int j; /* temporary element index */ int count; /* number of records to average */ float mean_diff; /* mean difference across records */ float mean_mag; /* mean magnitude across records */ float mean_sqrd; /* mean magnitude squared across records */ float tot_diff; /* difference across ALL records & elements */ float tot_mag; /* magnitude of difference across " " " " */ float tot_sqrd; /* magnitude squared difference across " " *//* * External Variables Referenced: * * int s_rec, e_rec; start record, end record * int s_ele, e_ele; start element, end element **/ (void) pr_table_hdr4(); /* print File Average Table Header */ n_rec = (e_rec - s_rec + 1); count = 0; tot_diff = 0.0; tot_mag = 0.0; tot_sqrd = 0.0; for ( i_rec = 0; i_rec < n_rec; i_rec++ ) for (i_ele = s_ele, j = 0; i_ele <= e_ele; i_ele++, j++) { tot_diff += diff[i_rec][j]; tot_mag += ABS (diff[i_rec][j]); tot_sqrd += SQUARE (diff[i_rec][j]); ++count; } if (debug_level > 4) { (void) fprintf (stderr, "pr_gen_file_avg: tot_diff = %4.3e, tot_mag = %4.3e, tot_sqrd = %4.3e\n", tot_diff, tot_mag, tot_sqrd); (void) fprintf (stderr, "pr_gen_file_avg: count = %d\n", count ); } if (count != 0) { mean_diff = tot_diff / (float) count; mean_mag = tot_mag / (float) count; mean_sqrd = tot_sqrd / (float) count; (void) fprintf ( stdout, " \t %4.3e \t\t %4.3e \t\t %4.3e\n", mean_diff, mean_mag, mean_sqrd ); } (void) fprintf (stdout, "\n");}pr_is_dist() /* Print Spectral Distortions */{ char *STAR = " * "; int n_rec; /* total number of records */ int rec_num; /* current record number */ int i_rec; /* record index *//* * External Variables Referenced: * * int s_rec, e_rec; start record, end record * int s_ele, e_ele; start element, end element * * char **frame; frame type (Voiced or Unvoiced) **/ if (sflag) (void) fprintf ( stdout, " \t\t SPECTRAL DISTORTIONS - SYMMETRIC\n" ); else (void) fprintf ( stdout, " \t\t SPECTRAL DISTORTIONS\n" ); (void) fprintf ( stdout, "\n" ); (void) fprintf ( stdout, " Record\t\t IS \t\t\tGNIS\t\t\tGOIS\n" ); (void) fprintf ( stdout, " ------\t\t----\t\t\t----\t\t\t----\n" ); n_rec = (e_rec - s_rec + 1); for ( i_rec = 0, rec_num = s_rec; i_rec < n_rec; i_rec++, rec_num++ ) { if (IS_dist[i_rec] == -1.0) (void) fprintf ( stdout, " %d (%s)\t%s\t\t\t%s\t\t\t%s\n", rec_num, frame[i_rec], STAR, STAR, STAR); else (void) fprintf ( stdout, " %d (%s)\t%6.4f\t\t\t%6.4f\t\t\t%6.4f\n", rec_num, frame[i_rec], IS_dist[i_rec], GNIS_dist[i_rec], GOIS_dist[i_rec]); }} /* end pr_is_dist() */pr_tot_is_dist() /* Print TOTAL Spectral Distortions */{ char *STAR = " * "; int n_rec; /* total number of records */ int rec_num; /* current record number */ int i_rec; /* record index *//* * External Variables Referenced: * * int s_rec, e_rec; start record, end record * int s_ele, e_ele; start element, end element * * char **frame; frame type (Voiced or Unvoiced) **//* Local Variables */ double U_is = 0; double U_gnis = 0; double U_gois = 0; int unvcd = 0; double V_is = 0; double V_gnis = 0; double V_gois = 0; int vcd = 0; double ALL_is = 0; double ALL_gnis = 0; double ALL_gois = 0; int tot_rec = 0; (void) fprintf ( stdout, "\n" ); (void) fprintf ( stdout, " \t\t TOTAL SPECTRAL DISTORTIONS\n" ); (void) fprintf ( stdout, "\n" ); (void) fprintf ( stdout, " Frame \t\t IS \t\t\tGNIS\t\t\tGOIS\n" ); (void) fprintf ( stdout, " ------\t\t----\t\t\t----\t\t\t----\n" ); n_rec = (e_rec - s_rec + 1); for ( i_rec = 0, rec_num = s_rec; i_rec < n_rec; i_rec++, rec_num++ ) { if (IS_dist[i_rec] != -1.0) { /* * If IS_dist[i_rec] = -1.0 that means lpc_power[0] was zero, * therefore we cannot include that record in our computations. */ if (strcmp(frame[i_rec], "Unvoiced") == 0) { U_is += IS_dist[i_rec]; U_gnis += GNIS_dist[i_rec]; U_gois += GOIS_dist[i_rec]; ++unvcd; } else { /* "Voiced" Frame */ V_is += IS_dist[i_rec]; V_gnis += GNIS_dist[i_rec]; V_gois += GOIS_dist[i_rec]; ++vcd; } ALL_is += IS_dist[i_rec]; ALL_gnis += GNIS_dist[i_rec]; ALL_gois += GOIS_dist[i_rec]; ++tot_rec; } } if (unvcd != 0) { U_is /= unvcd; U_gnis /= unvcd; U_gois /= unvcd; } if (vcd != 0) { V_is /= vcd; V_gnis /= vcd; V_gois /= vcd; } if (tot_rec != 0) { ALL_is /= tot_rec; ALL_gnis /= tot_rec; ALL_gois /= tot_rec; } if (unvcd == 0) (void) fprintf ( stdout, " %s\t\t%s\t\t\t%s\t\t\t%s\n", "Unvoiced", STAR, STAR, STAR); else (void) fprintf ( stdout, " %s\t\t%6.4f\t\t\t%6.4f\t\t\t%6.4f\n", "Unvoiced", U_is, U_gnis, U_gois); if (vcd == 0) (void) fprintf ( stdout, " %s\t\t%s\t\t\t%s\t\t\t%s\n", " Voiced ", STAR, STAR, STAR); else (void) fprintf ( stdout, " %s\t\t%6.4f\t\t\t%6.4f\t\t\t%6.4f\n", " Voiced ", V_is, V_gnis, V_gois); if (tot_rec == 0) (void) fprintf ( stdout, " %s\t\t%s\t\t\t%s\t\t\t%s\n", " ALL ", STAR, STAR, STAR); else (void) fprintf ( stdout, " %s\t\t%6.4f\t\t\t%6.4f\t\t\t%6.4f\n", " ALL ", ALL_is, ALL_gnis, ALL_gois);} /* end pr_tot_is_dist() */pr_spec_ele() /* Print each element difference (-E option) */{ int n_rec; /* total number of records */ int i_rec; /* record index */ int i_ele; /* element index */ int j; /* temporary element index *//* * External Variables Referenced: * * int s_rec, e_rec; start record, end record * int s_ele, e_ele; start element, end element * * GLOBAL Variables Referenced: * * char **frame; string for " Voiced " for "Unvoiced" * * int *freq_len; length of array re_spec_val, im_spec_val, * and frqs_len for each record * * float **diff_real; difference between re_spec_val vector * float **diff_imag; difference between im_spec_val vector * float **diff_frqs; difference between frqs vector * **/ (void) pr_table_hdr1(); /* print header for first table */ n_rec = (e_rec - s_rec + 1); for ( i_rec = 0, rec_num = s_rec; i_rec < n_rec; i_rec++, rec_num++ ) {/* * Print out the first line of the output seperately * from the rest -- so that the record number and frame type (i.e. * voiced or unvoiced) only appears once on the top. **/ (void) fprintf ( stdout, "%d (%s)\tre_spec_val[%d]\t", rec_num, frame[i_rec], s_ele - 1); (void) fprintf ( stdout, (diff_real[i_rec][0] > 0) ? " " : "" ); (void) fprintf ( stdout, "%4.3e\t%4.3e\t%4.3e\n", diff_real[i_rec][0], ABS (diff_real[i_rec][0]), SQUARE (diff_real[i_rec][0]) ); for (i_ele = s_ele, j = 1; j < freq_len[i_rec]; i_ele++, j++) { (void) fprintf ( stdout, " \tre_spec_val[%d]\t", i_ele); (void) fprintf ( stdout, (diff_real[i_rec][j] > 0) ? " " : "" ); (void) fprintf ( stdout, "%4.3e\t%4.3e\t%4.3e\n", diff_real[i_rec][j], ABS (diff_real[i_rec][j]), SQUARE (diff_real[i_rec][j]) ); } (void) fprintf (stdout, "\n"); if ( strcmp(frame[i_rec], " Voiced ") == 0 ) { for (i_ele = s_ele - 1, j = 0; j < freq_len[i_rec]; i_ele++, j++) { (void) fprintf ( stdout, " \tim_spec_val[%d]\t", i_ele); (void) fprintf ( stdout, (diff_imag[i_rec][j] > 0) ? " " : "" ); (void) fprintf ( stdout, "%4.3e\t%4.3e\t%4.3e\n", diff_imag[i_rec][j], ABS (diff_imag[i_rec][j]), SQUARE (diff_imag[i_rec][j]) ); } (void) fprintf (stdout, "\n"); } for (i_ele = s_ele - 1, j = 0; j < freq_len[i_rec]; i_ele++, j++) { (void) fprintf ( stdout, " \tfrqs[%d]\t", i_ele); (void) fprintf ( stdout, (diff_frqs[i_rec][j] > 0) ? " " : "" ); (void) fprintf ( stdout, "%4.3e\t%4.3e\t%4.3e\n", diff_frqs[i_rec][j], ABS (diff_frqs[i_rec][j]), SQUARE (diff_frqs[i_rec][j]) ); } (void) fprintf (stdout, "\n"); } /* main for loop */} /* end pr_spec_ele() */pr_spec_ele_avg() /* print Element Average */{ int n_rec; /* total number of records */ int i_rec; /* record index */ int i_ele; /* element index */ int j; /* temporary element index */ float diff_sum; /* sum of differences across all records */ float mag_sum; /* sum of magnitudes across all records */ float sqrd_sum; /* sum of magnitude squared " " " */ int count; /* number of records to average */ float avg_diff; /* average difference across records */ float avg_mag; /* average magnitudes " " */ float avg_sqrd; /* average magnitude squared " " */
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?