tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

gmm.cc (1876B)


      1 /*
      2 *  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
      3 *
      4 *  Use of this source code is governed by a BSD-style license
      5 *  that can be found in the LICENSE file in the root of the source
      6 *  tree. An additional intellectual property rights grant can be found
      7 *  in the file PATENTS.  All contributing project authors may
      8 *  be found in the AUTHORS file in the root of the source tree.
      9 */
     10 
     11 #include "modules/audio_processing/vad/gmm.h"
     12 
     13 #include <cmath>
     14 
     15 namespace webrtc {
     16 
     17 static const int kMaxDimension = 10;
     18 
     19 static void RemoveMean(const double* in,
     20                       const double* mean_vec,
     21                       int dimension,
     22                       double* out) {
     23  for (int n = 0; n < dimension; ++n)
     24    out[n] = in[n] - mean_vec[n];
     25 }
     26 
     27 static double ComputeExponent(const double* in,
     28                              const double* covar_inv,
     29                              int dimension) {
     30  double q = 0;
     31  for (int i = 0; i < dimension; ++i) {
     32    double v = 0;
     33    for (int j = 0; j < dimension; j++)
     34      v += (*covar_inv++) * in[j];
     35    q += v * in[i];
     36  }
     37  q *= -0.5;
     38  return q;
     39 }
     40 
     41 double EvaluateGmm(const double* x, const GmmParameters& gmm_parameters) {
     42  if (gmm_parameters.dimension > kMaxDimension) {
     43    return -1;  // This is invalid pdf so the caller can check this.
     44  }
     45  double f = 0;
     46  double v[kMaxDimension];
     47  const double* mean_vec = gmm_parameters.mean;
     48  const double* covar_inv = gmm_parameters.covar_inverse;
     49 
     50  for (int n = 0; n < gmm_parameters.num_mixtures; n++) {
     51    RemoveMean(x, mean_vec, gmm_parameters.dimension, v);
     52    double q = ComputeExponent(v, covar_inv, gmm_parameters.dimension) +
     53               gmm_parameters.weight[n];
     54    f += exp(q);
     55    mean_vec += gmm_parameters.dimension;
     56    covar_inv += gmm_parameters.dimension * gmm_parameters.dimension;
     57  }
     58  return f;
     59 }
     60 
     61 }  // namespace webrtc