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

📄 math_05.cc

📁 这是一个从音频信号里提取特征参量的程序
💻 CC
字号:
// file: $isip/class/algo/Math/math_05.cc// version: $Id: math_05.cc,v 1.17 2002/04/01 20:04:13 gao Exp $//// isip include files//#include "Math.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 selects the appropriate input and output data types// and produces following output://  y = [a(0) * function(0)(X(0))] operation(0) [a(1) * function(1)(X(1))]  ..//      ... + const,//boolean Math::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);        // use output_a directly for this channel to be a AlgorithmData    // type, and use input for this channel to be a vector <AlgorithmData>    //              if (input_a(c)(0).getDataType() == AlgorithmData::COMBINATION) {      res &= compute(output_a(c), input_a(c)(0).getCombination());    }    // check for single vector value    else if (input_a(c)(0).getDataType() == AlgorithmData::VECTOR_FLOAT) {      Vector <AlgorithmData> temp;      temp.setLength(1);      temp(0).makeVectorFloat().assign(input_a(c)(0).getVectorFloat());      res &= compute(output_a(c), temp);    }    else if (input_a(c)(0).getDataType() == AlgorithmData::VECTOR_DOUBLE) {      Vector <AlgorithmData> temp;      temp.setLength(1);      temp(0).makeVectorDouble().assign(input_a(c)(0).getVectorDouble());      res &= compute(output_a(c), temp);    }    else if (input_a(c)(0).getDataType() == AlgorithmData::VECTOR_COMPLEX_FLOAT) {      Vector <AlgorithmData> temp;      temp.setLength(1);      temp(0).makeVectorComplexFloat().assign(input_a(c)(0).getVectorComplexFloat());      res &= compute(output_a(c), temp);    }    else if (input_a(c)(0).getDataType() == AlgorithmData::VECTOR_COMPLEX_DOUBLE) {      Vector <AlgorithmData> temp;      temp.setLength(1);      temp(0).makeVectorComplexDouble().assign(input_a(c)(0).getVectorComplexDouble());      res &= compute(output_a(c), temp);    }    else if (input_a(c)(0).getDataType() == AlgorithmData::MATRIX_FLOAT) {      Vector <AlgorithmData> temp;      temp.setLength(1);      temp(0).makeMatrixFloat().assign(input_a(c)(0).getMatrixFloat());      res &= compute(output_a(c), temp);    }    else if (input_a(c)(0).getDataType() == AlgorithmData::MATRIX_DOUBLE) {      Vector <AlgorithmData> temp;      temp.setLength(1);      temp(0).makeMatrixDouble().assign(input_a(c)(0).getMatrixDouble());      res &= compute(output_a(c), temp);    }    else if (input_a(c)(0).getDataType() == AlgorithmData::MATRIX_COMPLEX_FLOAT) {      Vector <AlgorithmData> temp;      temp.setLength(1);      temp(0).makeMatrixComplexFloat().assign(input_a(c)(0).getMatrixComplexFloat());      res &= compute(output_a(c), temp);    }    else if (input_a(c)(0).getDataType() == AlgorithmData::MATRIX_COMPLEX_DOUBLE) {      Vector <AlgorithmData> temp;      temp.setLength(1);      temp(0).makeMatrixComplexDouble().assign(input_a(c)(0).getMatrixComplexDouble());      res &= compute(output_a(c), temp);    }     else {      return Error::handle(name(), L"apply", ERR_UNSUPA, __FILE__, __LINE__);    }        // note that the output coefficient type is set in the compute    // method since it has to use multiple inputs    //  }    // finish the debugging output  //  displayFinish(this);    // exit gracefully  //  return res;  }// method: compute//// arguments://  AlgorithmData& output: (output) output data//  const Vector<AlgorithmData>& 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 produces following output://// y = [a(0) * function(0)(X(0))] operation(0) [a(1) * function(1)(X(1))]  ..//      ... + const//// where,////  function(i) = specified function (EXP, EXP2, LOG, ...)//  operation(i) = specified operation (ADD, SUBTRACT, ...)//  X(i) = input operand (matrix, vector or scalar)//  a(i) = specified weight//  const = constant additive term//boolean Math::compute(AlgorithmData& output_a,		      const Vector<AlgorithmData>& input_a,		      AlgorithmData::COEF_TYPE input_coef_type_a,		      long index_a) {  // declare local variables  //  boolean status = false;    // branch on algorithm, call compute methods:  //  function calculator algorithm  //  if (algorithm_d == FUNCTION_CALCULATOR) {    status = computeFuncCalcEnumerate(output_a, input_a);  }    // determine the output type  //  AlgorithmData::COEF_TYPE ctype = input_a(0).getCoefType();  for (long i = 1; i < input_a.length(); i++) {    if (input_a(i).getCoefType() != ctype) {      ctype = AlgorithmData::GENERIC;      break;    }  }  // set the output coefficient type  //  output_a.setCoefType(ctype);    // possibly display the data  //  display(output_a, input_a, name());    // exit gracefully  //  return status;}// method: computeFuncCalcEnumerate//// arguments://  AlgorithmData& output: (output) output data//  const Vector<AlgorithmData>& input: (input) input data//// return: a boolean value indicating status//// this method implements following function://   Y = operation(0) {a(0)*function(0)(X(0))} operation(1)//   {a(1)*function(1)(X(1))} operation(2) {a(2)*function(2)(X(2))}...//   ... + const,// where X(0), X(1), ... are the parts of input AlgorithmData splitted// by number of operands. These can be VectorFloat or MatrixFloat. If// user wants to implement this for scalar or single vector, then// number of operands will be 1. For scalar input the length of the// input vector will be 1.//boolean Math::computeFuncCalcEnumerate(AlgorithmData& output_a,				       const Vector<AlgorithmData>& input_a) {  // check algorithm and implementation names  //  if ((algorithm_d != FUNCTION_CALCULATOR) ||      (implementation_d != ENUMERATE)) {    return Error::handle(name(), L"computeFuncCalcEnumerate", Error::ARG,                         __FILE__, __LINE__);  }  if (input_a(0).getDataType() == AlgorithmData::VECTOR_FLOAT ||      input_a(0).getDataType() == AlgorithmData::MATRIX_FLOAT) {    computeFuncCalcEnumerateFloat(output_a, input_a);  }    else if (input_a(0).getDataType() == AlgorithmData::VECTOR_DOUBLE ||	   input_a(0).getDataType() == AlgorithmData::MATRIX_DOUBLE) {    computeFuncCalcEnumerateDouble(output_a, input_a);  }    else if (input_a(0).getDataType() == AlgorithmData::VECTOR_COMPLEX_FLOAT ||	   input_a(0).getDataType() == AlgorithmData::MATRIX_COMPLEX_FLOAT) {    computeFuncCalcEnumerateCFloat(output_a, input_a);  }    else if (input_a(0).getDataType() == AlgorithmData::VECTOR_COMPLEX_DOUBLE ||	   input_a(0).getDataType() == AlgorithmData::MATRIX_COMPLEX_DOUBLE) {    computeFuncCalcEnumerateCDouble(output_a, input_a);  }    else {    return Error::handle(name(), L"computeFuncCalcEnumerate",			 ERR_FNDTYP, __FILE__, __LINE__);  }    // exit gracefully  //  return true;}

⌨️ 快捷键说明

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