| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license | 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 | 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 | 6 * tree. An additional intellectual property rights grant can be found |
| 7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
| 8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
| 9 */ | 9 */ |
| 10 | 10 |
| 11 #include "testing/gtest/include/gtest/gtest.h" | 11 #include "testing/gtest/include/gtest/gtest.h" |
| 12 #include "webrtc/common_audio/signal_processing/include/signal_processing_librar
y.h" | 12 #include "webrtc/common_audio/signal_processing/include/signal_processing_librar
y.h" |
| 13 | 13 |
| 14 static const int kVector16Size = 9; | 14 static const size_t kVector16Size = 9; |
| 15 static const int16_t vector16[kVector16Size] = {1, -15511, 4323, 1963, | 15 static const int16_t vector16[kVector16Size] = {1, -15511, 4323, 1963, |
| 16 WEBRTC_SPL_WORD16_MAX, 0, WEBRTC_SPL_WORD16_MIN + 5, -3333, 345}; | 16 WEBRTC_SPL_WORD16_MAX, 0, WEBRTC_SPL_WORD16_MIN + 5, -3333, 345}; |
| 17 | 17 |
| 18 class SplTest : public testing::Test { | 18 class SplTest : public testing::Test { |
| 19 protected: | 19 protected: |
| 20 SplTest() { | 20 SplTest() { |
| 21 WebRtcSpl_Init(); | 21 WebRtcSpl_Init(); |
| 22 } | 22 } |
| 23 virtual ~SplTest() { | 23 virtual ~SplTest() { |
| 24 } | 24 } |
| (...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 150 | 150 |
| 151 | 151 |
| 152 EXPECT_EQ(-91772805, WebRtcSpl_DivResultInQ31(den, num)); | 152 EXPECT_EQ(-91772805, WebRtcSpl_DivResultInQ31(den, num)); |
| 153 EXPECT_EQ(-23, WebRtcSpl_DivW32W16ResW16(num, (int16_t)den)); | 153 EXPECT_EQ(-23, WebRtcSpl_DivW32W16ResW16(num, (int16_t)den)); |
| 154 EXPECT_EQ(-23, WebRtcSpl_DivW32W16(num, (int16_t)den)); | 154 EXPECT_EQ(-23, WebRtcSpl_DivW32W16(num, (int16_t)den)); |
| 155 EXPECT_EQ(23u, WebRtcSpl_DivU32U16(num, denU)); | 155 EXPECT_EQ(23u, WebRtcSpl_DivU32U16(num, denU)); |
| 156 EXPECT_EQ(0, WebRtcSpl_DivW32HiLow(128, 0, 256)); | 156 EXPECT_EQ(0, WebRtcSpl_DivW32HiLow(128, 0, 256)); |
| 157 } | 157 } |
| 158 | 158 |
| 159 TEST_F(SplTest, BasicArrayOperationsTest) { | 159 TEST_F(SplTest, BasicArrayOperationsTest) { |
| 160 const int kVectorSize = 4; | 160 const size_t kVectorSize = 4; |
| 161 int B[] = {4, 12, 133, 1100}; | 161 int B[] = {4, 12, 133, 1100}; |
| 162 int16_t b16[kVectorSize]; | 162 int16_t b16[kVectorSize]; |
| 163 int32_t b32[kVectorSize]; | 163 int32_t b32[kVectorSize]; |
| 164 | 164 |
| 165 int16_t bTmp16[kVectorSize]; | 165 int16_t bTmp16[kVectorSize]; |
| 166 int32_t bTmp32[kVectorSize]; | 166 int32_t bTmp32[kVectorSize]; |
| 167 | 167 |
| 168 WebRtcSpl_MemSetW16(b16, 3, kVectorSize); | 168 WebRtcSpl_MemSetW16(b16, 3, kVectorSize); |
| 169 for (int kk = 0; kk < kVectorSize; ++kk) { | 169 for (size_t kk = 0; kk < kVectorSize; ++kk) { |
| 170 EXPECT_EQ(3, b16[kk]); | 170 EXPECT_EQ(3, b16[kk]); |
| 171 } | 171 } |
| 172 WebRtcSpl_ZerosArrayW16(b16, kVectorSize); | 172 WebRtcSpl_ZerosArrayW16(b16, kVectorSize); |
| 173 for (int kk = 0; kk < kVectorSize; ++kk) { | 173 for (size_t kk = 0; kk < kVectorSize; ++kk) { |
| 174 EXPECT_EQ(0, b16[kk]); | 174 EXPECT_EQ(0, b16[kk]); |
| 175 } | 175 } |
| 176 WebRtcSpl_MemSetW32(b32, 3, kVectorSize); | 176 WebRtcSpl_MemSetW32(b32, 3, kVectorSize); |
| 177 for (int kk = 0; kk < kVectorSize; ++kk) { | 177 for (size_t kk = 0; kk < kVectorSize; ++kk) { |
| 178 EXPECT_EQ(3, b32[kk]); | 178 EXPECT_EQ(3, b32[kk]); |
| 179 } | 179 } |
| 180 WebRtcSpl_ZerosArrayW32(b32, kVectorSize); | 180 WebRtcSpl_ZerosArrayW32(b32, kVectorSize); |
| 181 for (int kk = 0; kk < kVectorSize; ++kk) { | 181 for (size_t kk = 0; kk < kVectorSize; ++kk) { |
| 182 EXPECT_EQ(0, b32[kk]); | 182 EXPECT_EQ(0, b32[kk]); |
| 183 } | 183 } |
| 184 for (int kk = 0; kk < kVectorSize; ++kk) { | 184 for (size_t kk = 0; kk < kVectorSize; ++kk) { |
| 185 bTmp16[kk] = (int16_t)kk; | 185 bTmp16[kk] = (int16_t)kk; |
| 186 bTmp32[kk] = (int32_t)kk; | 186 bTmp32[kk] = (int32_t)kk; |
| 187 } | 187 } |
| 188 WEBRTC_SPL_MEMCPY_W16(b16, bTmp16, kVectorSize); | 188 WEBRTC_SPL_MEMCPY_W16(b16, bTmp16, kVectorSize); |
| 189 for (int kk = 0; kk < kVectorSize; ++kk) { | 189 for (size_t kk = 0; kk < kVectorSize; ++kk) { |
| 190 EXPECT_EQ(b16[kk], bTmp16[kk]); | 190 EXPECT_EQ(b16[kk], bTmp16[kk]); |
| 191 } | 191 } |
| 192 // WEBRTC_SPL_MEMCPY_W32(b32, bTmp32, kVectorSize); | 192 // WEBRTC_SPL_MEMCPY_W32(b32, bTmp32, kVectorSize); |
| 193 // for (int kk = 0; kk < kVectorSize; ++kk) { | 193 // for (int kk = 0; kk < kVectorSize; ++kk) { |
| 194 // EXPECT_EQ(b32[kk], bTmp32[kk]); | 194 // EXPECT_EQ(b32[kk], bTmp32[kk]); |
| 195 // } | 195 // } |
| 196 WebRtcSpl_CopyFromEndW16(b16, kVectorSize, 2, bTmp16); | 196 WebRtcSpl_CopyFromEndW16(b16, kVectorSize, 2, bTmp16); |
| 197 for (int kk = 0; kk < 2; ++kk) { | 197 for (size_t kk = 0; kk < 2; ++kk) { |
| 198 EXPECT_EQ(kk+2, bTmp16[kk]); | 198 EXPECT_EQ(static_cast<int16_t>(kk+2), bTmp16[kk]); |
| 199 } | 199 } |
| 200 | 200 |
| 201 for (int kk = 0; kk < kVectorSize; ++kk) { | 201 for (size_t kk = 0; kk < kVectorSize; ++kk) { |
| 202 b32[kk] = B[kk]; | 202 b32[kk] = B[kk]; |
| 203 b16[kk] = (int16_t)B[kk]; | 203 b16[kk] = (int16_t)B[kk]; |
| 204 } | 204 } |
| 205 WebRtcSpl_VectorBitShiftW32ToW16(bTmp16, kVectorSize, b32, 1); | 205 WebRtcSpl_VectorBitShiftW32ToW16(bTmp16, kVectorSize, b32, 1); |
| 206 for (int kk = 0; kk < kVectorSize; ++kk) { | 206 for (size_t kk = 0; kk < kVectorSize; ++kk) { |
| 207 EXPECT_EQ((B[kk]>>1), bTmp16[kk]); | 207 EXPECT_EQ((B[kk]>>1), bTmp16[kk]); |
| 208 } | 208 } |
| 209 WebRtcSpl_VectorBitShiftW16(bTmp16, kVectorSize, b16, 1); | 209 WebRtcSpl_VectorBitShiftW16(bTmp16, kVectorSize, b16, 1); |
| 210 for (int kk = 0; kk < kVectorSize; ++kk) { | 210 for (size_t kk = 0; kk < kVectorSize; ++kk) { |
| 211 EXPECT_EQ((B[kk]>>1), bTmp16[kk]); | 211 EXPECT_EQ((B[kk]>>1), bTmp16[kk]); |
| 212 } | 212 } |
| 213 WebRtcSpl_VectorBitShiftW32(bTmp32, kVectorSize, b32, 1); | 213 WebRtcSpl_VectorBitShiftW32(bTmp32, kVectorSize, b32, 1); |
| 214 for (int kk = 0; kk < kVectorSize; ++kk) { | 214 for (size_t kk = 0; kk < kVectorSize; ++kk) { |
| 215 EXPECT_EQ((B[kk]>>1), bTmp32[kk]); | 215 EXPECT_EQ((B[kk]>>1), bTmp32[kk]); |
| 216 } | 216 } |
| 217 | 217 |
| 218 WebRtcSpl_MemCpyReversedOrder(&bTmp16[3], b16, kVectorSize); | 218 WebRtcSpl_MemCpyReversedOrder(&bTmp16[3], b16, kVectorSize); |
| 219 for (int kk = 0; kk < kVectorSize; ++kk) { | 219 for (size_t kk = 0; kk < kVectorSize; ++kk) { |
| 220 EXPECT_EQ(b16[3-kk], bTmp16[kk]); | 220 EXPECT_EQ(b16[3-kk], bTmp16[kk]); |
| 221 } | 221 } |
| 222 } | 222 } |
| 223 | 223 |
| 224 TEST_F(SplTest, ExeptionsHandlingMinMaxOperationsTest) { | 224 TEST_F(SplTest, ExeptionsHandlingMinMaxOperationsTest) { |
| 225 // Test how the functions handle exceptional cases. | 225 // Test how the functions handle exceptional cases. |
| 226 const int kVectorSize = 2; | 226 const size_t kVectorSize = 2; |
| 227 int16_t vector16[kVectorSize] = {0}; | 227 int16_t vector16[kVectorSize] = {0}; |
| 228 int32_t vector32[kVectorSize] = {0}; | 228 int32_t vector32[kVectorSize] = {0}; |
| 229 | 229 |
| 230 EXPECT_EQ(-1, WebRtcSpl_MaxAbsValueW16(vector16, 0)); | 230 EXPECT_EQ(-1, WebRtcSpl_MaxAbsValueW16(vector16, 0)); |
| 231 EXPECT_EQ(-1, WebRtcSpl_MaxAbsValueW16(NULL, kVectorSize)); | 231 EXPECT_EQ(-1, WebRtcSpl_MaxAbsValueW16(NULL, kVectorSize)); |
| 232 EXPECT_EQ(WEBRTC_SPL_WORD16_MIN, WebRtcSpl_MaxValueW16(vector16, 0)); | 232 EXPECT_EQ(WEBRTC_SPL_WORD16_MIN, WebRtcSpl_MaxValueW16(vector16, 0)); |
| 233 EXPECT_EQ(WEBRTC_SPL_WORD16_MIN, WebRtcSpl_MaxValueW16(NULL, kVectorSize)); | 233 EXPECT_EQ(WEBRTC_SPL_WORD16_MIN, WebRtcSpl_MaxValueW16(NULL, kVectorSize)); |
| 234 EXPECT_EQ(WEBRTC_SPL_WORD16_MAX, WebRtcSpl_MinValueW16(vector16, 0)); | 234 EXPECT_EQ(WEBRTC_SPL_WORD16_MAX, WebRtcSpl_MinValueW16(vector16, 0)); |
| 235 EXPECT_EQ(WEBRTC_SPL_WORD16_MAX, WebRtcSpl_MinValueW16(NULL, kVectorSize)); | 235 EXPECT_EQ(WEBRTC_SPL_WORD16_MAX, WebRtcSpl_MinValueW16(NULL, kVectorSize)); |
| 236 EXPECT_EQ(-1, WebRtcSpl_MaxAbsValueW32(vector32, 0)); | 236 EXPECT_EQ(-1, WebRtcSpl_MaxAbsValueW32(vector32, 0)); |
| 237 EXPECT_EQ(-1, WebRtcSpl_MaxAbsValueW32(NULL, kVectorSize)); | 237 EXPECT_EQ(-1, WebRtcSpl_MaxAbsValueW32(NULL, kVectorSize)); |
| 238 EXPECT_EQ(WEBRTC_SPL_WORD32_MIN, WebRtcSpl_MaxValueW32(vector32, 0)); | 238 EXPECT_EQ(WEBRTC_SPL_WORD32_MIN, WebRtcSpl_MaxValueW32(vector32, 0)); |
| 239 EXPECT_EQ(WEBRTC_SPL_WORD32_MIN, WebRtcSpl_MaxValueW32(NULL, kVectorSize)); | 239 EXPECT_EQ(WEBRTC_SPL_WORD32_MIN, WebRtcSpl_MaxValueW32(NULL, kVectorSize)); |
| 240 EXPECT_EQ(WEBRTC_SPL_WORD32_MAX, WebRtcSpl_MinValueW32(vector32, 0)); | 240 EXPECT_EQ(WEBRTC_SPL_WORD32_MAX, WebRtcSpl_MinValueW32(vector32, 0)); |
| 241 EXPECT_EQ(WEBRTC_SPL_WORD32_MAX, WebRtcSpl_MinValueW32(NULL, kVectorSize)); | 241 EXPECT_EQ(WEBRTC_SPL_WORD32_MAX, WebRtcSpl_MinValueW32(NULL, kVectorSize)); |
| 242 EXPECT_EQ(-1, WebRtcSpl_MaxAbsIndexW16(vector16, 0)); | 242 EXPECT_EQ(-1, WebRtcSpl_MaxAbsIndexW16(vector16, 0)); |
| 243 EXPECT_EQ(-1, WebRtcSpl_MaxAbsIndexW16(NULL, kVectorSize)); | 243 EXPECT_EQ(-1, WebRtcSpl_MaxAbsIndexW16(NULL, kVectorSize)); |
| 244 EXPECT_EQ(-1, WebRtcSpl_MaxIndexW16(vector16, 0)); | 244 EXPECT_EQ(-1, WebRtcSpl_MaxIndexW16(vector16, 0)); |
| 245 EXPECT_EQ(-1, WebRtcSpl_MaxIndexW16(NULL, kVectorSize)); | 245 EXPECT_EQ(-1, WebRtcSpl_MaxIndexW16(NULL, kVectorSize)); |
| 246 EXPECT_EQ(-1, WebRtcSpl_MaxIndexW32(vector32, 0)); | 246 EXPECT_EQ(-1, WebRtcSpl_MaxIndexW32(vector32, 0)); |
| 247 EXPECT_EQ(-1, WebRtcSpl_MaxIndexW32(NULL, kVectorSize)); | 247 EXPECT_EQ(-1, WebRtcSpl_MaxIndexW32(NULL, kVectorSize)); |
| 248 EXPECT_EQ(-1, WebRtcSpl_MinIndexW16(vector16, 0)); | 248 EXPECT_EQ(-1, WebRtcSpl_MinIndexW16(vector16, 0)); |
| 249 EXPECT_EQ(-1, WebRtcSpl_MinIndexW16(NULL, kVectorSize)); | 249 EXPECT_EQ(-1, WebRtcSpl_MinIndexW16(NULL, kVectorSize)); |
| 250 EXPECT_EQ(-1, WebRtcSpl_MinIndexW32(vector32, 0)); | 250 EXPECT_EQ(-1, WebRtcSpl_MinIndexW32(vector32, 0)); |
| 251 EXPECT_EQ(-1, WebRtcSpl_MinIndexW32(NULL, kVectorSize)); | 251 EXPECT_EQ(-1, WebRtcSpl_MinIndexW32(NULL, kVectorSize)); |
| 252 } | 252 } |
| 253 | 253 |
| 254 TEST_F(SplTest, MinMaxOperationsTest) { | 254 TEST_F(SplTest, MinMaxOperationsTest) { |
| 255 const int kVectorSize = 17; | 255 const size_t kVectorSize = 17; |
| 256 | 256 |
| 257 // Vectors to test the cases where minimum values have to be caught | 257 // Vectors to test the cases where minimum values have to be caught |
| 258 // outside of the unrolled loops in ARM-Neon. | 258 // outside of the unrolled loops in ARM-Neon. |
| 259 int16_t vector16[kVectorSize] = {-1, 7485, 0, 3333, | 259 int16_t vector16[kVectorSize] = {-1, 7485, 0, 3333, |
| 260 -18283, 0, 12334, -29871, 988, -3333, | 260 -18283, 0, 12334, -29871, 988, -3333, |
| 261 345, -456, 222, 999, 888, 8774, WEBRTC_SPL_WORD16_MIN}; | 261 345, -456, 222, 999, 888, 8774, WEBRTC_SPL_WORD16_MIN}; |
| 262 int32_t vector32[kVectorSize] = {-1, 0, 283211, 3333, | 262 int32_t vector32[kVectorSize] = {-1, 0, 283211, 3333, |
| 263 8712345, 0, -3333, 89345, -374585456, 222, 999, 122345334, | 263 8712345, 0, -3333, 89345, -374585456, 222, 999, 122345334, |
| 264 -12389756, -987329871, 888, -2, WEBRTC_SPL_WORD32_MIN}; | 264 -12389756, -987329871, 888, -2, WEBRTC_SPL_WORD32_MIN}; |
| 265 | 265 |
| 266 EXPECT_EQ(WEBRTC_SPL_WORD16_MIN, | 266 EXPECT_EQ(WEBRTC_SPL_WORD16_MIN, |
| 267 WebRtcSpl_MinValueW16(vector16, kVectorSize)); | 267 WebRtcSpl_MinValueW16(vector16, kVectorSize)); |
| 268 EXPECT_EQ(WEBRTC_SPL_WORD32_MIN, | 268 EXPECT_EQ(WEBRTC_SPL_WORD32_MIN, |
| 269 WebRtcSpl_MinValueW32(vector32, kVectorSize)); | 269 WebRtcSpl_MinValueW32(vector32, kVectorSize)); |
| 270 EXPECT_EQ(kVectorSize - 1, WebRtcSpl_MinIndexW16(vector16, kVectorSize)); | 270 EXPECT_EQ(static_cast<int>(kVectorSize - 1), |
| 271 EXPECT_EQ(kVectorSize - 1, WebRtcSpl_MinIndexW32(vector32, kVectorSize)); | 271 WebRtcSpl_MinIndexW16(vector16, kVectorSize)); |
| 272 EXPECT_EQ(static_cast<int>(kVectorSize - 1), |
| 273 WebRtcSpl_MinIndexW32(vector32, kVectorSize)); |
| 272 | 274 |
| 273 // Test the cases where maximum values have to be caught | 275 // Test the cases where maximum values have to be caught |
| 274 // outside of the unrolled loops in ARM-Neon. | 276 // outside of the unrolled loops in ARM-Neon. |
| 275 vector16[kVectorSize - 1] = WEBRTC_SPL_WORD16_MAX; | 277 vector16[kVectorSize - 1] = WEBRTC_SPL_WORD16_MAX; |
| 276 vector32[kVectorSize - 1] = WEBRTC_SPL_WORD32_MAX; | 278 vector32[kVectorSize - 1] = WEBRTC_SPL_WORD32_MAX; |
| 277 | 279 |
| 278 EXPECT_EQ(WEBRTC_SPL_WORD16_MAX, | 280 EXPECT_EQ(WEBRTC_SPL_WORD16_MAX, |
| 279 WebRtcSpl_MaxAbsValueW16(vector16, kVectorSize)); | 281 WebRtcSpl_MaxAbsValueW16(vector16, kVectorSize)); |
| 280 EXPECT_EQ(WEBRTC_SPL_WORD16_MAX, | 282 EXPECT_EQ(WEBRTC_SPL_WORD16_MAX, |
| 281 WebRtcSpl_MaxValueW16(vector16, kVectorSize)); | 283 WebRtcSpl_MaxValueW16(vector16, kVectorSize)); |
| 282 EXPECT_EQ(WEBRTC_SPL_WORD32_MAX, | 284 EXPECT_EQ(WEBRTC_SPL_WORD32_MAX, |
| 283 WebRtcSpl_MaxAbsValueW32(vector32, kVectorSize)); | 285 WebRtcSpl_MaxAbsValueW32(vector32, kVectorSize)); |
| 284 EXPECT_EQ(WEBRTC_SPL_WORD32_MAX, | 286 EXPECT_EQ(WEBRTC_SPL_WORD32_MAX, |
| 285 WebRtcSpl_MaxValueW32(vector32, kVectorSize)); | 287 WebRtcSpl_MaxValueW32(vector32, kVectorSize)); |
| 286 EXPECT_EQ(kVectorSize - 1, WebRtcSpl_MaxAbsIndexW16(vector16, kVectorSize)); | 288 EXPECT_EQ(static_cast<int>(kVectorSize - 1), |
| 287 EXPECT_EQ(kVectorSize - 1, WebRtcSpl_MaxIndexW16(vector16, kVectorSize)); | 289 WebRtcSpl_MaxAbsIndexW16(vector16, kVectorSize)); |
| 288 EXPECT_EQ(kVectorSize - 1, WebRtcSpl_MaxIndexW32(vector32, kVectorSize)); | 290 EXPECT_EQ(static_cast<int>(kVectorSize - 1), |
| 291 WebRtcSpl_MaxIndexW16(vector16, kVectorSize)); |
| 292 EXPECT_EQ(static_cast<int>(kVectorSize - 1), |
| 293 WebRtcSpl_MaxIndexW32(vector32, kVectorSize)); |
| 289 | 294 |
| 290 // Test the cases where multiple maximum and minimum values are present. | 295 // Test the cases where multiple maximum and minimum values are present. |
| 291 vector16[1] = WEBRTC_SPL_WORD16_MAX; | 296 vector16[1] = WEBRTC_SPL_WORD16_MAX; |
| 292 vector16[6] = WEBRTC_SPL_WORD16_MIN; | 297 vector16[6] = WEBRTC_SPL_WORD16_MIN; |
| 293 vector16[11] = WEBRTC_SPL_WORD16_MIN; | 298 vector16[11] = WEBRTC_SPL_WORD16_MIN; |
| 294 vector32[1] = WEBRTC_SPL_WORD32_MAX; | 299 vector32[1] = WEBRTC_SPL_WORD32_MAX; |
| 295 vector32[6] = WEBRTC_SPL_WORD32_MIN; | 300 vector32[6] = WEBRTC_SPL_WORD32_MIN; |
| 296 vector32[11] = WEBRTC_SPL_WORD32_MIN; | 301 vector32[11] = WEBRTC_SPL_WORD32_MIN; |
| 297 | 302 |
| 298 EXPECT_EQ(WEBRTC_SPL_WORD16_MAX, | 303 EXPECT_EQ(WEBRTC_SPL_WORD16_MAX, |
| 299 WebRtcSpl_MaxAbsValueW16(vector16, kVectorSize)); | 304 WebRtcSpl_MaxAbsValueW16(vector16, kVectorSize)); |
| 300 EXPECT_EQ(WEBRTC_SPL_WORD16_MAX, | 305 EXPECT_EQ(WEBRTC_SPL_WORD16_MAX, |
| 301 WebRtcSpl_MaxValueW16(vector16, kVectorSize)); | 306 WebRtcSpl_MaxValueW16(vector16, kVectorSize)); |
| 302 EXPECT_EQ(WEBRTC_SPL_WORD16_MIN, | 307 EXPECT_EQ(WEBRTC_SPL_WORD16_MIN, |
| 303 WebRtcSpl_MinValueW16(vector16, kVectorSize)); | 308 WebRtcSpl_MinValueW16(vector16, kVectorSize)); |
| 304 EXPECT_EQ(WEBRTC_SPL_WORD32_MAX, | 309 EXPECT_EQ(WEBRTC_SPL_WORD32_MAX, |
| 305 WebRtcSpl_MaxAbsValueW32(vector32, kVectorSize)); | 310 WebRtcSpl_MaxAbsValueW32(vector32, kVectorSize)); |
| 306 EXPECT_EQ(WEBRTC_SPL_WORD32_MAX, | 311 EXPECT_EQ(WEBRTC_SPL_WORD32_MAX, |
| 307 WebRtcSpl_MaxValueW32(vector32, kVectorSize)); | 312 WebRtcSpl_MaxValueW32(vector32, kVectorSize)); |
| 308 EXPECT_EQ(WEBRTC_SPL_WORD32_MIN, | 313 EXPECT_EQ(WEBRTC_SPL_WORD32_MIN, |
| 309 WebRtcSpl_MinValueW32(vector32, kVectorSize)); | 314 WebRtcSpl_MinValueW32(vector32, kVectorSize)); |
| 310 EXPECT_EQ(6, WebRtcSpl_MaxAbsIndexW16(vector16, kVectorSize)); | 315 EXPECT_EQ(6, WebRtcSpl_MaxAbsIndexW16(vector16, kVectorSize)); |
| 311 EXPECT_EQ(1, WebRtcSpl_MaxIndexW16(vector16, kVectorSize)); | 316 EXPECT_EQ(1, WebRtcSpl_MaxIndexW16(vector16, kVectorSize)); |
| 312 EXPECT_EQ(1, WebRtcSpl_MaxIndexW32(vector32, kVectorSize)); | 317 EXPECT_EQ(1, WebRtcSpl_MaxIndexW32(vector32, kVectorSize)); |
| 313 EXPECT_EQ(6, WebRtcSpl_MinIndexW16(vector16, kVectorSize)); | 318 EXPECT_EQ(6, WebRtcSpl_MinIndexW16(vector16, kVectorSize)); |
| 314 EXPECT_EQ(6, WebRtcSpl_MinIndexW32(vector32, kVectorSize)); | 319 EXPECT_EQ(6, WebRtcSpl_MinIndexW32(vector32, kVectorSize)); |
| 315 } | 320 } |
| 316 | 321 |
| 317 TEST_F(SplTest, VectorOperationsTest) { | 322 TEST_F(SplTest, VectorOperationsTest) { |
| 318 const int kVectorSize = 4; | 323 const size_t kVectorSize = 4; |
| 319 int B[] = {4, 12, 133, 1100}; | 324 int B[] = {4, 12, 133, 1100}; |
| 320 int16_t a16[kVectorSize]; | 325 int16_t a16[kVectorSize]; |
| 321 int16_t b16[kVectorSize]; | 326 int16_t b16[kVectorSize]; |
| 322 int16_t bTmp16[kVectorSize]; | 327 int16_t bTmp16[kVectorSize]; |
| 323 | 328 |
| 324 for (int kk = 0; kk < kVectorSize; ++kk) { | 329 for (size_t kk = 0; kk < kVectorSize; ++kk) { |
| 325 a16[kk] = B[kk]; | 330 a16[kk] = B[kk]; |
| 326 b16[kk] = B[kk]; | 331 b16[kk] = B[kk]; |
| 327 } | 332 } |
| 328 | 333 |
| 329 WebRtcSpl_AffineTransformVector(bTmp16, b16, 3, 7, 2, kVectorSize); | 334 WebRtcSpl_AffineTransformVector(bTmp16, b16, 3, 7, 2, kVectorSize); |
| 330 for (int kk = 0; kk < kVectorSize; ++kk) { | 335 for (size_t kk = 0; kk < kVectorSize; ++kk) { |
| 331 EXPECT_EQ((B[kk]*3+7)>>2, bTmp16[kk]); | 336 EXPECT_EQ((B[kk]*3+7)>>2, bTmp16[kk]); |
| 332 } | 337 } |
| 333 WebRtcSpl_ScaleAndAddVectorsWithRound(b16, 3, b16, 2, 2, bTmp16, kVectorSize
); | 338 WebRtcSpl_ScaleAndAddVectorsWithRound(b16, 3, b16, 2, 2, bTmp16, kVectorSize
); |
| 334 for (int kk = 0; kk < kVectorSize; ++kk) { | 339 for (size_t kk = 0; kk < kVectorSize; ++kk) { |
| 335 EXPECT_EQ((B[kk]*3+B[kk]*2+2)>>2, bTmp16[kk]); | 340 EXPECT_EQ((B[kk]*3+B[kk]*2+2)>>2, bTmp16[kk]); |
| 336 } | 341 } |
| 337 | 342 |
| 338 WebRtcSpl_AddAffineVectorToVector(bTmp16, b16, 3, 7, 2, kVectorSize); | 343 WebRtcSpl_AddAffineVectorToVector(bTmp16, b16, 3, 7, 2, kVectorSize); |
| 339 for (int kk = 0; kk < kVectorSize; ++kk) { | 344 for (size_t kk = 0; kk < kVectorSize; ++kk) { |
| 340 EXPECT_EQ(((B[kk]*3+B[kk]*2+2)>>2)+((b16[kk]*3+7)>>2), bTmp16[kk]); | 345 EXPECT_EQ(((B[kk]*3+B[kk]*2+2)>>2)+((b16[kk]*3+7)>>2), bTmp16[kk]); |
| 341 } | 346 } |
| 342 | 347 |
| 343 WebRtcSpl_ScaleVector(b16, bTmp16, 13, kVectorSize, 2); | 348 WebRtcSpl_ScaleVector(b16, bTmp16, 13, kVectorSize, 2); |
| 344 for (int kk = 0; kk < kVectorSize; ++kk) { | 349 for (size_t kk = 0; kk < kVectorSize; ++kk) { |
| 345 EXPECT_EQ((b16[kk]*13)>>2, bTmp16[kk]); | 350 EXPECT_EQ((b16[kk]*13)>>2, bTmp16[kk]); |
| 346 } | 351 } |
| 347 WebRtcSpl_ScaleVectorWithSat(b16, bTmp16, 13, kVectorSize, 2); | 352 WebRtcSpl_ScaleVectorWithSat(b16, bTmp16, 13, kVectorSize, 2); |
| 348 for (int kk = 0; kk < kVectorSize; ++kk) { | 353 for (size_t kk = 0; kk < kVectorSize; ++kk) { |
| 349 EXPECT_EQ((b16[kk]*13)>>2, bTmp16[kk]); | 354 EXPECT_EQ((b16[kk]*13)>>2, bTmp16[kk]); |
| 350 } | 355 } |
| 351 WebRtcSpl_ScaleAndAddVectors(a16, 13, 2, b16, 7, 2, bTmp16, kVectorSize); | 356 WebRtcSpl_ScaleAndAddVectors(a16, 13, 2, b16, 7, 2, bTmp16, kVectorSize); |
| 352 for (int kk = 0; kk < kVectorSize; ++kk) { | 357 for (size_t kk = 0; kk < kVectorSize; ++kk) { |
| 353 EXPECT_EQ(((a16[kk]*13)>>2)+((b16[kk]*7)>>2), bTmp16[kk]); | 358 EXPECT_EQ(((a16[kk]*13)>>2)+((b16[kk]*7)>>2), bTmp16[kk]); |
| 354 } | 359 } |
| 355 | 360 |
| 356 WebRtcSpl_AddVectorsAndShift(bTmp16, a16, b16, kVectorSize, 2); | 361 WebRtcSpl_AddVectorsAndShift(bTmp16, a16, b16, kVectorSize, 2); |
| 357 for (int kk = 0; kk < kVectorSize; ++kk) { | 362 for (size_t kk = 0; kk < kVectorSize; ++kk) { |
| 358 EXPECT_EQ(B[kk] >> 1, bTmp16[kk]); | 363 EXPECT_EQ(B[kk] >> 1, bTmp16[kk]); |
| 359 } | 364 } |
| 360 WebRtcSpl_ReverseOrderMultArrayElements(bTmp16, a16, &b16[3], kVectorSize, 2
); | 365 WebRtcSpl_ReverseOrderMultArrayElements(bTmp16, a16, &b16[3], kVectorSize, 2
); |
| 361 for (int kk = 0; kk < kVectorSize; ++kk) { | 366 for (size_t kk = 0; kk < kVectorSize; ++kk) { |
| 362 EXPECT_EQ((a16[kk]*b16[3-kk])>>2, bTmp16[kk]); | 367 EXPECT_EQ((a16[kk]*b16[3-kk])>>2, bTmp16[kk]); |
| 363 } | 368 } |
| 364 WebRtcSpl_ElementwiseVectorMult(bTmp16, a16, b16, kVectorSize, 6); | 369 WebRtcSpl_ElementwiseVectorMult(bTmp16, a16, b16, kVectorSize, 6); |
| 365 for (int kk = 0; kk < kVectorSize; ++kk) { | 370 for (size_t kk = 0; kk < kVectorSize; ++kk) { |
| 366 EXPECT_EQ((a16[kk]*b16[kk])>>6, bTmp16[kk]); | 371 EXPECT_EQ((a16[kk]*b16[kk])>>6, bTmp16[kk]); |
| 367 } | 372 } |
| 368 | 373 |
| 369 WebRtcSpl_SqrtOfOneMinusXSquared(b16, kVectorSize, bTmp16); | 374 WebRtcSpl_SqrtOfOneMinusXSquared(b16, kVectorSize, bTmp16); |
| 370 for (int kk = 0; kk < kVectorSize - 1; ++kk) { | 375 for (size_t kk = 0; kk < kVectorSize - 1; ++kk) { |
| 371 EXPECT_EQ(32767, bTmp16[kk]); | 376 EXPECT_EQ(32767, bTmp16[kk]); |
| 372 } | 377 } |
| 373 EXPECT_EQ(32749, bTmp16[kVectorSize - 1]); | 378 EXPECT_EQ(32749, bTmp16[kVectorSize - 1]); |
| 374 | 379 |
| 375 EXPECT_EQ(0, WebRtcSpl_GetScalingSquare(b16, kVectorSize, 1)); | 380 EXPECT_EQ(0, WebRtcSpl_GetScalingSquare(b16, kVectorSize, 1)); |
| 376 } | 381 } |
| 377 | 382 |
| 378 TEST_F(SplTest, EstimatorsTest) { | 383 TEST_F(SplTest, EstimatorsTest) { |
| 379 const int16_t kOrder = 2; | 384 const size_t kOrder = 2; |
| 380 const int32_t unstable_filter[] = { 4, 12, 133, 1100 }; | 385 const int32_t unstable_filter[] = { 4, 12, 133, 1100 }; |
| 381 const int32_t stable_filter[] = { 1100, 133, 12, 4 }; | 386 const int32_t stable_filter[] = { 1100, 133, 12, 4 }; |
| 382 int16_t lpc[kOrder + 2] = { 0 }; | 387 int16_t lpc[kOrder + 2] = { 0 }; |
| 383 int16_t refl[kOrder + 2] = { 0 }; | 388 int16_t refl[kOrder + 2] = { 0 }; |
| 384 int16_t lpc_result[] = { 4096, -497, 15, 0 }; | 389 int16_t lpc_result[] = { 4096, -497, 15, 0 }; |
| 385 int16_t refl_result[] = { -3962, 123, 0, 0 }; | 390 int16_t refl_result[] = { -3962, 123, 0, 0 }; |
| 386 | 391 |
| 387 EXPECT_EQ(0, WebRtcSpl_LevinsonDurbin(unstable_filter, lpc, refl, kOrder)); | 392 EXPECT_EQ(0, WebRtcSpl_LevinsonDurbin(unstable_filter, lpc, refl, kOrder)); |
| 388 EXPECT_EQ(1, WebRtcSpl_LevinsonDurbin(stable_filter, lpc, refl, kOrder)); | 393 EXPECT_EQ(1, WebRtcSpl_LevinsonDurbin(stable_filter, lpc, refl, kOrder)); |
| 389 for (int i = 0; i < kOrder + 2; ++i) { | 394 for (size_t i = 0; i < kOrder + 2; ++i) { |
| 390 EXPECT_EQ(lpc_result[i], lpc[i]); | 395 EXPECT_EQ(lpc_result[i], lpc[i]); |
| 391 EXPECT_EQ(refl_result[i], refl[i]); | 396 EXPECT_EQ(refl_result[i], refl[i]); |
| 392 } | 397 } |
| 393 } | 398 } |
| 394 | 399 |
| 395 TEST_F(SplTest, FilterTest) { | 400 TEST_F(SplTest, FilterTest) { |
| 396 const int kVectorSize = 4; | 401 const size_t kVectorSize = 4; |
| 397 const int kFilterOrder = 3; | 402 const size_t kFilterOrder = 3; |
| 398 int16_t A[] = {1, 2, 33, 100}; | 403 int16_t A[] = {1, 2, 33, 100}; |
| 399 int16_t A5[] = {1, 2, 33, 100, -5}; | 404 int16_t A5[] = {1, 2, 33, 100, -5}; |
| 400 int16_t B[] = {4, 12, 133, 110}; | 405 int16_t B[] = {4, 12, 133, 110}; |
| 401 int16_t data_in[kVectorSize]; | 406 int16_t data_in[kVectorSize]; |
| 402 int16_t data_out[kVectorSize]; | 407 int16_t data_out[kVectorSize]; |
| 403 int16_t bTmp16Low[kVectorSize]; | 408 int16_t bTmp16Low[kVectorSize]; |
| 404 int16_t bState[kVectorSize]; | 409 int16_t bState[kVectorSize]; |
| 405 int16_t bStateLow[kVectorSize]; | 410 int16_t bStateLow[kVectorSize]; |
| 406 | 411 |
| 407 WebRtcSpl_ZerosArrayW16(bState, kVectorSize); | 412 WebRtcSpl_ZerosArrayW16(bState, kVectorSize); |
| 408 WebRtcSpl_ZerosArrayW16(bStateLow, kVectorSize); | 413 WebRtcSpl_ZerosArrayW16(bStateLow, kVectorSize); |
| 409 | 414 |
| 410 for (int kk = 0; kk < kVectorSize; ++kk) { | 415 for (size_t kk = 0; kk < kVectorSize; ++kk) { |
| 411 data_in[kk] = A[kk]; | 416 data_in[kk] = A[kk]; |
| 412 data_out[kk] = 0; | 417 data_out[kk] = 0; |
| 413 } | 418 } |
| 414 | 419 |
| 415 // MA filters. | 420 // MA filters. |
| 416 // Note that the input data has |kFilterOrder| states before the actual | 421 // Note that the input data has |kFilterOrder| states before the actual |
| 417 // data (one sample). | 422 // data (one sample). |
| 418 WebRtcSpl_FilterMAFastQ12(&data_in[kFilterOrder], data_out, B, | 423 WebRtcSpl_FilterMAFastQ12(&data_in[kFilterOrder], data_out, B, |
| 419 kFilterOrder + 1, 1); | 424 kFilterOrder + 1, 1); |
| 420 EXPECT_EQ(0, data_out[0]); | 425 EXPECT_EQ(0, data_out[0]); |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 453 } | 458 } |
| 454 } | 459 } |
| 455 | 460 |
| 456 TEST_F(SplTest, DotProductWithScaleTest) { | 461 TEST_F(SplTest, DotProductWithScaleTest) { |
| 457 EXPECT_EQ(605362796, WebRtcSpl_DotProductWithScale(vector16, | 462 EXPECT_EQ(605362796, WebRtcSpl_DotProductWithScale(vector16, |
| 458 vector16, kVector16Size, 2)); | 463 vector16, kVector16Size, 2)); |
| 459 } | 464 } |
| 460 | 465 |
| 461 TEST_F(SplTest, CrossCorrelationTest) { | 466 TEST_F(SplTest, CrossCorrelationTest) { |
| 462 // Note the function arguments relation specificed by API. | 467 // Note the function arguments relation specificed by API. |
| 463 const int kCrossCorrelationDimension = 3; | 468 const size_t kCrossCorrelationDimension = 3; |
| 464 const int kShift = 2; | 469 const int kShift = 2; |
| 465 const int kStep = 1; | 470 const int kStep = 1; |
| 466 const int kSeqDimension = 6; | 471 const size_t kSeqDimension = 6; |
| 467 | 472 |
| 468 const int16_t kVector16[kVector16Size] = {1, 4323, 1963, | 473 const int16_t kVector16[kVector16Size] = {1, 4323, 1963, |
| 469 WEBRTC_SPL_WORD16_MAX, WEBRTC_SPL_WORD16_MIN + 5, -3333, -876, 8483, 142}; | 474 WEBRTC_SPL_WORD16_MAX, WEBRTC_SPL_WORD16_MIN + 5, -3333, -876, 8483, 142}; |
| 470 int32_t vector32[kCrossCorrelationDimension] = {0}; | 475 int32_t vector32[kCrossCorrelationDimension] = {0}; |
| 471 | 476 |
| 472 WebRtcSpl_CrossCorrelation(vector32, vector16, kVector16, kSeqDimension, | 477 WebRtcSpl_CrossCorrelation(vector32, vector16, kVector16, kSeqDimension, |
| 473 kCrossCorrelationDimension, kShift, kStep); | 478 kCrossCorrelationDimension, kShift, kStep); |
| 474 | 479 |
| 475 // WebRtcSpl_CrossCorrelationC() and WebRtcSpl_CrossCorrelationNeon() | 480 // WebRtcSpl_CrossCorrelationC() and WebRtcSpl_CrossCorrelationNeon() |
| 476 // are not bit-exact. | 481 // are not bit-exact. |
| 477 const int32_t kExpected[kCrossCorrelationDimension] = | 482 const int32_t kExpected[kCrossCorrelationDimension] = |
| 478 {-266947903, -15579555, -171282001}; | 483 {-266947903, -15579555, -171282001}; |
| 479 const int32_t* expected = kExpected; | 484 const int32_t* expected = kExpected; |
| 480 #if !defined(MIPS32_LE) | 485 #if !defined(MIPS32_LE) |
| 481 const int32_t kExpectedNeon[kCrossCorrelationDimension] = | 486 const int32_t kExpectedNeon[kCrossCorrelationDimension] = |
| 482 {-266947901, -15579553, -171281999}; | 487 {-266947901, -15579553, -171281999}; |
| 483 if (WebRtcSpl_CrossCorrelation != WebRtcSpl_CrossCorrelationC) { | 488 if (WebRtcSpl_CrossCorrelation != WebRtcSpl_CrossCorrelationC) { |
| 484 expected = kExpectedNeon; | 489 expected = kExpectedNeon; |
| 485 } | 490 } |
| 486 #endif | 491 #endif |
| 487 for (int i = 0; i < kCrossCorrelationDimension; ++i) { | 492 for (size_t i = 0; i < kCrossCorrelationDimension; ++i) { |
| 488 EXPECT_EQ(expected[i], vector32[i]); | 493 EXPECT_EQ(expected[i], vector32[i]); |
| 489 } | 494 } |
| 490 } | 495 } |
| 491 | 496 |
| 492 TEST_F(SplTest, AutoCorrelationTest) { | 497 TEST_F(SplTest, AutoCorrelationTest) { |
| 493 int scale = 0; | 498 int scale = 0; |
| 494 int32_t vector32[kVector16Size]; | 499 int32_t vector32[kVector16Size]; |
| 495 const int32_t expected[kVector16Size] = {302681398, 14223410, -121705063, | 500 const int32_t expected[kVector16Size] = {302681398, 14223410, -121705063, |
| 496 -85221647, -17104971, 61806945, 6644603, -669329, 43}; | 501 -85221647, -17104971, 61806945, 6644603, -669329, 43}; |
| 497 | 502 |
| 498 EXPECT_EQ(-1, WebRtcSpl_AutoCorrelation(vector16, kVector16Size, | 503 EXPECT_EQ(-1, WebRtcSpl_AutoCorrelation(vector16, kVector16Size, |
| 499 kVector16Size + 1, vector32, &scale)); | 504 kVector16Size + 1, vector32, &scale)); |
| 500 EXPECT_EQ(kVector16Size, | 505 EXPECT_EQ(static_cast<int>(kVector16Size), |
| 501 WebRtcSpl_AutoCorrelation(vector16, kVector16Size, | 506 WebRtcSpl_AutoCorrelation(vector16, kVector16Size, |
| 502 kVector16Size - 1, vector32, &scale)); | 507 kVector16Size - 1, vector32, &scale)); |
| 503 EXPECT_EQ(3, scale); | 508 EXPECT_EQ(3, scale); |
| 504 for (int i = 0; i < kVector16Size; ++i) { | 509 for (size_t i = 0; i < kVector16Size; ++i) { |
| 505 EXPECT_EQ(expected[i], vector32[i]); | 510 EXPECT_EQ(expected[i], vector32[i]); |
| 506 } | 511 } |
| 507 } | 512 } |
| 508 | 513 |
| 509 TEST_F(SplTest, SignalProcessingTest) { | 514 TEST_F(SplTest, SignalProcessingTest) { |
| 510 const int kVectorSize = 4; | 515 const size_t kVectorSize = 4; |
| 511 int A[] = {1, 2, 33, 100}; | 516 int A[] = {1, 2, 33, 100}; |
| 512 const int16_t kHanning[4] = { 2399, 8192, 13985, 16384 }; | 517 const int16_t kHanning[4] = { 2399, 8192, 13985, 16384 }; |
| 513 int16_t b16[kVectorSize]; | 518 int16_t b16[kVectorSize]; |
| 514 | 519 |
| 515 int16_t bTmp16[kVectorSize]; | 520 int16_t bTmp16[kVectorSize]; |
| 516 | 521 |
| 517 int bScale = 0; | 522 int bScale = 0; |
| 518 | 523 |
| 519 for (int kk = 0; kk < kVectorSize; ++kk) { | 524 for (size_t kk = 0; kk < kVectorSize; ++kk) { |
| 520 b16[kk] = A[kk]; | 525 b16[kk] = A[kk]; |
| 521 } | 526 } |
| 522 | 527 |
| 523 // TODO(bjornv): Activate the Reflection Coefficient tests when refactoring. | 528 // TODO(bjornv): Activate the Reflection Coefficient tests when refactoring. |
| 524 // WebRtcSpl_ReflCoefToLpc(b16, kVectorSize, bTmp16); | 529 // WebRtcSpl_ReflCoefToLpc(b16, kVectorSize, bTmp16); |
| 525 //// for (int kk = 0; kk < kVectorSize; ++kk) { | 530 //// for (int kk = 0; kk < kVectorSize; ++kk) { |
| 526 //// EXPECT_EQ(aTmp16[kk], bTmp16[kk]); | 531 //// EXPECT_EQ(aTmp16[kk], bTmp16[kk]); |
| 527 //// } | 532 //// } |
| 528 // WebRtcSpl_LpcToReflCoef(bTmp16, kVectorSize, b16); | 533 // WebRtcSpl_LpcToReflCoef(bTmp16, kVectorSize, b16); |
| 529 //// for (int kk = 0; kk < kVectorSize; ++kk) { | 534 //// for (int kk = 0; kk < kVectorSize; ++kk) { |
| 530 //// EXPECT_EQ(a16[kk], b16[kk]); | 535 //// EXPECT_EQ(a16[kk], b16[kk]); |
| 531 //// } | 536 //// } |
| 532 // WebRtcSpl_AutoCorrToReflCoef(b32, kVectorSize, bTmp16); | 537 // WebRtcSpl_AutoCorrToReflCoef(b32, kVectorSize, bTmp16); |
| 533 //// for (int kk = 0; kk < kVectorSize; ++kk) { | 538 //// for (int kk = 0; kk < kVectorSize; ++kk) { |
| 534 //// EXPECT_EQ(aTmp16[kk], bTmp16[kk]); | 539 //// EXPECT_EQ(aTmp16[kk], bTmp16[kk]); |
| 535 //// } | 540 //// } |
| 536 | 541 |
| 537 WebRtcSpl_GetHanningWindow(bTmp16, kVectorSize); | 542 WebRtcSpl_GetHanningWindow(bTmp16, kVectorSize); |
| 538 for (int kk = 0; kk < kVectorSize; ++kk) { | 543 for (size_t kk = 0; kk < kVectorSize; ++kk) { |
| 539 EXPECT_EQ(kHanning[kk], bTmp16[kk]); | 544 EXPECT_EQ(kHanning[kk], bTmp16[kk]); |
| 540 } | 545 } |
| 541 | 546 |
| 542 for (int kk = 0; kk < kVectorSize; ++kk) { | 547 for (size_t kk = 0; kk < kVectorSize; ++kk) { |
| 543 b16[kk] = A[kk]; | 548 b16[kk] = A[kk]; |
| 544 } | 549 } |
| 545 EXPECT_EQ(11094 , WebRtcSpl_Energy(b16, kVectorSize, &bScale)); | 550 EXPECT_EQ(11094 , WebRtcSpl_Energy(b16, kVectorSize, &bScale)); |
| 546 EXPECT_EQ(0, bScale); | 551 EXPECT_EQ(0, bScale); |
| 547 } | 552 } |
| 548 | 553 |
| 549 TEST_F(SplTest, FFTTest) { | 554 TEST_F(SplTest, FFTTest) { |
| 550 int16_t B[] = {1, 2, 33, 100, | 555 int16_t B[] = {1, 2, 33, 100, |
| 551 2, 3, 34, 101, | 556 2, 3, 34, 101, |
| 552 3, 4, 35, 102, | 557 3, 4, 35, 102, |
| 553 4, 5, 36, 103}; | 558 4, 5, 36, 103}; |
| 554 | 559 |
| 555 EXPECT_EQ(0, WebRtcSpl_ComplexFFT(B, 3, 1)); | 560 EXPECT_EQ(0, WebRtcSpl_ComplexFFT(B, 3, 1)); |
| 556 // for (int kk = 0; kk < 16; ++kk) { | 561 // for (int kk = 0; kk < 16; ++kk) { |
| 557 // EXPECT_EQ(A[kk], B[kk]); | 562 // EXPECT_EQ(A[kk], B[kk]); |
| 558 // } | 563 // } |
| 559 EXPECT_EQ(0, WebRtcSpl_ComplexIFFT(B, 3, 1)); | 564 EXPECT_EQ(0, WebRtcSpl_ComplexIFFT(B, 3, 1)); |
| 560 // for (int kk = 0; kk < 16; ++kk) { | 565 // for (int kk = 0; kk < 16; ++kk) { |
| 561 // EXPECT_EQ(A[kk], B[kk]); | 566 // EXPECT_EQ(A[kk], B[kk]); |
| 562 // } | 567 // } |
| 563 WebRtcSpl_ComplexBitReverse(B, 3); | 568 WebRtcSpl_ComplexBitReverse(B, 3); |
| 564 for (int kk = 0; kk < 16; ++kk) { | 569 for (int kk = 0; kk < 16; ++kk) { |
| 565 //EXPECT_EQ(A[kk], B[kk]); | 570 //EXPECT_EQ(A[kk], B[kk]); |
| 566 } | 571 } |
| 567 } | 572 } |
| 568 | 573 |
| 569 TEST_F(SplTest, Resample48WithSaturationTest) { | 574 TEST_F(SplTest, Resample48WithSaturationTest) { |
| 570 // The test resamples 3*kBlockSize number of samples to 2*kBlockSize number | 575 // The test resamples 3*kBlockSize number of samples to 2*kBlockSize number |
| 571 // of samples. | 576 // of samples. |
| 572 const int kBlockSize = 16; | 577 const size_t kBlockSize = 16; |
| 573 | 578 |
| 574 // Saturated input vector of 48 samples. | 579 // Saturated input vector of 48 samples. |
| 575 const int32_t kVectorSaturated[3 * kBlockSize + 7] = { | 580 const int32_t kVectorSaturated[3 * kBlockSize + 7] = { |
| 576 -32768, -32768, -32768, -32768, -32768, -32768, -32768, -32768, | 581 -32768, -32768, -32768, -32768, -32768, -32768, -32768, -32768, |
| 577 -32768, -32768, -32768, -32768, -32768, -32768, -32768, -32768, | 582 -32768, -32768, -32768, -32768, -32768, -32768, -32768, -32768, |
| 578 -32768, -32768, -32768, -32768, -32768, -32768, -32768, -32768, | 583 -32768, -32768, -32768, -32768, -32768, -32768, -32768, -32768, |
| 579 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, | 584 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, |
| 580 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, | 585 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, |
| 581 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, | 586 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, |
| 582 32767, 32767, 32767, 32767, 32767, 32767, 32767 | 587 32767, 32767, 32767, 32767, 32767, 32767, 32767 |
| (...skipping 10 matching lines...) Expand all Loading... |
| 593 // Vector for storing output. | 598 // Vector for storing output. |
| 594 int32_t out_vector[2 * kBlockSize]; | 599 int32_t out_vector[2 * kBlockSize]; |
| 595 int16_t out_vector_w16[2 * kBlockSize]; | 600 int16_t out_vector_w16[2 * kBlockSize]; |
| 596 | 601 |
| 597 WebRtcSpl_Resample48khzTo32khz(kVectorSaturated, out_vector, kBlockSize); | 602 WebRtcSpl_Resample48khzTo32khz(kVectorSaturated, out_vector, kBlockSize); |
| 598 WebRtcSpl_VectorBitShiftW32ToW16(out_vector_w16, 2 * kBlockSize, out_vector, | 603 WebRtcSpl_VectorBitShiftW32ToW16(out_vector_w16, 2 * kBlockSize, out_vector, |
| 599 15); | 604 15); |
| 600 | 605 |
| 601 // Comparing output values against references. The values at position | 606 // Comparing output values against references. The values at position |
| 602 // 12-15 are skipped to account for the filter lag. | 607 // 12-15 are skipped to account for the filter lag. |
| 603 for (int i = 0; i < 12; ++i) { | 608 for (size_t i = 0; i < 12; ++i) { |
| 604 EXPECT_EQ(kRefValue32kHz1, out_vector[i]); | 609 EXPECT_EQ(kRefValue32kHz1, out_vector[i]); |
| 605 EXPECT_EQ(kRefValue16kHz1, out_vector_w16[i]); | 610 EXPECT_EQ(kRefValue16kHz1, out_vector_w16[i]); |
| 606 } | 611 } |
| 607 for (int i = 16; i < 2 * kBlockSize; ++i) { | 612 for (size_t i = 16; i < 2 * kBlockSize; ++i) { |
| 608 EXPECT_EQ(kRefValue32kHz2, out_vector[i]); | 613 EXPECT_EQ(kRefValue32kHz2, out_vector[i]); |
| 609 EXPECT_EQ(kRefValue16kHz2, out_vector_w16[i]); | 614 EXPECT_EQ(kRefValue16kHz2, out_vector_w16[i]); |
| 610 } | 615 } |
| 611 } | 616 } |
| OLD | NEW |