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

📄 afnd_05.cc

📁 这是一个从音频信号里提取特征参量的程序
💻 CC
字号:
// file: $isip/class/sp/AudioFrontEnd/afnd_05.cc// version: $Id: afnd_05.cc,v 1.38 2002/08/27 20:13:08 zheng Exp $//// isip include files//#include "AudioFrontEnd.h"// method: resetBuffer//// arguments://  // return: a boolean value indicating status//// this method clears out CircularBuffer since we have no good// data.//boolean AudioFrontEnd::resetBuffer() {  // clear the component itself  //  coef_components_d.clear(Integral::RELEASE);  // clear the buffers, but don't delete them  //  buf_d.resetBuffer();    // reset flag  //  end_of_data_d = false;    // exit gracefully  //  return true;}// method: makeBuffers//// arguments://  SingleLinkedList<Component>& temp_list: (input) components to make buffer//  // return: a boolean value indicating status//// this method makes sure we have buffers for each of the needed data// elements in the given component list//boolean AudioFrontEnd::makeBuffers(SingleLinkedList<Component>& temp_list_a) {  // loop over all elements in the list  //  for (boolean more_nodes = temp_list_a.gotoFirst();       more_nodes;       more_nodes = temp_list_a.gotoNext()) {        Component* algo = temp_list_a.getCurr();        buf_d.addOrInitBuffer(algo->getOutputName(), 1);  }  long nchan = 1;    // now add the inputs  //  if (!input_flag_d) {    buf_d.addOrInitBuffer(SAMPLED_DATA_NAME, nchan);  }  else if (audio_input_d.isOpen()) {    nchan = audio_input_d.getNumChannels();    if(channel_index_d != DEF_CHANNEL_INDEX) nchan = 1;        buf_d.addOrInitBuffer(SAMPLED_DATA_NAME, nchan);  }    else if (feature_input_d.isOpen()) {    String str(Recipe::INPUT_PREFIX);    str.concat(feature_input_d.getName());    nchan = feature_input_d.getNumChannels();    if(channel_index_d != DEF_CHANNEL_INDEX) nchan = 1;        buf_d.addOrInitBuffer(str, nchan);  }  buf_d.setLeftoverSamps(0);    // exit gracefully  //  return true;}// method: getNumFrames//// arguments: none//// return: a long number//// this method gets the number of frames//long AudioFrontEnd::getNumFrames() {  // get the number of inputs  //  double num_frames = 0;  long number_of_frames = 0;    if (!input_flag_d) {     num_frames = signal_duration_d / frame_duration_d;  }  else if (partial_process_d && (audio_input_d.isOpen())) {    num_frames = (double)audio_input_d.getNumSamples();    num_frames /= audio_input_d.getSampleFrequency();    if ((num_frames < end_time_d) ||	(end_time_d == DEF_END_TIME)) {      end_time_d = num_frames;    }    num_frames = end_time_d - start_time_d;    num_frames /= frame_duration_d;  }  else if (partial_process_d && (feature_input_d.isOpen())) {    num_frames = (double)end_time_d;    num_frames /= frame_duration_d;    long frames = (long)Integral::round(num_frames);    num_frames = frames - offset_frame_d;        if (num_frames > feature_input_d.getNumFrames()) {      num_frames =feature_input_d.getNumFrames() - offset_frame_d ;    }  }    else if (audio_input_d.isOpen()) {    num_frames = (double)audio_input_d.getNumSamples();    num_frames /= frame_duration_d;    num_frames /= audio_input_d.getSampleFrequency();  }  else if (feature_input_d.isOpen()) {    num_frames = feature_input_d.getNumFrames();  }  else {    return Error::handle(name(), L"getNumFrames", Error::ARG, __FILE__,			 __LINE__);  }  if (data_mode_d == AlgorithmBase::SAMPLE_BASED) {    number_of_frames = (long)Integral::ceil(num_frames);    // this code is ugly, but this is to make sure to eliminate the    // float point error when num_frames is exactly calculate to be    // integer    //    if ((double)number_of_frames - num_frames >= 0.8 &&	Integral::almostEqual((number_of_frames - num_frames), (double)1.0,			      0.1)) {      number_of_frames = number_of_frames - 1;    }  }  else {    number_of_frames = (long)Integral::round(num_frames);  }  if (debug_level_d >= Integral::DETAILED) {    Long((long)Integral::round(num_frames)).debug(L"num_frames");  }    return number_of_frames;}// method: setCoefName//// arguments://  const String& name: (input) name of desired feature//// return: a boolean value indicating status//// this method sets the coefficient name//boolean AudioFrontEnd::setCoefName(const String& name_a) {  // error check the name  //  if (name_a.firstChr(L'+') >= 0) {    return Error::handle(name(), L"setCoefName",			 Error::ARG, __FILE__, __LINE__);  }    // set the data  //  if (name_a.firstStr(Recipe::OUTPUT_PREFIX) == 0) {    coef_name_d.assign(name_a);  }  else {    coef_name_d.assign(Recipe::OUTPUT_PREFIX);    coef_name_d.concat(name_a);  }  buf_d.setCoefName(coef_name_d);    // first sort the graph and find the component  //  if (audio_input_d.isOpen() || (feature_input_d.isOpen())) {    processTarget();        if (debug_level_d >= Integral::DETAILED) {      coef_components_d.debug(L"delayed components");    }  }  // exit gracefully  //  return true;}// method: getNumFeatures//// arguments: none//// return: a long number//// this method gets the number of features after processing a certain// component//long AudioFrontEnd::getNumFeatures() {  // create a raw file to process a component  //  String tmp_filename0(L".to_get_features_rawfile.raw");  //  Integral::makeTemp(tmp_filename0);  AudioFile temp_audio;  temp_audio.setFileFormat(AudioFile::RAW);  temp_audio.setFileType(AudioFile::BINARY);    Filename temp(tmp_filename0);  if (!temp_audio.open(temp, File::WRITE_ONLY)) {    return Error::handle(name(), L"getNumFeatures", Error::ARG,			 __FILE__, __LINE__);  }    // set the seed  //  Random rand_01;  rand_01.seed(27);      long total_numbers = 1000;  // just using this number to create data  long total_dim = 5;  // set the dimension    Vector <VectorFloat> sampled_data(total_dim);  Float random = 1.0;  for (long j = 0; j < total_dim; j++) {    for (long i = 0; i < total_numbers; i++) {      sampled_data(j).setLength(total_numbers);      // take a random sample      //      random = rand_01.get() * 10.0;            sampled_data(j)(i).assign(random);    }  }  // write the data to a file  //  if (!temp_audio.writeAudioData(sampled_data)) {    return Error::handle(name(), L"getNumFeatures", Error::WRITE,			 __FILE__, __LINE__, Error::WARNING);  }  temp_audio.close();  open(tmp_filename0);    Vector<VectorFloat> data;    if (!getVector(data, 0)) {    return Error::handle(name(), L"getNumFeatures", ERR, __FILE__, __LINE__);  }  File::remove(tmp_filename0);    return (long)data(0).length();}

⌨️ 快捷键说明

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