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

📄 mm_07.cc

📁 这是一个从音频信号里提取特征参量的程序
💻 CC
字号:
// file: $isip/class/stats/MixtureModel/mm_07.cc// version: $Id: mm_07.cc,v 1.4 2001/12/26 22:32:51 alphonso Exp $//// isip include files//#include "MixtureModel.h"// method: add//// arguments://  StatisticalModelBase& ptr: (input) pointer//// return: a boolean value indicating status//// add models to models_d//boolean MixtureModel::add(StatisticalModelBase& ptr_a) {  // declare statistical model  //  StatisticalModel m;  // assign input pointer to StatisticalModel  //  m.assign(ptr_a);  // set the mode of the model  //  m.setMode(mode_d);    // add StatisticalModel to list  //  models_d.insert(&m);          // exit gracefully  //  return true;}// method: setModels//// arguments://  SingleLinkedList<StatisticalModel>& ptr: (input) pointer//// return: a boolean value indicating status//// replace models_d with the input//boolean MixtureModel::setModels(SingleLinkedList<StatisticalModel>& ptr_a) {  // assign the models  //  models_d.assign(ptr_a);  // set each model to be in the compute mode that we are in  //  for (boolean more_models = models_d.gotoFirst();       more_models; more_models = models_d.gotoNext()) {        models_d.getCurr()->setMode(mode_d);  }  // exit gracefully  //  is_valid_d = false;  return true;}// method: setWeights//// arguments://  const VectorFloat& arg: (input) vector of weights//// return: a boolean value indicating status//// this method sets the weight for each mixture//boolean MixtureModel::setWeights(const VectorFloat& arg_a) {  // set the weight  //  weights_d.assign(arg_a);  // exit gracefully  //  is_valid_d = false;  return true;}// method: setMode//// arguments://  MODE arg: (input) mode to set//// return: a boolean value indicating status//// this method sets the computation mode//boolean MixtureModel::setMode(MODE arg_a) {  // set computation mode of all the models in list  //  for (boolean more_models = models_d.gotoFirst();       more_models; more_models = models_d.gotoNext()) {    models_d.getCurr()->setMode(arg_a);  }  // change the weights if necessary  //  if ((mode_d == PRECOMPUTE) && (is_valid_d)) {    weights_d.exp();  }    // force reinitialization  //  is_valid_d = false;  mode_d = arg_a;  // exit gracefully  //  return true;}// method: init//// arguments: none//// return: a boolean value indicating status//// this method precomputes the necessary data for fast computation//boolean MixtureModel::init() {  // if we are not in the precompute mode, we don't need to do anything.  //  if (mode_d != PRECOMPUTE) {    is_valid_d = true;    return true;  }  // if the data are valid, we also don't need to do anything.  //  else if (is_valid_d) {    return true;  }  // check the arguments  //  long len = weights_d.length();  if (len <= 0) {    is_valid_d = false;    return false;  }         // init all the models in list  //  for (boolean more_models = models_d.gotoFirst();       more_models; more_models = models_d.gotoNext()) {    models_d.getCurr()->init();  }  // convert to natural log scaling  //  weights_d.log();    // exit gracefully  //  return (is_valid_d = true);}// method: getWeights//// arguments://  VectorFloat& weights: (output) output weight vector//// return: a boolean value indicating status//// this method gives the weights of the Mixture model//boolean MixtureModel::getWeights(VectorFloat& weights_a) const {  // if the weights have not been initialized, return them  //  if ((mode_d == NONE) ||      ((mode_d == PRECOMPUTE) && (!is_valid_d))) {    return weights_a.assign(weights_d);  }  // else: convert  //  else {    return weights_a.exp(weights_d);  }}// method: isNormalized//// arguments://  float norm: (input) the value that the weights should sum to//// return: true if the weights sum up to 'norm', false otherwise//// this method determines if the weights are normalized to a certain 'norm'// value//boolean MixtureModel::isNormalized(float norm_a) const {  if ((mode_d == NONE) ||      ((mode_d == PRECOMPUTE) && (!is_valid_d))) {    // loop over the weights and sum    //    float sum = weights_d.sum();    // are we normalized?    //    return (Integral::almostEqual(sum, norm_a));  }  // else we are in PRECOMPUTE mode and the weights have been initialized  //  else {    // loop over the weights and sum    //    float sum = 0;    long length = weights_d.length();    for (long i = 0; i < length; i++) {      sum += Integral::exp(weights_d(i));    }    // are we normalized?    //    return (Integral::almostEqual(sum, norm_a));  }}// method: initializeWeights//// arguments: none//// return: boolean value indicating status//// this method initialize the weight vector//boolean MixtureModel::initializeWeights() {  // set the weight vector to be the same dimension as the number of models  //  if (weights_d.length() != models_d.length()) {    weights_d.setLength(models_d.length());  }    // mode: NONE  //  if ((mode_d == NONE) || (!is_valid_d)) {    // compute the weight for each mixture    //    float weight = 1.0 / (float)weights_d.length();        // initialize the weight vector    //    for (int i=0; i < weights_d.length(); i++) {      weights_d(i) = weight;    }  }  // mode: PRECOMPUTE  //  else {    // compute the weight for each mixture    //    float weight = -log(weights_d.length());        // initialize the weight vector    //    for (int i=0; i < weights_d.length(); i++) {      weights_d(i) = weight;    }      }    // exit gracefully  //  return true;}// method: normalizeWeights//// arguments://  float norm: (input) the value that the weights should sum to//// return: boolean value indicating status//// this method renormalizes the weight vector so that the weights sum// to the input 'norm' value.//boolean MixtureModel::normalizeWeights(float norm_a) {  // mode: NONE  //  if ((mode_d == NONE) || (!is_valid_d)) {    // loop over the weights and sum    //    float sum = weights_d.sum();    // divide each weight by the sum and multiply each by norm_a to    // renormalize to norm_a    //    weights_d.mult(norm_a / sum);  }  // mode: PRECOMPUTE  //  else {    // pull the weights back to a linear scale    //    weights_d.exp();        // loop over the weights and sum    //    float sum = weights_d.sum();    // divide each weight by the sum and multiply each by norm_a    // to renormalize to norm_a    //    weights_d.mult(norm_a / sum);    // now make the weights log again    //    weights_d.log();  }  // exit gracefully  //  return true;}

⌨️ 快捷键说明

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