Home | History | Annotate | Download | only in vad
      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 "webrtc/modules/audio_processing/vad/pole_zero_filter.h"
     12 
     13 #include <math.h>
     14 #include <stdio.h>
     15 
     16 #include "testing/gtest/include/gtest/gtest.h"
     17 #include "webrtc/base/scoped_ptr.h"
     18 #include "webrtc/modules/audio_processing/vad/vad_audio_proc_internal.h"
     19 #include "webrtc/test/testsupport/fileutils.h"
     20 
     21 namespace webrtc {
     22 
     23 static const int kInputSamples = 50;
     24 
     25 static const int16_t kInput[kInputSamples] = {
     26     -2136,  -7116, 10715,  2464,   3164,   8139,   11393, 24013, -32117, -5544,
     27     -27740, 10181, 14190,  -24055, -15912, 17393,  6359,  -9950, -13894, 32432,
     28     -23944, 3437,  -8381,  19768,  3087,   -19795, -5920, 13310, 1407,   3876,
     29     4059,   3524,  -23130, 19121,  -27900, -24840, 4089,  21422, -3625,  3015,
     30     -11236, 28856, 13424,  6571,   -19761, -6361,  15821, -9469, 29727,  32229};
     31 
     32 static const float kReferenceOutput[kInputSamples] = {
     33     -2082.230472f,  -6878.572941f,  10697.090871f,  2358.373952f,
     34     2973.936512f,   7738.580650f,   10690.803213f,  22687.091576f,
     35     -32676.684717f, -5879.621684f,  -27359.297432f, 10368.735888f,
     36     13994.584604f,  -23676.126249f, -15078.250390f, 17818.253338f,
     37     6577.743123f,   -9498.369315f,  -13073.651079f, 32460.026588f,
     38     -23391.849347f, 3953.805667f,   -7667.761363f,  19995.153447f,
     39     3185.575477f,   -19207.365160f, -5143.103201f,  13756.317237f,
     40     1779.654794f,   4142.269755f,   4209.475034f,   3572.991789f,
     41     -22509.089546f, 19307.878964f,  -27060.439759f, -23319.042810f,
     42     5547.685267f,   22312.718676f,  -2707.309027f,  3852.358490f,
     43     -10135.510093f, 29241.509970f,  13394.397233f,  6340.721417f,
     44     -19510.207905f, -5908.442086f,  15882.301634f,  -9211.335255f,
     45     29253.056735f,  30874.443046f};
     46 
     47 class PoleZeroFilterTest : public ::testing::Test {
     48  protected:
     49   PoleZeroFilterTest()
     50       : my_filter_(PoleZeroFilter::Create(kCoeffNumerator,
     51                                           kFilterOrder,
     52                                           kCoeffDenominator,
     53                                           kFilterOrder)) {}
     54 
     55   ~PoleZeroFilterTest() {}
     56 
     57   void FilterSubframes(int num_subframes);
     58 
     59  private:
     60   void TestClean();
     61   rtc::scoped_ptr<PoleZeroFilter> my_filter_;
     62 };
     63 
     64 void PoleZeroFilterTest::FilterSubframes(int num_subframes) {
     65   float output[kInputSamples];
     66   const int num_subframe_samples = kInputSamples / num_subframes;
     67   EXPECT_EQ(num_subframe_samples * num_subframes, kInputSamples);
     68 
     69   for (int n = 0; n < num_subframes; n++) {
     70     my_filter_->Filter(&kInput[n * num_subframe_samples], num_subframe_samples,
     71                        &output[n * num_subframe_samples]);
     72   }
     73   for (int n = 0; n < kInputSamples; n++) {
     74     EXPECT_NEAR(output[n], kReferenceOutput[n], 1);
     75   }
     76 }
     77 
     78 TEST_F(PoleZeroFilterTest, OneSubframe) {
     79   FilterSubframes(1);
     80 }
     81 
     82 TEST_F(PoleZeroFilterTest, TwoSubframes) {
     83   FilterSubframes(2);
     84 }
     85 
     86 TEST_F(PoleZeroFilterTest, FiveSubframes) {
     87   FilterSubframes(5);
     88 }
     89 
     90 TEST_F(PoleZeroFilterTest, TenSubframes) {
     91   FilterSubframes(10);
     92 }
     93 
     94 TEST_F(PoleZeroFilterTest, TwentyFiveSubframes) {
     95   FilterSubframes(25);
     96 }
     97 
     98 TEST_F(PoleZeroFilterTest, FiftySubframes) {
     99   FilterSubframes(50);
    100 }
    101 
    102 }  // namespace webrtc
    103