1b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org/*
2b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
3b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *
4b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  Use of this source code is governed by a BSD-style license
5b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  that can be found in the LICENSE file in the root of the source
6b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  tree. An additional intellectual property rights grant can be found
7b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  in the file PATENTS.  All contributing project authors may
8b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  be found in the AUTHORS file in the root of the source tree.
9b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org */
10b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
11b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#include <stdlib.h>
12b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
13f24ac5923cbe5e806fac59a0d15e32567553ce8epbos@webrtc.org#include "testing/gtest/include/gtest/gtest.h"
14f24ac5923cbe5e806fac59a0d15e32567553ce8epbos@webrtc.org#include "webrtc/common_audio/vad/vad_unittest.h"
15f24ac5923cbe5e806fac59a0d15e32567553ce8epbos@webrtc.org#include "webrtc/typedefs.h"
16b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
17b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgextern "C" {
18f24ac5923cbe5e806fac59a0d15e32567553ce8epbos@webrtc.org#include "webrtc/common_audio/vad/vad_core.h"
19f24ac5923cbe5e806fac59a0d15e32567553ce8epbos@webrtc.org#include "webrtc/common_audio/vad/vad_sp.h"
20b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
21b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
22b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgnamespace {
23b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
24b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgTEST_F(VadTest, vad_sp) {
25b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  VadInstT* self = reinterpret_cast<VadInstT*>(malloc(sizeof(VadInstT)));
26b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  const int kMaxFrameLenSp = 960;  // Maximum frame length in this unittest.
27b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  int16_t zeros[kMaxFrameLenSp] = { 0 };
28b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  int32_t state[2] = { 0 };
29b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  int16_t data_in[kMaxFrameLenSp];
30b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  int16_t data_out[kMaxFrameLenSp];
31b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
32b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // We expect the first value to be 1600 as long as |frame_counter| is zero,
33b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // which is true for the first iteration.
34b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  static const int16_t kReferenceMin[32] = {
35b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      1600, 720, 509, 512, 532, 552, 570, 588,
36b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org       606, 624, 642, 659, 675, 691, 707, 723,
37b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      1600, 544, 502, 522, 542, 561, 579, 597,
38b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org       615, 633, 651, 667, 683, 699, 715, 731
39b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  };
40b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
41b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Construct a speech signal that will trigger the VAD in all modes. It is
42b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // known that (i * i) will wrap around, but that doesn't matter in this case.
43b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  for (int16_t i = 0; i < kMaxFrameLenSp; ++i) {
44b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    data_in[i] = (i * i);
45b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
46b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Input values all zeros, expect all zeros out.
47b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  WebRtcVad_Downsampling(zeros, data_out, state, kMaxFrameLenSp);
48b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, state[0]);
49b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, state[1]);
50b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  for (int16_t i = 0; i < kMaxFrameLenSp / 2; ++i) {
51b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, data_out[i]);
52b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
53b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Make a simple non-zero data test.
54b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  WebRtcVad_Downsampling(data_in, data_out, state, kMaxFrameLenSp);
55b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(207, state[0]);
56b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(2270, state[1]);
57b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
58b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ASSERT_EQ(0, WebRtcVad_InitCore(self));
59b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // TODO(bjornv): Replace this part of the test with taking values from an
60b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // array and calculate the reference value here. Make sure the values are not
61b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // ordered.
62b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  for (int16_t i = 0; i < 16; ++i) {
63b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    int16_t value = 500 * (i + 1);
64b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    for (int j = 0; j < kNumChannels; ++j) {
65b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      // Use values both above and below initialized value.
66b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      EXPECT_EQ(kReferenceMin[i], WebRtcVad_FindMinimum(self, value, j));
67b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      EXPECT_EQ(kReferenceMin[i + 16], WebRtcVad_FindMinimum(self, 12000, j));
68b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
69b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    self->frame_counter++;
70b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
71b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
72b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  free(self);
73b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
74b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}  // namespace
75