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