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

📄 mask_06.cc

📁 这是一个从音频信号里提取特征参量的程序
💻 CC
字号:
// file: $isip/class/algo/Mask/mask_06.cc// version: $Id: mask_06.cc,v 1.8 2001/12/21 19:43:18 gao Exp $//// isip include files//#include "Mask.h"// method: set//// arguments://  const String& source: (input) mask string//// return: a boolean value indicating status//// this method converts a string into a mask vector//boolean Mask::set(const String& source_a) {  // count the number of sub-strings separated by ','  //  long tokens = source_a.countTokens(L',');  // get all the sub-strings separated by ','  //  String vals[tokens];  for (long i = 0, pos = 0; i < tokens; i++) {    source_a.tokenize(vals[i], pos, L",");  }  // compute the number of all the digits in input string  //  long num = 0;  for (long i = 0; i < tokens; i++) {    num += vals[i].countTokens(L'-');  }  // allocate the space for these digits  //  VectorLong vec(num);  // declare the local variables  //  long k;  long key = 0;  String str[2];  long val1 = 0;  long val2 = 0;  // loop through all the sub-strings  //  for (long i = 0; i < tokens; i++) {    k = vals[i].countTokens(L'-');    // input a range of the masked 1's    //    if (k == 2) {      long pos = 0;      vals[i].tokenize(str[0], pos, L'-');      vals[i].tokenize(str[1], pos, L'-');            str[0].get(val1);      vec(key++) = val1;      str[1].get(val2);      vec(key++) = val2;    }    // input a single mask flag 1    //    else if (k == 1) {      vals[i].get(val1);      vec(key++) = val1;    }        else {      return Error::handle(name(), L"set", Error::ARG, __FILE__, __LINE__);    }  }  // allocate space  //  mask_d.setLength(vec.max() + 1);  // pad with all OFF's  //  mask_d.assign((byte)OFF);    // loop through all the sub-strings  //  for (long i = 0; i < tokens; i++) {    k = vals[i].countTokens(L'-');    long pos = 0;        // a range of masked ON's    //    if (k == 2) {      vals[i].tokenize(str[0], pos, L'-');      vals[i].tokenize(str[1], pos, L'-');	      str[0].get(val1);      str[1].get(val2);            // put the preserved mask flag ON's      //      if (val1 > val2) {	insert(mask_d, val2, val1 - val2 + 1, ON);      }      else if (val1 < val2) {	insert(mask_d, val1, val2 - val1 + 1, ON);      }    }        // k = 1: single index    //    else if (k == 1) {      vals[i].get(val1);      mask_d(val1) = ON;    }    else {      return Error::handle(name(), L"set", Error::ARG,			   __FILE__, __LINE__);    }  }  // assign the mask string  //  source_d.assign(source_a);    // exit gracefully  //  return true;}// method: set//// arguments://  const VectorByte& mask: (input) mask vector//// return: a boolean value indicating status//// this method sets the mask and converts it into a mask string//boolean Mask::set(const VectorByte& mask_a) {  // set the mask  //  mask_d.assign(mask_a);  // convert to a string  //  return convert(source_d, mask_d);}// method: convert//// arguments://  String& out: (output) mask string//  const VectorByte& in: (input) mask vector//// return: a boolean value indicating status//// this method converts a byte-oriented mask to a string//boolean Mask::convert(String& out_a, const VectorByte& in_a) {  // clear the output and determine the length of the input  //  out_a.clear();  long len = in_a.length();  // define our state machine  //  enum STATE {ZERO, ONE};  STATE state = ZERO;  boolean first = true;  // keep track of the number of 1's in a row  //  long cur_len = 0;    // the loop variable is kept outside the scope of the loop so we can  // use it at the end  //  long index;  for (index = 0; index < len; index++) {    // detect a change from zero to one    //    if ((state == ZERO) && (in_a(index) != OFF)) {      state = ONE;      // for all but the first output we need a delimiter      //      if (first) {	first = false;      }      else {	out_a.concat(L",");      }      out_a.concat(index);      cur_len = 1;    }    // for state 1, either increment the count if we get another ON or    // transition to state 0 if we get a OFF.    //    else if (state == ONE) {      if (in_a(index) == ON) {	cur_len++;      }      // detect a change from one to zero      //      else {	state = ZERO;	// if there was more than one ON in a row we need to output the range	//	if (cur_len > 1) {	  out_a.concat(L"-");	  out_a.concat(index - 1);	}      }    }  }  // if there was more than one ON in a row at the end we need to  // output the range  //  if ((state == ONE) && (cur_len > 1)) {    out_a.concat(L"-");    out_a.concat(index - 1);  }  // exit gracefully  //  return true;}// method: insert//// arguments://  VectorByte& mask: (input/output) mask vector//  long start_index: (input) start index//  long num_elem: (input) number of elements//  byte mode: (input) byte mode (0 or, 1)//// return: a boolean value indicating status//// this method inserts given byte mode (OFF or ON) in mask vector//boolean Mask::insert(VectorByte& mask_a, long start_index_a, long num_elem_a,		     byte mode_a) {  long len = mask_a.length();  long end_index = start_index_a + num_elem_a;    // check the argument  //  if (end_index > len) {    return Error::handle(name(), L"insert", Error::ARG, __FILE__, __LINE__);  }  for (long i = start_index_a; i < end_index; i++) {    mask_a(i) = mode_a;  }    // exit gracefully  //  return true;}

⌨️ 快捷键说明

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