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

📄 ftrf_07.cc

📁 这是一个从音频信号里提取特征参量的程序
💻 CC
字号:
// file: $isip/class/mmedia/FeatureFile/ftrf_07.cc// version: $Id: ftrf_07.cc,v 1.6 2003/02/13 17:00:05 alphonso Exp $//// isip include files//#include "FeatureFile.h"// method: getBufferedData//// arguments: none//  Vector<VectorFloat>& data: (output) the features data//  long start_pos: (input) the start position of the features data//  // return: number of data read//// this method retrieves data from the circular buffer if it is available,// or else get thems directly from the feature file.//long FeatureFile::getBufferedData(Vector<VectorFloat>& data_a,				  long start_pos_a) {  // loop over each channel  //  long num_read = 0;  long num_elem_a = 1;    for (long ctag = 0; ctag < num_channels_d; ctag++) {        // get the data    //    long n = getBufferedData(data_a(ctag), ctag, start_pos_a, num_elem_a);    // error check    //    if (n < 0) {      return -1;    }    num_read += n;  }    // exit gracefully  //  return num_read;}// method: getBufferedData//// arguments://  VectorFloat& data: (output) the audio data//  long ctag: (input) the channel to read//  long start_pos: (input) the start sample of the audio data//  long num_elem: (input) the duration of the audio data//  // return: number of data read//// this method retrieves data from the circular buffer if it is available,// or else get thems directly from the feature file.//long FeatureFile::getBufferedData(VectorFloat& data_a, long ctag_a,				  long start_pos_a, long num_elem_a) {    // check argument  //  if (ctag_a < 0) {    Error::handle(name(), L"getBufferedData",		  Error::ARG, __FILE__, __LINE__);    return -1;  }  // bad arguments  //  if (num_elem_a < 0) {    Error::handle(name(), L"getBufferedData", Error::ARG, __FILE__, __LINE__);    return -1;  }  // this is a common loop termination condition  //  else if (num_elem_a == 0) {    data_a.clear();    return -1;  }    // determine the maximum number of features in the file  //  //  long total_nfeatures = getNumFeatures();  long total_nfeatures = getNumFrames();    // if the required feature index is greater than total features in file,  // just return 0.  //  if (start_pos_a > total_nfeatures - 1) {    data_a.setLength(0);    return 0;  }  // set the length of vector, it is one  //  data_a.setLength(num_elem_a);  // get the start and end time of the data already in circular buffer  //  long buf_duration = buffers_d(ctag_a).getNumElements();  long buf_end = buf_end_ftr_d(ctag_a);  long buf_start = getStartFeature(ctag_a);  long buf_max_sample = buf_end  + (long)buf_size_d - 1;  // do we need samples that start before the circular buffer starts?  //  // or is the start sample much farther in the future, such that the  // current samples would be pushed out before we get there?   //  // if so we need to reset everything and start over.  //  if ((start_pos_a < buf_start) || (start_pos_a > buf_max_sample)) {    if (debug_level_d >= Integral::BRIEF) {      String output(L"clearing buffers...");      Console::put(output);    }        // clear out buffer    //    resetBuffer(ctag_a);        // determine the new starting point that lines up on a block boundary    //    buf_start = buf_end_ftr_d(ctag_a) + (long)1;    buf_duration = 0;    // set pointers and time indices    //    buf_end = buf_start - 1;    buf_end_ftr_d(ctag_a) = buf_end;  }  // do we need to read ?  //  while ((!end_of_file_d) &&	 (start_pos_a > getEndFeature(ctag_a))) {    // output some debug information    //    if (debug_level_d >= Integral::DETAILED) {      String output;      String numeric;            output.assign(L"we need to read since ");      numeric.assign(start_pos_a);      output.concat(numeric);      output.concat(L"+");      numeric.assign(num_elem_a);      output.concat(numeric);      output.concat(L"=");      numeric.assign(start_pos_a + num_elem_a);      output.concat(numeric);      output.concat(L" > ");      numeric.assign(getEndFeature(ctag_a));      output.concat(numeric);      Console::put(output);    }          // pull in the next block of data    //    appendData();    if (debug_level_d >= Integral::ALL) {      String output;      output.assign(getEndFeature(ctag_a));      output.insert(L"now end_samp = ", 0);      Console::put(output);    }        // recalculate boundaries    //    buf_duration = buffers_d(ctag_a).getNumElements();    buf_start = getStartFeature(ctag_a);  }  // make sure the data is in the buffer  //  buf_duration = buffers_d(ctag_a).getNumElements();  buf_start = getStartFeature(ctag_a);  // possibly pull data from the circular buffer  //  if (start_pos_a < buf_start) {    Error::handle(name(), L"getBufferedData", ERR, __FILE__, __LINE__);    return -1;  }  if (start_pos_a > buf_end_ftr_d(ctag_a)) {    Long(start_pos_a).debug(L"start_pos_a");    buf_end_ftr_d.debug(L"buf_end_samp");    Error::handle(name(), L"getBufferedData", ERR, __FILE__, __LINE__);    return -1;  }   // copy over data from the circular buffer to the output vector  //  long buf_index = start_pos_a - buf_end_ftr_d(ctag_a);   data_a.assign(buffers_d(ctag_a)(buf_index));      // exit gracefully  //  return num_elem_a;}// method: appendData//// arguments: none//  // return: a boolean value indicating status//// this method reads the next block of data from a feature file and// places it on the circular buffer.//boolean FeatureFile::appendData() {  // check for end of file  //  if (end_of_file_d) {    return false;  }    // determine the current location of the buffer  //  long first_samp = (long)buf_end_ftr_d(0) + 1;  long block_samp = block_size_d;    for (long ctag = 0; ctag < num_channels_d; ctag++) {        // determine if we are about to overwrite data    //    long num_bytes_left = (buffers_d(ctag).getCapacity() -			   buffers_d(ctag).getNumElements()) ;    if (num_bytes_left < block_size_d) {            if (debug_level_d >= Integral::DETAILED) {	String output(L"Channel ");	output.concat(ctag);	output.concat(L": num_bytes_left = ");	output.concat(num_bytes_left);	output.concat(L"; clearing out old block");	Console::put(output);      }            // clear out the oldest block by advancing the read pointer      //      buffers_d(ctag).setRead(block_samp);    }  }    // read a block of data  //  Vector<VectorFloat> raw_data;    // read data  //  long nsamp = readFeatureData(raw_data, -1, first_samp, block_samp);  // output debug information  //  if (debug_level_d >= Integral::DETAILED) {    String numeric;    String output(L"read ");    numeric.assign(nsamp);    output.concat(numeric);    output.concat(L" samples, ending at file position ");    output.concat(numeric);    Console::put(output);  }  // check for end of file  //  if (nsamp != block_samp) {    // output debug information    //    if (debug_level_d >= Integral::DETAILED) {      String numeric;      String output(L"end of file at sample ");      numeric.assign(nsamp + first_samp);      output.concat(numeric);      Console::put(output);    }    // set the end of file flag    //    end_of_file_d = true;  }  // transfer data  //  for (long i = 0; i < raw_data.length() / num_channels_d ; i++) {    for (long ctag = 0; ctag < num_channels_d; ctag++) {            // insert the input data into buf      //      buffers_d(ctag).append(raw_data(i * num_channels_d + ctag));            // only seek if we can      //      if (buffers_d(ctag).getNumElements() > 1) {	buffers_d(ctag).seekCurr(1);      }            buf_end_ftr_d(ctag) += 1;    }  }    // exit gracefully  //  return true;}// method: getNumFrames//// arguments: none//// return: the long value of the number of frames//// this method gets the number of frames from a file.//long FeatureFile::getNumFrames() {  long total_nftr = -1;   // check if the number of frames was previously cached  //  if ((long)num_frames_d != DEF_NUM_FRAMES) {    return (long)num_frames_d;  }    // branch on format: RAW  //  if (file_format_d == RAW) {    // RAW FEATURES file BINARY or TEXT    String output;    String values;    long lines = 0;    // save the current file position and seek end    //    long cur_file_pos = raw_features_d.tell();        // branch on type: TEXT    //    if (file_type_d == TEXT) {      raw_features_d.rewind();      while (!raw_features_d.eof()) {	lines++;	values.assign(lines);	values.concat(L": ");	raw_features_d.get(output);	values.concat(output);      }            raw_features_d.rewind();      lines--;  // take off one line      total_nftr = lines / num_channels_d;      raw_features_d.seek(cur_file_pos, File::POS);    }    // type: BINARY    //    else if (file_type_d == BINARY) {      // save the current file position and seek end      //      raw_features_d.seek(0, File::POS_PLUS_END);      long total_len = raw_features_d.tell();            // compute the total number of features      //      long nums_per_feature = (num_features_d * num_channels_d);      total_nftr = total_len / nums_per_feature / sizeof(float64);            // resume the file position      //      raw_features_d.seek(cur_file_pos, File::POS);    }    // type: unknown    //    else {      return Error::handle(name(), L"getNumFrames", Error::NOT_IMPLEM,			   __FILE__, __LINE__);    }  }    // format: Sof  //  else if (file_format_d == SOF) {    // format: BINARY    //    if (in_sof_d.isBinary()) {      long cur = in_sof_d.tell();      in_sof_d.seek(sof_length_pos_d, File::POS);      Long len;      len.readData(in_sof_d, PARAM_DATA);      total_nftr = (long)len / (long)num_channels_d;      in_sof_d.seek(cur, File::POS);    }    // format: TEXT    //    else if (in_sof_d.isText()) {      long len =	in_sof_d.getVecParser().countTokens(SofParser::implicitPname());      total_nftr = len / (long)num_channels_d;    }    // format: unknown    //    else {      return Error::handle(name(), L"getNumFrames", Error::NOT_IMPLEM,			   __FILE__, __LINE__);    }  }  // format: unknown  //  else {    return Error::handle(name(), L"getNumFrames", Error::NOT_IMPLEM,			 __FILE__, __LINE__);  }  // cache the number of frames  //  num_frames_d = total_nftr;    // return the number of frames  //  return (long)num_frames_d;}// method: readFeatureData//// arguments://  Vector<VectorFloat>& data: (output) the feature data//  long ctag: (input) the channel to read//  long start_pos: (input) the start pos from feature data//  long num_elem: (input) the num of element read from feature data//  // return: number of frames read//// this method gets data from an feature file and returns each channel// as a VectorFloat.//long FeatureFile::readFeatureData(Vector<VectorFloat>& data_a,				  long ctag_a, long start_pos_a,				  long num_elem_a) {    // make sure the file is open  //  if (!isOpen()) {    return Error::handle(name(), L"", ERR, __FILE__, __LINE__);  }    // for binary read  //  if (file_format_d == RAW) {    return readRawData(data_a, ctag_a, start_pos_a, num_elem_a);  }    // sof file  //  if (file_format_d == SOF) {    return readSofData(data_a, ctag_a, start_pos_a, num_elem_a);  }    // bad type  //  Error::handle(name(), L"readFeatureData",		ERR, __FILE__, __LINE__);  return -1;}

⌨️ 快捷键说明

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