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

📄 mask_05.cc

📁 这是一个从音频信号里提取特征参量的程序
💻 CC
字号:
// file: $isip/class/algo/Mask/mask_05.cc// version: $Id: mask_05.cc,v 1.12 2002/04/01 20:04:08 gao Exp $//// isip include files//#include "Mask.h"// method: apply//// arguments://  Vector<AlgorithmData>& output: (output) output data//  const Vector< CircularBuffer<AlgorithmData> >& input: (input) input data//// return: a boolean value indicating status//// this method calls the appropriate computation methods//boolean Mask::apply(Vector<AlgorithmData>& output_a,		    const Vector< CircularBuffer<AlgorithmData> >& input_a) {  // set the length to the number of channels input  //  long len = input_a.length();  output_a.setLength(len);  // accumulate a result status -- if compute method returns false  // this apply method should return false  //    boolean res = true;  // start the debugging output  //  displayStart(this);    // loop over the channels and call the compute method  //  for (long c = 0; c < len; c++) {    // display the channel number    //    displayChannel(c);        // call AlgorithmData::makeVectorFloat to force the output vector for    // this channel to be a VectorFloat, call AlgorithmData::getVectorFloat    // on the input for this channel to check that the input is    // already a VectorFloat and return that vector.    //    if (input_a(c)(0).getDataType() == AlgorithmData::VECTOR_FLOAT) {      res &= compute(output_a(c).makeVectorFloat(),		     input_a(c)(0).getVectorFloat());    }        else if (input_a(c)(0).getDataType() == AlgorithmData::VECTOR_COMPLEX_FLOAT) {            res &= compute(output_a(c).makeVectorComplexFloat(),		     input_a(c)(0).getVectorComplexFloat());    }    else {      return Error::handle(name(), L"apply", ERR_UNSUPA, __FILE__, __LINE__);    }              // set the coefficient type for the output    //        output_a(c).setCoefType(input_a(c)(0).getCoefType());  }  // finish the debugging output  //  displayFinish(this);    // exit gracefully  //  return res;}// method: compute//// arguments://  VectorFloat& output: (output) operand//  const VectorFloat& input: (input) operand//  AlgorithmData::COEF_TYPE input_coef_type: (input) type of input//  long index: (input) channel index//// return: a boolean value indicating status//// this method takes the mask of the single-channel input data// according to specified algorithm and implementation//boolean Mask::compute(VectorFloat& output_a, const VectorFloat& input_a,		      AlgorithmData::COEF_TYPE input_coef_type_a,		      long index_a) {  // local variable  //  boolean status = false;    // branch on algorithm:  //  algorithm: SELECT  //  if (algorithm_d == SELECT) {    // branch on implementation:    //  Implementation: INDEX    //    if (implementation_d == INDEX) {      status = computeSelectIndex(output_a, input_a);      }  }  // algorithm: REMOVE  //  else {    // branch on implementation:    //  Implementation: INDEX    //    if (implementation_d == INDEX) {      status = computeRemoveIndex(output_a, input_a);      }  }    // possibly display the data  //  display(output_a, input_a, name());    // exit gracefully  //  return status;}// method: compute//// arguments://  VectorComplexFloat& output: (output) output data//  const VectorComplexFloat& input: (input) input data//  AlgorithmData::COEF_TYPE input_coef_type: (input) type of input//  long index: (input) channel index//// return: a boolean value indicating status//// this method takes the mask of the single-channel complex input data// according to specified algorithm and implementation//boolean Mask::compute(VectorComplexFloat& output_a,		      const VectorComplexFloat& input_a,		      AlgorithmData::COEF_TYPE input_coef_type_a,		      long index_a) {  // delare local variables  //  static VectorFloat v_in_real;  static VectorFloat v_in_imag;  VectorFloat v_out_real;  VectorFloat v_out_imag;    boolean status = false;    // get the real part of the complex data  //  input_a.real(v_in_real);  // get the imaginary part of the complex data  //  input_a.imag(v_in_imag);    // call compute method for real vector  //  status = compute(v_out_real, v_in_real, input_coef_type_a);  // call compute method for imaginary vector  //  status = compute(v_out_imag, v_in_imag, input_coef_type_a);  // set the output values  //  for (long i = 0; i < input_a.length(); i++) {    output_a(i).assign(complexfloat(v_out_real(i), v_out_imag(i)));  }    // exit gracefully  //  return status;}// method: computeSelectIndex//// arguments://  VectorFloat& output: (output) operand//  const VectorFloat& input: (input) operand//// return: a boolean value indicating status//// this method takes the mask of the input using the SELECT algorithm.// it outputs those elements of input data, which are indicated in the// mask string, i.e., removes the elements which are not indicated by// string//boolean Mask::computeSelectIndex(VectorFloat& output_a,				 const VectorFloat& input_a) {  // declare local variable  //  VectorByte mask(mask_d);    // set the length of mask vector as same as input vector  //  long in_len = input_a.length();  long mask_len = mask.length();  mask.setLength(in_len, true);      // pad the mask vector with OFF's if mask length is smaller  // than input length  //  if (in_len > mask_len) {    for (long i = mask_len; i < in_len; i++) {      mask(i) = OFF;    }  }  // allocate space for output vector:  //  the number of preserved coefficients in output vector should be the sum  //  of the mask vector, i.e. the number of '1' elements in mask vector  //  output_a.setLength((long)((unsigned long)mask.sum()));    // output the masked elements in input vector for which mask flags  // correspond to ON  //  for (long i = 0, j = 0; i < mask.length(); i++) {    if (mask(i) == ON) {      output_a(j++) = input_a(i);    }  }    // exit gracefully  //  return true;}// method: computeRemoveIndex//// arguments://  VectorFloat& output: (output) operand//  const VectorFloat& input: (input) operand//// return: a boolean value indicating status//// this method takes the mask of the input using REMOVE algorithm. it// removes those elements, which are indicated in the mask string, and// outputs the remaining elements of the input data.//boolean Mask::computeRemoveIndex(VectorFloat& output_a,				 const VectorFloat& input_a) {  // declare local variable  //  VectorByte mask(mask_d);    // set the length of mask vector as same as input vector  //  long in_len = input_a.length();  long mask_len = mask.length();  mask.setLength(in_len, true);    // pad the mask vector with OFF's if mask length is smaller than input  // length  //  if (in_len > mask_len) {    for (long i = mask_len; i < in_len; i++) {      mask(i) = OFF;    }  }  // allocate space for output vector:  //  the number of preserved coefficients in output vector should be  //  the number of 'OFF' elements in mask vector, i.e. the length of  //  mask vector minus the number of 'ON' elements in mask vector  //  output_a.setLength(in_len - (long)(unsigned long)mask.sum());    // output the masked elements in input vector for which mask flags  // correspond to 0  //  for (long i = 0, j = 0; i < mask.length(); i++) {    if (mask(i) == OFF) {      output_a(j++) = input_a(i);    }  }  // exit gracefully  //  return true;}

⌨️ 快捷键说明

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