1 /* 2 * Copyright (c) 2011 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 /****************************************************************** 12 13 iLBC Speech Coder ANSI-C Source Code 14 15 WebRtcIlbcfix_Window32W32.c 16 17 ******************************************************************/ 18 19 #include "defines.h" 20 21 /*----------------------------------------------------------------* 22 * window multiplication 23 *---------------------------------------------------------------*/ 24 25 void WebRtcIlbcfix_Window32W32( 26 int32_t *z, /* Output */ 27 int32_t *x, /* Input (same domain as Output)*/ 28 const int32_t *y, /* Q31 Window */ 29 size_t N /* length to process */ 30 ) { 31 size_t i; 32 int16_t x_low, x_hi, y_low, y_hi; 33 int16_t left_shifts; 34 int32_t temp; 35 36 left_shifts = (int16_t)WebRtcSpl_NormW32(x[0]); 37 WebRtcSpl_VectorBitShiftW32(x, N, x, (int16_t)(-left_shifts)); 38 39 40 /* The double precision numbers use a special representation: 41 * w32 = hi<<16 + lo<<1 42 */ 43 for (i = 0; i < N; i++) { 44 /* Extract higher bytes */ 45 x_hi = (int16_t)(x[i] >> 16); 46 y_hi = (int16_t)(y[i] >> 16); 47 48 /* Extract lower bytes, defined as (w32 - hi<<16)>>1 */ 49 x_low = (int16_t)((x[i] - (x_hi << 16)) >> 1); 50 51 y_low = (int16_t)((y[i] - (y_hi << 16)) >> 1); 52 53 /* Calculate z by a 32 bit multiplication using both low and high from x and y */ 54 temp = ((x_hi * y_hi) << 1) + ((x_hi * y_low) >> 14); 55 56 z[i] = temp + ((x_low * y_hi) >> 14); 57 } 58 59 WebRtcSpl_VectorBitShiftW32(z, N, z, left_shifts); 60 61 return; 62 } 63