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