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 int16_t N /* length to process */ 30 ) { 31 int16_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) WEBRTC_SPL_RSHIFT_W32(x[i], 16); 46 y_hi = (int16_t) WEBRTC_SPL_RSHIFT_W32(y[i], 16); 47 48 /* Extract lower bytes, defined as (w32 - hi<<16)>>1 */ 49 temp = WEBRTC_SPL_LSHIFT_W32((int32_t)x_hi, 16); 50 x_low = (int16_t) WEBRTC_SPL_RSHIFT_W32((x[i] - temp), 1); 51 52 temp = WEBRTC_SPL_LSHIFT_W32((int32_t)y_hi, 16); 53 y_low = (int16_t) WEBRTC_SPL_RSHIFT_W32((y[i] - temp), 1); 54 55 /* Calculate z by a 32 bit multiplication using both low and high from x and y */ 56 temp = WEBRTC_SPL_LSHIFT_W32(WEBRTC_SPL_MUL_16_16(x_hi, y_hi), 1); 57 temp = (temp + (WEBRTC_SPL_MUL_16_16_RSFT(x_hi, y_low, 14))); 58 59 z[i] = (temp + (WEBRTC_SPL_MUL_16_16_RSFT(x_low, y_hi, 14))); 60 } 61 62 WebRtcSpl_VectorBitShiftW32(z, N, z, left_shifts); 63 64 return; 65 } 66