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