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_filterbank.h"
20b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
21b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
22b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgnamespace {
23b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
2498b201189e601aa1863085e0016e868d2db416b1pbos@webrtc.orgconst int kNumValidFrameLengths = 3;
25b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
26b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgTEST_F(VadTest, vad_filterbank) {
27b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  VadInstT* self = reinterpret_cast<VadInstT*>(malloc(sizeof(VadInstT)));
28b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  static const int16_t kReference[kNumValidFrameLengths] = { 48, 11, 11 };
29b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  static const int16_t kFeatures[kNumValidFrameLengths * kNumChannels] = {
30b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      1213, 759, 587, 462, 434, 272,
31b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      1479, 1385, 1291, 1200, 1103, 1099,
32b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      1732, 1692, 1681, 1629, 1436, 1436
33b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  };
34b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  static const int16_t kOffsetVector[kNumChannels] = {
35b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      368, 368, 272, 176, 176, 176 };
36b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  int16_t features[kNumChannels];
37b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
38b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Construct a speech signal that will trigger the VAD in all modes. It is
39b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // known that (i * i) will wrap around, but that doesn't matter in this case.
40b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  int16_t speech[kMaxFrameLength];
41b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  for (int16_t i = 0; i < kMaxFrameLength; ++i) {
42b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    speech[i] = (i * i);
43b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
44b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
45b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  int frame_length_index = 0;
46b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ASSERT_EQ(0, WebRtcVad_InitCore(self));
47b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  for (size_t j = 0; j < kFrameLengthsSize; ++j) {
48b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (ValidRatesAndFrameLengths(8000, kFrameLengths[j])) {
49b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      EXPECT_EQ(kReference[frame_length_index],
50b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                WebRtcVad_CalculateFeatures(self, speech, kFrameLengths[j],
51b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                            features));
52b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      for (int k = 0; k < kNumChannels; ++k) {
53b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_EQ(kFeatures[k + frame_length_index * kNumChannels],
54b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                  features[k]);
55b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      }
56b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      frame_length_index++;
57b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
58b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
59b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(kNumValidFrameLengths, frame_length_index);
60b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
61b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Verify that all zeros in gives kOffsetVector out.
62b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  memset(speech, 0, sizeof(speech));
63b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ASSERT_EQ(0, WebRtcVad_InitCore(self));
64b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  for (size_t j = 0; j < kFrameLengthsSize; ++j) {
65b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (ValidRatesAndFrameLengths(8000, kFrameLengths[j])) {
66b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      EXPECT_EQ(0, WebRtcVad_CalculateFeatures(self, speech, kFrameLengths[j],
67b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                               features));
68b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      for (int k = 0; k < kNumChannels; ++k) {
69b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_EQ(kOffsetVector[k], features[k]);
70b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      }
71b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
72b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
73b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
74b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Verify that all ones in gives kOffsetVector out. Any other constant input
75b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // will have a small impact in the sub bands.
76b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  for (int16_t i = 0; i < kMaxFrameLength; ++i) {
77b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    speech[i] = 1;
78b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
79b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  for (size_t j = 0; j < kFrameLengthsSize; ++j) {
80b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (ValidRatesAndFrameLengths(8000, kFrameLengths[j])) {
81b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      ASSERT_EQ(0, WebRtcVad_InitCore(self));
82b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      EXPECT_EQ(0, WebRtcVad_CalculateFeatures(self, speech, kFrameLengths[j],
83b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                               features));
84b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      for (int k = 0; k < kNumChannels; ++k) {
85b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_EQ(kOffsetVector[k], features[k]);
86b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      }
87b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
88b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
89b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
90b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  free(self);
91b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
92b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}  // namespace
93