1d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org/*
2d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org *  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
3d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org *
4d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org *  Use of this source code is governed by a BSD-style license
5d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org *  that can be found in the LICENSE file in the root of the source
6d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org *  tree. An additional intellectual property rights grant can be found
7d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org *  in the file PATENTS.  All contributing project authors may
8d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org *  be found in the AUTHORS file in the root of the source tree.
9d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org */
10d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org
119c55f0f957534144d2b8a64154f0a479249b34behenrik.lundin@webrtc.org#include "webrtc/modules/audio_coding/neteq/dsp_helper.h"
12d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org
133c0aae17f0e3a70fe90ecc6835926b66a3de18fbkjellander@webrtc.org#include "testing/gtest/include/gtest/gtest.h"
149c55f0f957534144d2b8a64154f0a479249b34behenrik.lundin@webrtc.org#include "webrtc/modules/audio_coding/neteq/audio_multi_vector.h"
15d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#include "webrtc/typedefs.h"
16d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org
17d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.orgnamespace webrtc {
18d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org
19d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.orgTEST(DspHelper, RampSignalArray) {
20d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org  static const int kLen = 100;
21d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org  int16_t input[kLen];
22d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org  int16_t output[kLen];
23d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org  // Fill input with 1000.
24d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org  for (int i = 0; i < kLen; ++i) {
25d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org    input[i] = 1000;
26d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org  }
27d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org  int start_factor = 0;
28d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org  // Ramp from 0 to 1 (in Q14) over the array. Note that |increment| is in Q20,
29d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org  // while the factor is in Q14, hence the shift by 6.
30d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org  int increment = (16384 << 6) / kLen;
31d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org
32d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org  // Test first method.
33d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org  int stop_factor = DspHelper::RampSignal(input, kLen, start_factor, increment,
34d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org                                          output);
35d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org  EXPECT_EQ(16383, stop_factor);  // Almost reach 1 in Q14.
36d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org  for (int i = 0; i < kLen; ++i) {
37d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org    EXPECT_EQ(1000 * i / kLen, output[i]);
38d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org  }
39d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org
40d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org  // Test second method. (Note that this modifies |input|.)
41d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org  stop_factor = DspHelper::RampSignal(input, kLen, start_factor, increment);
42d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org  EXPECT_EQ(16383, stop_factor);  // Almost reach 1 in Q14.
43d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org  for (int i = 0; i < kLen; ++i) {
44d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org    EXPECT_EQ(1000 * i / kLen, input[i]);
45d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org  }
46d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org}
47d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org
48d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.orgTEST(DspHelper, RampSignalAudioMultiVector) {
49d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org  static const int kLen = 100;
50d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org  static const int kChannels = 5;
51fd11bbfb56b42f82e18a744a414325db7a56013fhenrik.lundin@webrtc.org  AudioMultiVector input(kChannels, kLen * 3);
52d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org  // Fill input with 1000.
53d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org  for (int i = 0; i < kLen * 3; ++i) {
54d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org    for (int channel = 0; channel < kChannels; ++channel) {
55d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org      input[channel][i] = 1000;
56d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org    }
57d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org  }
58d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org  // We want to start ramping at |start_index| and keep ramping for |kLen|
59d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org  // samples.
60d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org  int start_index = kLen;
61d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org  int start_factor = 0;
62d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org  // Ramp from 0 to 1 (in Q14) in |kLen| samples. Note that |increment| is in
63d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org  // Q20, while the factor is in Q14, hence the shift by 6.
64d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org  int increment = (16384 << 6) / kLen;
65d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org
66d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org  int stop_factor = DspHelper::RampSignal(&input, start_index, kLen,
67d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org                                          start_factor, increment);
68d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org  EXPECT_EQ(16383, stop_factor);  // Almost reach 1 in Q14.
69d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org  // Verify that the first |kLen| samples are left untouched.
70d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org  int i;
71d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org  for (i = 0; i < kLen; ++i) {
72d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org    for (int channel = 0; channel < kChannels; ++channel) {
73d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org      EXPECT_EQ(1000, input[channel][i]);
74d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org    }
75d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org  }
76d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org  // Verify that the next block of |kLen| samples are ramped.
77d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org  for (; i < 2 * kLen; ++i) {
78d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org    for (int channel = 0; channel < kChannels; ++channel) {
79d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org      EXPECT_EQ(1000 * (i - kLen) / kLen, input[channel][i]);
80d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org    }
81d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org  }
82d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org  // Verify the last |kLen| samples are left untouched.
83d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org  for (; i < 3 * kLen; ++i) {
84d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org    for (int channel = 0; channel < kChannels; ++channel) {
85d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org      EXPECT_EQ(1000, input[channel][i]);
86d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org    }
87d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org  }
88d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org}
89d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org}  // namespace webrtc
90