1 /*
2  *  Copyright (c) 2022 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 "modules/audio_processing/transient/voice_probability_delay_unit.h"
12 
13 #include "test/gtest.h"
14 
15 namespace webrtc {
16 namespace {
17 
18 // Checks that with zero delay, the observed value is immediately returned as
19 // delayed value.
TEST(VoiceProbabilityDelayUnit,NoDelay)20 TEST(VoiceProbabilityDelayUnit, NoDelay) {
21   VoiceProbabilityDelayUnit delay_unit(/*delay_num_samples=*/0,
22                                        /*sample_rate_hz=*/48000);
23   constexpr int kMax = 5;
24   for (int i = 0; i <= kMax; ++i) {
25     SCOPED_TRACE(i);
26     float voice_probability = static_cast<float>(i) / kMax;
27     EXPECT_EQ(voice_probability, delay_unit.Delay(voice_probability));
28   }
29 }
30 
31 // Checks that with integer delays, an exact copy of a previously observed value
32 // is returned.
TEST(VoiceProbabilityDelayUnit,IntegerDelay)33 TEST(VoiceProbabilityDelayUnit, IntegerDelay) {
34   VoiceProbabilityDelayUnit delay_unit_10ms(/*delay_num_samples=*/480,
35                                             /*sample_rate_hz=*/48000);
36   delay_unit_10ms.Delay(0.125f);
37   EXPECT_EQ(0.125f, delay_unit_10ms.Delay(0.9f));
38 
39   VoiceProbabilityDelayUnit delay_unit_20ms(/*delay_num_samples=*/960,
40                                             /*sample_rate_hz=*/48000);
41   delay_unit_20ms.Delay(0.125f);
42   delay_unit_20ms.Delay(0.8f);
43   EXPECT_EQ(0.125f, delay_unit_20ms.Delay(0.9f));
44 }
45 
46 // Checks that with a fractional delay < 10 ms, interpolation is applied.
TEST(VoiceProbabilityDelayUnit,FractionalDelayLessThan10ms)47 TEST(VoiceProbabilityDelayUnit, FractionalDelayLessThan10ms) {
48   // Create delay unit with fractional delay of 6 ms.
49   VoiceProbabilityDelayUnit delay_unit(/*delay_num_samples=*/288,
50                                        /*sample_rate_hz=*/48000);
51   //  frame 0
52   // --------- frame 1
53   //          ---------
54   //    0000001111
55   delay_unit.Delay(1.0f);
56   EXPECT_FLOAT_EQ(0.68f, delay_unit.Delay(0.2f));
57 }
58 
59 // Checks that with a fractional delay > 10 ms, interpolation is applied.
TEST(VoiceProbabilityDelayUnit,FractionalDelayGreaterThan10ms)60 TEST(VoiceProbabilityDelayUnit, FractionalDelayGreaterThan10ms) {
61   // Create delay unit with fractional delay of 14 ms.
62   VoiceProbabilityDelayUnit delay_unit(/*delay_num_samples=*/672,
63                                        /*sample_rate_hz=*/48000);
64   //  frame 0
65   // --------- frame 1
66   //          --------- frame 2
67   //                   ---------
68   //      0000111111
69   delay_unit.Delay(1.0f);
70   delay_unit.Delay(0.2f);
71   EXPECT_FLOAT_EQ(0.52f, delay_unit.Delay(1.0f));
72 }
73 
74 // Checks that `Initialize()` resets the delay unit.
TEST(VoiceProbabilityDelayUnit,InitializeResetsDelayUnit)75 TEST(VoiceProbabilityDelayUnit, InitializeResetsDelayUnit) {
76   VoiceProbabilityDelayUnit delay_unit(/*delay_num_samples=*/960,
77                                        /*sample_rate_hz=*/48000);
78   delay_unit.Delay(1.0f);
79   delay_unit.Delay(0.9f);
80 
81   delay_unit.Initialize(/*delay_num_samples=*/160, /*sample_rate_hz=*/8000);
82   EXPECT_EQ(0.0f, delay_unit.Delay(0.1f));
83   EXPECT_EQ(0.0f, delay_unit.Delay(0.2f));
84   EXPECT_EQ(0.1f, delay_unit.Delay(0.3f));
85 }
86 
87 // Checks that `Initialize()` handles delay changes.
TEST(VoiceProbabilityDelayUnit,InitializeHandlesDelayChanges)88 TEST(VoiceProbabilityDelayUnit, InitializeHandlesDelayChanges) {
89   // Start with a 20 ms delay.
90   VoiceProbabilityDelayUnit delay_unit(/*delay_num_samples=*/960,
91                                        /*sample_rate_hz=*/48000);
92   delay_unit.Delay(1.0f);
93   delay_unit.Delay(0.9f);
94 
95   // Lower the delay to 10 ms.
96   delay_unit.Initialize(/*delay_num_samples=*/80, /*sample_rate_hz=*/8000);
97   EXPECT_EQ(0.0f, delay_unit.Delay(0.1f));
98   EXPECT_EQ(0.1f, delay_unit.Delay(0.2f));
99 
100   // Increase the delay to 15 ms.
101   delay_unit.Initialize(/*delay_num_samples=*/120, /*sample_rate_hz=*/8000);
102   EXPECT_EQ(0.0f, delay_unit.Delay(0.1f));
103   EXPECT_EQ(0.05f, delay_unit.Delay(0.2f));
104   EXPECT_EQ(0.15f, delay_unit.Delay(0.3f));
105 }
106 
107 }  // namespace
108 }  // namespace webrtc
109