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_coding/neteq/dsp_helper.h"
12
13#include "testing/gtest/include/gtest/gtest.h"
14#include "webrtc/modules/audio_coding/neteq/audio_multi_vector.h"
15#include "webrtc/typedefs.h"
16
17namespace webrtc {
18
19TEST(DspHelper, RampSignalArray) {
20  static const int kLen = 100;
21  int16_t input[kLen];
22  int16_t output[kLen];
23  // Fill input with 1000.
24  for (int i = 0; i < kLen; ++i) {
25    input[i] = 1000;
26  }
27  int start_factor = 0;
28  // Ramp from 0 to 1 (in Q14) over the array. Note that |increment| is in Q20,
29  // while the factor is in Q14, hence the shift by 6.
30  int increment = (16384 << 6) / kLen;
31
32  // Test first method.
33  int stop_factor = DspHelper::RampSignal(input, kLen, start_factor, increment,
34                                          output);
35  EXPECT_EQ(16383, stop_factor);  // Almost reach 1 in Q14.
36  for (int i = 0; i < kLen; ++i) {
37    EXPECT_EQ(1000 * i / kLen, output[i]);
38  }
39
40  // Test second method. (Note that this modifies |input|.)
41  stop_factor = DspHelper::RampSignal(input, kLen, start_factor, increment);
42  EXPECT_EQ(16383, stop_factor);  // Almost reach 1 in Q14.
43  for (int i = 0; i < kLen; ++i) {
44    EXPECT_EQ(1000 * i / kLen, input[i]);
45  }
46}
47
48TEST(DspHelper, RampSignalAudioMultiVector) {
49  static const int kLen = 100;
50  static const int kChannels = 5;
51  AudioMultiVector input(kChannels, kLen * 3);
52  // Fill input with 1000.
53  for (int i = 0; i < kLen * 3; ++i) {
54    for (int channel = 0; channel < kChannels; ++channel) {
55      input[channel][i] = 1000;
56    }
57  }
58  // We want to start ramping at |start_index| and keep ramping for |kLen|
59  // samples.
60  int start_index = kLen;
61  int start_factor = 0;
62  // Ramp from 0 to 1 (in Q14) in |kLen| samples. Note that |increment| is in
63  // Q20, while the factor is in Q14, hence the shift by 6.
64  int increment = (16384 << 6) / kLen;
65
66  int stop_factor = DspHelper::RampSignal(&input, start_index, kLen,
67                                          start_factor, increment);
68  EXPECT_EQ(16383, stop_factor);  // Almost reach 1 in Q14.
69  // Verify that the first |kLen| samples are left untouched.
70  int i;
71  for (i = 0; i < kLen; ++i) {
72    for (int channel = 0; channel < kChannels; ++channel) {
73      EXPECT_EQ(1000, input[channel][i]);
74    }
75  }
76  // Verify that the next block of |kLen| samples are ramped.
77  for (; i < 2 * kLen; ++i) {
78    for (int channel = 0; channel < kChannels; ++channel) {
79      EXPECT_EQ(1000 * (i - kLen) / kLen, input[channel][i]);
80    }
81  }
82  // Verify the last |kLen| samples are left untouched.
83  for (; i < 3 * kLen; ++i) {
84    for (int channel = 0; channel < kChannels; ++channel) {
85      EXPECT_EQ(1000, input[channel][i]);
86    }
87  }
88}
89}  // namespace webrtc
90