/*
 *  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
 *
 *  Use of this source code is governed by a BSD-style license
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
 *  in the file PATENTS.  All contributing project authors may
 *  be found in the AUTHORS file in the root of the source tree.
 */

#include "webrtc/modules/audio_processing/vad/gmm.h"

#include <math.h>

#include "testing/gtest/include/gtest/gtest.h"
#include "webrtc/modules/audio_processing/vad/noise_gmm_tables.h"
#include "webrtc/modules/audio_processing/vad/voice_gmm_tables.h"

namespace webrtc {

TEST(GmmTest, EvaluateGmm) {
  GmmParameters noise_gmm;
  GmmParameters voice_gmm;

  // Setup noise GMM.
  noise_gmm.dimension = kNoiseGmmDim;
  noise_gmm.num_mixtures = kNoiseGmmNumMixtures;
  noise_gmm.weight = kNoiseGmmWeights;
  noise_gmm.mean = &kNoiseGmmMean[0][0];
  noise_gmm.covar_inverse = &kNoiseGmmCovarInverse[0][0][0];

  // Setup voice GMM.
  voice_gmm.dimension = kVoiceGmmDim;
  voice_gmm.num_mixtures = kVoiceGmmNumMixtures;
  voice_gmm.weight = kVoiceGmmWeights;
  voice_gmm.mean = &kVoiceGmmMean[0][0];
  voice_gmm.covar_inverse = &kVoiceGmmCovarInverse[0][0][0];

  // Test vectors. These are the mean of the GMM means.
  const double kXVoice[kVoiceGmmDim] = {
      -1.35893162459863, 602.862491970368, 178.022069191324};
  const double kXNoise[kNoiseGmmDim] = {
      -2.33443722724409, 2827.97828765184, 141.114178166812};

  // Expected pdf values. These values are computed in MATLAB using EvalGmm.m
  const double kPdfNoise = 1.88904409403101e-07;
  const double kPdfVoice = 1.30453996982266e-06;

  // Relative error should be smaller that the following value.
  const double kAcceptedRelativeErr = 1e-10;

  // Test Voice.
  double pdf = EvaluateGmm(kXVoice, voice_gmm);
  EXPECT_GT(pdf, 0);
  double relative_error = fabs(pdf - kPdfVoice) / kPdfVoice;
  EXPECT_LE(relative_error, kAcceptedRelativeErr);

  // Test Noise.
  pdf = EvaluateGmm(kXNoise, noise_gmm);
  EXPECT_GT(pdf, 0);
  relative_error = fabs(pdf - kPdfNoise) / kPdfNoise;
  EXPECT_LE(relative_error, kAcceptedRelativeErr);
}

}  // namespace webrtc
