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

📄 filt_00.cc

📁 这是一个从音频信号里提取特征参量的程序
💻 CC
字号:
// file: $isip/class/algo/Filter/filt_00.cc// version: $Id: filt_00.cc,v 1.16 2002/05/31 21:57:26 picone Exp $//// isip include files//#include "Filter.h"//------------------------------------------------------------------------//// required public methods////-----------------------------------------------------------------------// method: default constructor//// arguments://  ALGORITHM algorithm: (input) algorithm used in filter//// return: none//Filter::Filter(ALGORITHM algorithm_a) {    // initialize parameters related to filtering  //  algorithm_d = algorithm_a;  implementation_d = DEF_IMPLEMENTATION;    setMACoeffs(DEF_MA_COEF, DEF_MA_LAG);  setARCoeffs(DEF_AR_COEF, DEF_AR_LAG);}// method: copy constructor//// arguments://  const Filter& arg: (input) filter object//// return: none//Filter::Filter(const Filter& arg_a) {  // copy the data  //  if (!assign(arg_a)) {    Error::handle(name(), L"copy constructor", Error::MEM, __FILE__, __LINE__);  }  // initialize the filter  //  init();}// method: assign//// arguments://  const Filter& arg: (input) object to be assigned//// return: a boolean value indicating status//// this method assigns the input object to the current object//boolean Filter::assign(const Filter& arg_a) {  // assign lags  //  ma_lag_d.assign(arg_a.ma_lag_d);  ar_lag_d.assign(arg_a.ar_lag_d);  // assign coefficients  //  ma_coef_d.assign(arg_a.ma_coef_d);  ar_coef_d.assign(arg_a.ar_coef_d);  // assign calculation buffers  //  ma_mem_d.assign(arg_a.ma_mem_d);  ar_mem_d.assign(arg_a.ar_mem_d);  // assign algorithm and implementation  //  algorithm_d = arg_a.algorithm_d;  implementation_d = arg_a.implementation_d;  // assign valid flag  //  is_valid_d = arg_a.is_valid_d;  // call the base assign method  //  return AlgorithmBase::assign(arg_a);}// method: eq//// arguments://  const Filter& arg: (input) object to be compared//// return: a boolean value indicating status//// this method checks whether the current object is identical to the// input object//boolean Filter::eq(const Filter& arg_a) const {  // check all the coefficients  //  return (ar_lag_d.eq(arg_a.ar_lag_d) &&	  ma_lag_d.eq(arg_a.ma_lag_d) &&	  ar_coef_d.eq(arg_a.ar_coef_d) &&	  ma_coef_d.eq(arg_a.ma_coef_d));}// method: clear//// arguments://  Integral::CMODE ctype: (input) clear mode//// return: a boolean value indicating status//// this method resets the data members to the default values//boolean Filter::clear(Integral::CMODE ctype_a) {  if (ctype_a == Integral::RETAIN) {    // keep the parameters but clear the internal memory    //    ma_mem_d.clear(ctype_a);    ar_mem_d.clear(ctype_a);  }  else {        // reset the parameters related to the Filter    //    ar_coef_d.clear(ctype_a);    ma_coef_d.clear(ctype_a);    ar_lag_d.clear(ctype_a);    ma_lag_d.clear(ctype_a);    ma_mem_d.clear(ctype_a);    ar_mem_d.clear(ctype_a);  }    // call the base clear method  //  return AlgorithmBase::clear(ctype_a);}//---------------------------------------------------------------------------//// class-specific public methods://  public methods required by the AlgorithmBase interface contract////---------------------------------------------------------------------------// method: assign//// arguments://  const AlgorithmBase& arg: (input) object to be assigned//// return: a boolean value indicating status//// this method assigns the input algorithm object to the current// Filter object, if the input algorithm object is not a Filter// object, it returns an error//boolean Filter::assign(const AlgorithmBase& arg_a) {  if (typeid(arg_a) == typeid(Filter)) {    return assign((Filter&)arg_a);  }  else {    return Error::handle(name(), L"assign", Error::ARG, __FILE__, __LINE__);  }}// method: eq//// arguments://  const AlgorithmBase& arg: (input) object to be compared//// return: a boolean value indicating status//// this method checks whether the current Filter object is identical// to the input algorithm object, if the input algorithm object is not// a Filter object, it returns an error//boolean Filter::eq(const AlgorithmBase& arg_a) const {  if (typeid(arg_a) == typeid(Filter)) {    return eq((Filter&)arg_a);  }  else {    return Error::handle(name(), L"eq", Error::ARG, __FILE__, __LINE__);  }}// method: init// // arguments: none//// return: a boolean value indicating status//boolean Filter::init() {  // check for duplicity of ma lags  //  long ma_lag_len = ma_lag_d.length();  for (long i = 0; i < ma_lag_len - 1; i++) {    for (long j = i + 1; j < ma_lag_len; j++) {      if (ma_lag_d(i) == ma_lag_d(j)) {	return Error::handle(name(), L"init", Error::ARG, __FILE__, __LINE__);      }    }  }  // check for duplicity of ar lags  //  long ar_lag_len = ar_lag_d.length();  for (long i = 0; i < ar_lag_len - 1; i++) {    for (long j = i + 1; j < ar_lag_len; j++) {      if (ar_lag_d(i) == ar_lag_d(j)) {	return Error::handle(name(), L"init", Error::ARG, __FILE__, __LINE__);      }    }  }  // ar lags can't be in present or future  //  for (long index = 0; index < ar_lag_len; index++) {    if ((long)ar_lag_d(index) >= (long)0) {      return Error::handle(name(), L"init", ERR_AR_LAG, __FILE__, __LINE__);    }  }    // check for degenerate cases  //  if (ma_coef_d.length() == 0) {    ma_coef_d.setLength(1);    ma_coef_d(0) = 1.0;  }  if (ar_coef_d.length() == 0) {    ar_coef_d.setLength(1);      ar_coef_d(0) = 0;  }    // calculate the delays required  //  Long ma_min = ma_lag_d.min();  Long ma_max = ma_lag_d.max();  // check for FIR case when the ar coeff. length is zero  //  Long ar_min = (long)0;  if (ar_lag_d.length() != (long)0) {    ar_min = ar_lag_d.min();  }    if (ma_max < (long)0) {    ma_max = (long)0;  }    if (ma_min > (long)0) {    ma_min = (long)0;  }  long ma_mem_len = ma_max - ma_min + 1;  long ar_mem_len = ar_min.neg();  // create space for each channel  //  ma_mem_d.setLength(num_channels_d);  ar_mem_d.setLength(num_channels_d);    // size the delay lines  //  for (long nchan = 0; nchan < num_channels_d; nchan++) {    ma_mem_d(nchan).setLength(ma_mem_len);    ma_mem_d(nchan).clear(Integral::RETAIN);    // set the length for ar delay line only if it is non-zero    //    if (ar_mem_len > (long)0) {    ar_mem_d(nchan).setLength(ar_mem_len);    ar_mem_d(nchan).clear(Integral::RETAIN);    }  }    // set the initialization flag  //  is_valid_d = true;    // exit gracefully  //  return true;}//-----------------------------------------------------------------------------//// we define non-integral constants in the default constructor//      //-----------------------------------------------------------------------------// constants: class name//const String Filter::CLASS_NAME(L"Filter");// constants: i/o related constants//const String Filter::DEF_PARAM(L"");const String Filter::PARAM_ALGORITHM(L"algorithm");const String Filter::PARAM_IMPLEMENTATION(L"implementation");const String Filter::PARAM_MA_COEF(L"ma_coef");const String Filter::PARAM_AR_COEF(L"ar_coef");const String Filter::PARAM_MA_LAG(L"ma_lag");const String Filter::PARAM_AR_LAG(L"ar_lag");const String Filter::PARAM_CMODE(L"compute_mode");const String Filter::PARAM_DMODE(L"data_mode");// constants: default values of the class data//const VectorFloat Filter::DEF_MA_COEF(L"1");const VectorFloat Filter::DEF_AR_COEF(L"0");const VectorLong Filter::DEF_MA_LAG(L"0");const VectorLong Filter::DEF_AR_LAG(L"-1");// constants: NameMap(s) for the enumerated values//const NameMap Filter::ALGO_MAP(L"LTI");const NameMap Filter::IMPL_MAP(L"CCDE");// static instantiations: memory manager//MemoryManager Filter::mgr_d(sizeof(Filter), Filter::name());

⌨️ 快捷键说明

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