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

📄 extf_comp_0.cc

📁 这是处理语音信号的程序
💻 CC
字号:
// file: exft_comp_0.cc//// isip include files//#include "extract_feature.h"#include "extract_feature_constants.h"#include <window.h>#include <window_constants.h> // method: extf_comp_0.cc//// arguments: none//// return: none//// this method is the core computation//logical_1 Extract_feature::compute_cc() {  // open the input and output list files  //  FILE* fin = fopen((char*)input_file_d, "r");  if (fin == (FILE*)NULL) {    fprintf(stdout, "Error : cannot open input file %s\n", input_file_d);    exit(ISIP_PROTO_ERROR);  }  FILE* fout = fopen((char*)output_file_d, "r");  if (fout == (FILE*)NULL) {    fprintf(stdout, "Error : cannot open output file %s\n", output_file_d);    exit(ISIP_PROTO_ERROR);  }  // loop through all the files in the list  //  while (fgets((char*)input_file_d, ISIP_MAX_STRING_LENGTH, fin) !=	 (char*)NULL) {    if (fgets((char*)output_file_d, ISIP_MAX_STRING_LENGTH, fout)	== (char*)NULL) {      fprintf(stdout, "Error : mismatch in the number of input files ");      fprintf(stdout, "and output files.\n");      exit(ISIP_PROTO_ERROR);    }    int len = strlen((char*)input_file_d);    if (input_file_d[len - 1] == '\n') {      input_file_d[len - 1] = '\0';    }    len = strlen((char*)output_file_d);    if (output_file_d[len - 1] == '\n') {      output_file_d[len - 1] = '\0';    }    FILE* fraw = fopen((char*)input_file_d, "rb");    if (fraw == (FILE*)NULL) {      num_file_d++;      fprintf(stdout, "Warning %ld : cannot open file %s --> ", num_file_d, input_file_d);      fprintf(stdout, "missing mfcc file %s\n", output_file_d);      continue;    }    fclose(fraw);    // set the parameters of the signal object    //    data_sig_d.set_cc(input_file_d, num_chans_d, EXTF_NUM_BYTES,		    sample_freq_d, swap_byte_d);    // open the signal file    //    if (data_sig_d.open_cc(input_file_d, ISIP_READ_ONLY) == ISIP_FALSE) {            // output error message and exit      //      fprintf(stdout, "Extract_feature : Error opening file %s\n",	      input_file_d);      continue;    }    // determine the number of samples that will make up a window of data    // and the number of samples that will make up a frame of data    //    int_4 window_num_samples = (int_4)(window_dur_d * EXTF_MSEC_TO_SEC				     * sample_freq_d);    int_4 frame_num_samples = (int_4)(frame_dur_d * EXTF_MSEC_TO_SEC				    * sample_freq_d);        // determine the number of frames that will be read in    //    int_4 num_frames_to_read = (int_4)(data_sig_d.get_file_size_cc() /				       (frame_num_samples * EXTF_NUM_BYTES))      + (int_4)4;    float_8** model_vector = new float_8*[num_frames_to_read];    int_4 size = (int_4)0;    if (c0_d)      size = vector_size_d + (int_4)1;    else      size = vector_size_d;    float_8* tmp_vec = new float_8[num_frames_to_read * size];    for (int_4 j = 0; j < num_frames_to_read; j++) {      model_vector[j] = &tmp_vec[j * size];    }    float_8 *vector = model_vector[0];        // allocate memory for the window buffer    //    int_4 win_nsamps_pow2 = power_of_2(window_num_samples);    float_8* window_buffer = new float_8[win_nsamps_pow2];        // zero out a single window buffer    //    memset((void*)window_buffer, (int)0, (win_nsamps_pow2 * sizeof(float_8)));        // start at sample 0, we will just skip the first bit of data so that we    // can center the window around the frame of data. thus the window starts    // at sample 0 while the frame does not    //     int_4 start_sample = (int_4)0;    int_4 num_samps_read = (int_4)0;        // pointer to the window buffer    //    int_4 frame = 0;        Window window;    window.set_cc(window_type_d, window_num_samples);        // variable to hold maximum energy for clamping energy values later    //    max_energy_d = 0;        // loop until all data has been read    //    while (data_sig_d.read_cc(window_buffer, start_sample,			    (start_sample + window_num_samples),			    channel_d, num_samps_read)) {      // stop reading data if a full window cannot be read      //      if (num_samps_read == window_num_samples) {		if (zero_mean_d == ISIP_TRUE) {	  	  // zero mean source data	  //	  float_8 sum = (float_8)0;	  for (int k = 0; k < window_num_samples; k++) {	  	    sum += window_buffer[k];	  }	  sum /= (float_8)window_num_samples;	  for (int k = 0; k < window_num_samples; k++) {	  	    window_buffer[k] -= sum;	  }	}		// compute energy from raw data	//	float_8 e = 0.0;	for (int_4 i = 0; i < window_num_samples; i++) {	  e += window_buffer[i] * window_buffer[i];	}	// don't allow the energy to floor which would indicate a signal	// dropout	//	if (e >= 1.0) {	  e = log(e);	}	else {	  e = EXTF_MIN_ENERGY;	}	if (e > max_energy_d) {	  max_energy_d = e;	}		// preemphasize the data if necessary	//	if (use_pre_emph_d == ISIP_TRUE) {	  pre_emphasize_data_cc(window_buffer);	}		// apply the window if necessary	//	window.apply_cc(window_buffer, window_num_samples_d, (int_4)1);		int_4 vec_pos = 0;	int_4 algo = 0;		for (algo = 0; algo < EXTF_NUM_ALGORITHMS; algo++) {	  	  if (num_coeffs_d[algo] > 0) {	    	    if (algo == EXTF_ALGO_MEAN ) {	      vector[vec_pos] = e;	    }	    else if (algo == EXTF_ALGO_FBA) {	      compute_fba_cc(&vector[vec_pos], num_coeffs_d[algo],			     window_buffer);	    }	    else if (algo == EXTF_ALGO_FFT_MFCC) {	      compute_fft_mfcc_cc(&vector[vec_pos], num_coeffs_d[algo],				  window_buffer);	    }	  }	  vec_pos += num_coeffs_d[algo];	}		// increment the start of the window	//	start_sample += frame_num_samples;		// increment the vector	//	frame++;	vector = model_vector[frame];	      } // end if loop                // there is no enough data to fill the whole window      //      else {	break;      }    } // end of the while loop        // close the signal file    //    data_sig_d.close_cc();              // normalize the vectors    //    normalize_cc(model_vector, frame);        // perform any necessary post-processing    //    if (delta_d == ISIP_TRUE) {      compute_delta_cc(model_vector, frame, 0, vector_first_d, delta_win_d);    }    if (delta_delta_d == ISIP_TRUE) {      compute_delta_cc(model_vector, frame, vector_first_d, vector_first_d,		       delta_win_d);    }        // output the full vectors    //    write_cc(model_vector, frame);        // free memory    //    delete [] window_buffer;    delete [] tmp_vec;    delete [] model_vector;      }// end of while loop     // clean up  //  fclose(fin);  fclose(fout);	    // exit gracefully  //  return ISIP_TRUE;}

⌨️ 快捷键说明

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