1d0ea5f0cdd6bee478e94877a564fedefa84cadd7kma@webrtc.org/* 2d0ea5f0cdd6bee478e94877a564fedefa84cadd7kma@webrtc.org * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. 3d0ea5f0cdd6bee478e94877a564fedefa84cadd7kma@webrtc.org * 4d0ea5f0cdd6bee478e94877a564fedefa84cadd7kma@webrtc.org * Use of this source code is governed by a BSD-style license 5d0ea5f0cdd6bee478e94877a564fedefa84cadd7kma@webrtc.org * that can be found in the LICENSE file in the root of the source 6d0ea5f0cdd6bee478e94877a564fedefa84cadd7kma@webrtc.org * tree. An additional intellectual property rights grant can be found 7d0ea5f0cdd6bee478e94877a564fedefa84cadd7kma@webrtc.org * in the file PATENTS. All contributing project authors may 8d0ea5f0cdd6bee478e94877a564fedefa84cadd7kma@webrtc.org * be found in the AUTHORS file in the root of the source tree. 9d0ea5f0cdd6bee478e94877a564fedefa84cadd7kma@webrtc.org */ 10d0ea5f0cdd6bee478e94877a564fedefa84cadd7kma@webrtc.org 1149d62206ededc5905d6121d42fdcce8ed665b2c0kjellander@webrtc.org#include "testing/gtest/include/gtest/gtest.h" 12d0ea5f0cdd6bee478e94877a564fedefa84cadd7kma@webrtc.org#include "webrtc/common_audio/signal_processing/include/signal_processing_library.h" 13d0ea5f0cdd6bee478e94877a564fedefa84cadd7kma@webrtc.org#include "webrtc/modules/audio_coding/codecs/isac/fix/source/filterbank_internal.h" 14d0ea5f0cdd6bee478e94877a564fedefa84cadd7kma@webrtc.org#include "webrtc/modules/audio_coding/codecs/isac/fix/source/filterbank_tables.h" 15d0ea5f0cdd6bee478e94877a564fedefa84cadd7kma@webrtc.org#include "webrtc/modules/audio_coding/codecs/isac/fix/source/settings.h" 16d0ea5f0cdd6bee478e94877a564fedefa84cadd7kma@webrtc.org#include "webrtc/system_wrappers/interface/cpu_features_wrapper.h" 17d0ea5f0cdd6bee478e94877a564fedefa84cadd7kma@webrtc.org#include "webrtc/typedefs.h" 18d0ea5f0cdd6bee478e94877a564fedefa84cadd7kma@webrtc.org 19d0ea5f0cdd6bee478e94877a564fedefa84cadd7kma@webrtc.orgclass FilterBanksTest : public testing::Test { 20d0ea5f0cdd6bee478e94877a564fedefa84cadd7kma@webrtc.org protected: 21d0ea5f0cdd6bee478e94877a564fedefa84cadd7kma@webrtc.org // Pass a function pointer to the Tester function. 22d0ea5f0cdd6bee478e94877a564fedefa84cadd7kma@webrtc.org void CalculateResidualEnergyTester(AllpassFilter2FixDec16 23d0ea5f0cdd6bee478e94877a564fedefa84cadd7kma@webrtc.org AllpassFilter2FixDec16Function) { 24d0ea5f0cdd6bee478e94877a564fedefa84cadd7kma@webrtc.org const int kSamples = QLOOKAHEAD; 25d0ea5f0cdd6bee478e94877a564fedefa84cadd7kma@webrtc.org const int kState = 2; 26d0ea5f0cdd6bee478e94877a564fedefa84cadd7kma@webrtc.org int16_t data_ch1[kSamples] = {0}; 27d0ea5f0cdd6bee478e94877a564fedefa84cadd7kma@webrtc.org int16_t data_ch2[kSamples] = {0}; 28d0ea5f0cdd6bee478e94877a564fedefa84cadd7kma@webrtc.org int32_t state_ch1[kState] = {0}; 29d0ea5f0cdd6bee478e94877a564fedefa84cadd7kma@webrtc.org int32_t state_ch2[kState] = {0}; 30d0ea5f0cdd6bee478e94877a564fedefa84cadd7kma@webrtc.org const int32_t out_state_ch1[kState] = {-809122714, 1645972152}; 31d0ea5f0cdd6bee478e94877a564fedefa84cadd7kma@webrtc.org const int32_t out_state_ch2[kState] = {428019288, 1057309936}; 32d0ea5f0cdd6bee478e94877a564fedefa84cadd7kma@webrtc.org const int32_t out_data_ch1[kSamples] = {0, 0, 347, 10618, 16718, -7089, 33d0ea5f0cdd6bee478e94877a564fedefa84cadd7kma@webrtc.org 32767, 16913, 27042, 8377, -22973, -28372, -27603, -14804, 398, -25332, 34d0ea5f0cdd6bee478e94877a564fedefa84cadd7kma@webrtc.org -11200, 18044, 25223, -6839, 1116, -23984, 32717, 7364}; 35d0ea5f0cdd6bee478e94877a564fedefa84cadd7kma@webrtc.org const int32_t out_data_ch2[kSamples] = {0, 0, 3010, 22351, 21106, 16969, 36d0ea5f0cdd6bee478e94877a564fedefa84cadd7kma@webrtc.org -2095, -664, 3513, -30980, 32767, -23839, 13335, 20289, -6831, 339, 37d0ea5f0cdd6bee478e94877a564fedefa84cadd7kma@webrtc.org -17207, 32767, 4959, 6177, 32767, 16599, -4747, 20504}; 38d0ea5f0cdd6bee478e94877a564fedefa84cadd7kma@webrtc.org int sign = 1; 39d0ea5f0cdd6bee478e94877a564fedefa84cadd7kma@webrtc.org 40d0ea5f0cdd6bee478e94877a564fedefa84cadd7kma@webrtc.org for (int i = 0; i < kSamples; i++) { 41d0ea5f0cdd6bee478e94877a564fedefa84cadd7kma@webrtc.org sign *= -1; 42d0ea5f0cdd6bee478e94877a564fedefa84cadd7kma@webrtc.org data_ch1[i] = sign * WEBRTC_SPL_WORD32_MAX / (i * i + 1); 43d0ea5f0cdd6bee478e94877a564fedefa84cadd7kma@webrtc.org data_ch2[i] = sign * WEBRTC_SPL_WORD32_MIN / (i * i + 1); 44d0ea5f0cdd6bee478e94877a564fedefa84cadd7kma@webrtc.org }; 45d0ea5f0cdd6bee478e94877a564fedefa84cadd7kma@webrtc.org 46d0ea5f0cdd6bee478e94877a564fedefa84cadd7kma@webrtc.org AllpassFilter2FixDec16Function(data_ch1, 47d0ea5f0cdd6bee478e94877a564fedefa84cadd7kma@webrtc.org data_ch2, 48d0ea5f0cdd6bee478e94877a564fedefa84cadd7kma@webrtc.org WebRtcIsacfix_kUpperApFactorsQ15, 49d0ea5f0cdd6bee478e94877a564fedefa84cadd7kma@webrtc.org WebRtcIsacfix_kLowerApFactorsQ15, 50d0ea5f0cdd6bee478e94877a564fedefa84cadd7kma@webrtc.org kSamples, 51d0ea5f0cdd6bee478e94877a564fedefa84cadd7kma@webrtc.org state_ch1, 52d0ea5f0cdd6bee478e94877a564fedefa84cadd7kma@webrtc.org state_ch2); 53d0ea5f0cdd6bee478e94877a564fedefa84cadd7kma@webrtc.org 54d0ea5f0cdd6bee478e94877a564fedefa84cadd7kma@webrtc.org for (int i = 0; i < kSamples; i++) { 55d0ea5f0cdd6bee478e94877a564fedefa84cadd7kma@webrtc.org EXPECT_EQ(out_data_ch1[i], data_ch1[i]); 56d0ea5f0cdd6bee478e94877a564fedefa84cadd7kma@webrtc.org EXPECT_EQ(out_data_ch2[i], data_ch2[i]); 57d0ea5f0cdd6bee478e94877a564fedefa84cadd7kma@webrtc.org } 58d0ea5f0cdd6bee478e94877a564fedefa84cadd7kma@webrtc.org for (int i = 0; i < kState; i++) { 59d0ea5f0cdd6bee478e94877a564fedefa84cadd7kma@webrtc.org EXPECT_EQ(out_state_ch1[i], state_ch1[i]); 60d0ea5f0cdd6bee478e94877a564fedefa84cadd7kma@webrtc.org EXPECT_EQ(out_state_ch2[i], state_ch2[i]); 61d0ea5f0cdd6bee478e94877a564fedefa84cadd7kma@webrtc.org } 62d0ea5f0cdd6bee478e94877a564fedefa84cadd7kma@webrtc.org } 63d0ea5f0cdd6bee478e94877a564fedefa84cadd7kma@webrtc.org}; 64d0ea5f0cdd6bee478e94877a564fedefa84cadd7kma@webrtc.org 65d0ea5f0cdd6bee478e94877a564fedefa84cadd7kma@webrtc.orgTEST_F(FilterBanksTest, AllpassFilter2FixDec16Test) { 66d0ea5f0cdd6bee478e94877a564fedefa84cadd7kma@webrtc.org CalculateResidualEnergyTester(WebRtcIsacfix_AllpassFilter2FixDec16C); 67d0ea5f0cdd6bee478e94877a564fedefa84cadd7kma@webrtc.org#ifdef WEBRTC_DETECT_ARM_NEON 68d0ea5f0cdd6bee478e94877a564fedefa84cadd7kma@webrtc.org if ((WebRtc_GetCPUFeaturesARM() & kCPUFeatureNEON) != 0) { 69d0ea5f0cdd6bee478e94877a564fedefa84cadd7kma@webrtc.org CalculateResidualEnergyTester(WebRtcIsacfix_AllpassFilter2FixDec16Neon); 70d0ea5f0cdd6bee478e94877a564fedefa84cadd7kma@webrtc.org } 71d0ea5f0cdd6bee478e94877a564fedefa84cadd7kma@webrtc.org#elif defined(WEBRTC_ARCH_ARM_NEON) 72d0ea5f0cdd6bee478e94877a564fedefa84cadd7kma@webrtc.org CalculateResidualEnergyTester(WebRtcIsacfix_AllpassFilter2FixDec16Neon); 73d0ea5f0cdd6bee478e94877a564fedefa84cadd7kma@webrtc.org#endif 74d0ea5f0cdd6bee478e94877a564fedefa84cadd7kma@webrtc.org} 75d0ea5f0cdd6bee478e94877a564fedefa84cadd7kma@webrtc.org 76d0ea5f0cdd6bee478e94877a564fedefa84cadd7kma@webrtc.orgTEST_F(FilterBanksTest, HighpassFilterFixDec32Test) { 77d0ea5f0cdd6bee478e94877a564fedefa84cadd7kma@webrtc.org const int kSamples = 20; 78d0ea5f0cdd6bee478e94877a564fedefa84cadd7kma@webrtc.org int16_t in[kSamples]; 79d0ea5f0cdd6bee478e94877a564fedefa84cadd7kma@webrtc.org int32_t state[2] = {12345, 987654}; 80d0ea5f0cdd6bee478e94877a564fedefa84cadd7kma@webrtc.org#ifdef WEBRTC_ARCH_ARM_V7 81d0ea5f0cdd6bee478e94877a564fedefa84cadd7kma@webrtc.org int32_t out[kSamples] = {-1040, -1035, -22875, -1397, -27604, 20018, 7917, 82d0ea5f0cdd6bee478e94877a564fedefa84cadd7kma@webrtc.org -1279, -8552, -14494, -7558, -23537, -27258, -30554, -32768, -3432, -32768, 83d0ea5f0cdd6bee478e94877a564fedefa84cadd7kma@webrtc.org 25215, -27536, 22436}; 84d0ea5f0cdd6bee478e94877a564fedefa84cadd7kma@webrtc.org#else 85d0ea5f0cdd6bee478e94877a564fedefa84cadd7kma@webrtc.org int32_t out[kSamples] = {-1040, -1035, -22875, -1397, -27604, 20017, 7915, 86d0ea5f0cdd6bee478e94877a564fedefa84cadd7kma@webrtc.org -1280, -8554, -14496, -7561, -23541, -27263, -30560, -32768, -3441, -32768, 87d0ea5f0cdd6bee478e94877a564fedefa84cadd7kma@webrtc.org 25203, -27550, 22419}; 88d0ea5f0cdd6bee478e94877a564fedefa84cadd7kma@webrtc.org#endif 89e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org HighpassFilterFixDec32 WebRtcIsacfix_HighpassFilterFixDec32; 90e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org#if defined(MIPS_DSP_R1_LE) 91e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org WebRtcIsacfix_HighpassFilterFixDec32 = 92e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org WebRtcIsacfix_HighpassFilterFixDec32MIPS; 93e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org#else 94e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org WebRtcIsacfix_HighpassFilterFixDec32 = WebRtcIsacfix_HighpassFilterFixDec32C; 95e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org#endif 96d0ea5f0cdd6bee478e94877a564fedefa84cadd7kma@webrtc.org 97d0ea5f0cdd6bee478e94877a564fedefa84cadd7kma@webrtc.org for (int i = 0; i < kSamples; i++) { 98d0ea5f0cdd6bee478e94877a564fedefa84cadd7kma@webrtc.org in[i] = WEBRTC_SPL_WORD32_MAX / (i + 1); 99d0ea5f0cdd6bee478e94877a564fedefa84cadd7kma@webrtc.org } 100d0ea5f0cdd6bee478e94877a564fedefa84cadd7kma@webrtc.org 101d0ea5f0cdd6bee478e94877a564fedefa84cadd7kma@webrtc.org WebRtcIsacfix_HighpassFilterFixDec32(in, kSamples, 102d0ea5f0cdd6bee478e94877a564fedefa84cadd7kma@webrtc.org WebRtcIsacfix_kHPStCoeffOut1Q30, state); 103d0ea5f0cdd6bee478e94877a564fedefa84cadd7kma@webrtc.org 104d0ea5f0cdd6bee478e94877a564fedefa84cadd7kma@webrtc.org for (int i = 0; i < kSamples; i++) { 105d0ea5f0cdd6bee478e94877a564fedefa84cadd7kma@webrtc.org EXPECT_EQ(out[i], in[i]); 106d0ea5f0cdd6bee478e94877a564fedefa84cadd7kma@webrtc.org } 107d0ea5f0cdd6bee478e94877a564fedefa84cadd7kma@webrtc.org} 108