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

📄 splt_05.cc

📁 这是一个从音频信号里提取特征参量的程序
💻 CC
字号:
// file: $isip/class/asr/Splitter/splt_05.cc// version: $Id: splt_05.cc,v 1.6 2002/09/25 00:20:30 alphonso Exp $//// isip include files//#include "Splitter.h"// method: assign//// arguments://   Splitter& arg: (input) Splitter object//// return: logical error status//// this method assigns the input object top the current object//boolean Splitter::assign(const Splitter& arg_a) {  // assign input object to the current object  //  mdb_d.assign(arg_a.mdb_d);    // exit gracefully  //  return true;}// method: clear//// arguments://   Integral::CMODE cmode: (input) clear mode//// return: logical error status//// this method assigns the input object top the current object//boolean Splitter::clear(Integral::CMODE cmode_a) {  // clear the member data  //  mdb_d.clear(cmode_a);    // exit gracefully  //  return true;  }// method: eq//// arguments://   Splitter& arg: (input) Splitter object//// return: logical error status//// this method determines if the input object is equal to the current object//boolean Splitter::eq(const Splitter& arg_a) const {  // check if the machine databases arg the same  //    if(!mdb_d.eq(arg_a.mdb_d)) {     return false;  }    // exit gracefully  //  return true;  }// method: createUtterLists//// arguments://   Filename& identifier_file: (input) identifier file//   Filename& identifier_list: (input) identifier list name//   Filename& machine_list: (input) machine list name//   Filename& accumulator_list: (input) accumulator list name//   Vector<SingleLinkedList<Filename> >& items: (input) divided utterances//   Vector<Filename>& identifiers_lookup: (output) identifiers//   Vector<Machines>& machine_lookup: (output) machines//   Vector<Filename>& accumulator_lookup: (output) accumulators//// return: logical error status//// this method writes the divided utterance lists to file//boolean Splitter::createUtterLists(Filename& identifier_file_a,				 Filename& identifier_list_a,				 Filename& machine_list_a,				 Filename& accumulator_list_a,				 Vector<SingleLinkedList<Filename> >& items_a,				 Vector<Filename>& identifier_lookup_a,				 Vector<Machine>& machine_lookup_a,				 Vector<Filename>& accumulator_lookup_a) {  // declare local variables  //  String file_dir;  String file_base;  String tmp_file;  String file_prefix;    Sdb machines;  Sdb identifiers;    Sdb accumulators;    String output;  String machine_name;    Filename curr_machine;  Filename curr_identifier;      Filename curr_accumulator;    // read in the machine list  //  Sof machine_sof;  if (machine_sof.open(machine_list_a)) {    if (!machines.read(machine_sof, (long)0)) {      Error::handle(name(), L"createUtterLists - unable to read machine list", Error::ARG, __FILE__, __LINE__);            return false;    }    machine_sof.close();  }  else {      Error::handle(name(), L"createUtterLists - unable to open machine list", Error::ARG, __FILE__, __LINE__);              return false;  }  // read in the identifiers list  //  Sof identifier_sof;  if (identifier_sof.open(identifier_list_a)) {    if (!identifiers.read(identifier_sof, (long)0)) {      Error::handle(name(), L"createUtterLists - unable to read machine list", Error::ARG, __FILE__, __LINE__);            return false;    }    identifier_sof.close();  }  else {      Error::handle(name(), L"createUtterLists - unable to open machine list", Error::ARG, __FILE__, __LINE__);              return false;  }    // read in the accumulator list  //  Sof accumulator_sof;  if (accumulator_sof.open(accumulator_list_a)) {    if (!accumulators.read(accumulator_sof, (long)0)) {      Error::handle(name(), L"createUtterLists - unable to read accumulator list", Error::ARG, __FILE__, __LINE__);      return false;    }    accumulator_sof.close();  }  else {    Error::handle(name(), L"createUtterLists - unable to open accumulator list", Error::ARG, __FILE__, __LINE__);    return false;  }    // set the lengths of the lookup lists  //  long num_machines = machines.length();  if (num_machines != accumulators.length()) {    return Error::handle(name(), L"createUtterLists - mismatch in the number of machines and accumulators", Error::ARG, __FILE__, __LINE__);  }  if (num_machines != identifiers.length()) {    return Error::handle(name(), L"createUtterLists - mismatch in the number of machines and accumulators", Error::ARG, __FILE__, __LINE__);  }      identifier_lookup_a.setLength(num_machines);      machine_lookup_a.setLength(num_machines);  accumulator_lookup_a.setLength(num_machines);  // loop over each accumulator in the accumulator list  //  long index = 0;  for (accumulators.gotoFirst(); accumulators.getName(curr_accumulator);       accumulators.gotoNext()) {    // create a fast lookup mechanism for the accumulator names    //    accumulator_lookup_a(index++).assign(curr_accumulator);  }  // loop over each identifier in the identifier list  //  index = 0;  for (identifiers.gotoFirst(); identifiers.getName(curr_identifier);       identifiers.gotoNext()) {    // create a fast lookup mechanism for the identifier names    //    identifier_lookup_a(index++).assign(curr_identifier);  }      // loop over each machine in the machine list  //  index = 0;  for (machines.gotoFirst(); machines.getName(curr_machine);       machines.gotoNext()) {    // create a fast lookup mechanism for the machine names    //    machine_name.assign(curr_machine);    // look up the attributes for the machine in the database    //    if (!mdb_d.get(machine_name, machine_lookup_a(index++))) {      machine_lookup_a(index - 1).setNodeName(machine_name);      output.assign(L"cannot find attributes for machine: ");      output.concat(machine_name);      output.concat(L" using default values");            Console::put(output);    }  }  // loop over each of the divided machine lists  //  for (long i=0; i < (long)items_a.length(); i++) {    // loop over each utterance in the current machine list - append to the sdb    //    Sdb output_sdb;    for (boolean more=items_a(i).gotoFirst(); more;	 more=items_a(i).gotoNext()) {      output_sdb.append(*(items_a(i).getCurr()));    }    Sof tmp_sof;    if (tmp_sof.open(identifier_lookup_a(i), File::WRITE_ONLY)) {      if (!output_sdb.write(tmp_sof, (long)0)) {	return Error::handle(name(), L"createUtterLists", Error::ARG, __FILE__, __LINE__);      }      tmp_sof.close();    }    else {      return Error::handle(name(), L"createUtterLists", Error::ARG, __FILE__, __LINE__);    }  }    // exit gracefully  //  return true;}// method: divideAndConquer//// arguments://   Filename& identifier_file: (input) list of identifiers//   Filename& machine_list: (input) list of machine names//   Vector<SingleLinkedList<Filename> >& items: (input) split identifiers//// return: logical error status//// this method divides the identifier list based on the machine list//boolean Splitter::divideAndConquer(Filename& identifier_file_a,				Filename& machine_list_a,				Vector<SingleLinkedList<Filename> >& items_a) {  // declare local variables  //  Sdb machines;  Sdb identifiers;  Filename input_machine;  Filename input_identifier;    long index = 0;  double accum = 0.0;  String machine_name;  Machine tmp_machine;  boolean flag = true;      // read in the machine list  //  Sof machine_sof;  if (machine_sof.open(machine_list_a)) {    if (!machines.read(machine_sof, (long)0)) {      Error::handle(name(), L"divideAndConquer - unable to open machine list", Error::ARG, __FILE__, __LINE__);      return false;    }    machine_sof.close();  }  else {    Error::handle(name(), L"divideAndConquer - machine list is empty", Error::ARG, __FILE__, __LINE__);    return false;  }    // read in the identifier list  //  Sof identifier_sof;  if (identifier_sof.open(identifier_file_a)) {    if (!identifiers.read(identifier_sof, (long)0)) {      Error::handle(name(), L"divideAndConquer - unable to open identifier list", Error::ARG, __FILE__, __LINE__);      return false;    }    identifier_sof.close();  }  else {    Error::handle(name(), L"divideAndConquer - identifier list is empty", Error::ARG, __FILE__, __LINE__);    return false;  }         // get the number of machines in the list  //    long num_machines = machines.length();  if (num_machines < 1) {    Error::handle(name(), L"divideAndConquer - machine list is empty", Error::ARG, __FILE__, __LINE__);    return false;  }    // set the length of the input list  //    items_a.setLength(num_machines);  // split mode: NONE  //  if (split_mode_d == NONE) {    // loop over each file in the identifier list    //    index = 0;    for (identifiers.gotoFirst(); identifiers.getName(input_identifier);	 identifiers.gotoNext()) {      // add the identifier to the input list      //      if (!items_a(index % num_machines).insertLast(&input_identifier)) {	return Error::handle(name(), L"divideAndConquer", Error::ARG, __FILE__, __LINE__);      }      index++;    }  }  // split mode: SPEED  //    else if (split_mode_d == SPEED) {    // initialize the random number generator    //    srand48((long)27);    // initialize the vector that represents the machine frequencies    //    VectorDouble freq(num_machines);    // loop over all machines names in the machine list    //    for (machines.gotoFirst(); machines.getName(input_machine);	 machines.gotoNext()) {      // retrieve the current machine name      //      machine_name.assign(input_machine);      // retrieve the current machine attributes form the database      //      if (!mdb_d.get(machine_name, tmp_machine)) {	// when the machine attributes are not present use defaults	//	accum += Machine::DEF_PROCESSOR_SPEED;	freq(index++) = Machine::DEF_PROCESSOR_SPEED;      }      else {	// retrieve the machine attributes form the database	//	VectorDouble psr_speed = tmp_machine.getProcessorSpeed();	if (psr_speed.length() == 0) {	  machine_name.debug(L"machine");	  return Error::handle(name(), L"divideAndConquer - unable to retrieve processor speed form the database", Error::ARG, __FILE__, __LINE__);	}	accum += psr_speed(0);	freq(index++) = psr_speed(0);	      }    }    // compute the frequency    //    freq.div(accum);    // loop over each file in the identifier list    //    index = 0;    for (identifiers.gotoFirst(); identifiers.getName(input_identifier);	 identifiers.gotoNext()) {      flag = true;            // add the identifier to the input list      //      while (flag) {		double value = drand48();	if (value < freq(index % num_machines)) {	  if (!items_a(index % num_machines).insertLast(&input_identifier)) {	    return Error::handle(name(), L"divideAndConquer", Error::ARG, __FILE__, __LINE__);	  }	  flag = false;	}	index++;      }    }      }  // split mode: MEMORY  //  else if (split_mode_d == MEMORY) {    return Error::handle(name(), L"divideAndConquer - mode not implemented", Error::ARG, __FILE__, __LINE__);  }  // split mode: UNKNOWN  //        else {    return Error::handle(name(), L"divideAndConquer", Error::ARG, __FILE__, __LINE__);  }    // exit gracefully  //  return true;  }

⌨️ 快捷键说明

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