1b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org/*
2b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
3b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *
4b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  Use of this source code is governed by a BSD-style license
5b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  that can be found in the LICENSE file in the root of the source
6b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  tree. An additional intellectual property rights grant can be found
7b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  in the file PATENTS.  All contributing project authors may
8b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  be found in the AUTHORS file in the root of the source tree.
9b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org */
10b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
11b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org/******************************************************************
12b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
13b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org iLBC Speech Coder ANSI-C Source Code
14b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
15b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org WebRtcIlbcfix_HpInput.c
16b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
17b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org******************************************************************/
18b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
19b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#include "defines.h"
20b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
21b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org/*----------------------------------------------------------------*
22b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  high-pass filter of input with *0.5 and saturation
23b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *---------------------------------------------------------------*/
24b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
25b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgvoid WebRtcIlbcfix_HpInput(
26fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org    int16_t *signal,     /* (i/o) signal vector */
27fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org    int16_t *ba,      /* (i)   B- and A-coefficients (2:nd order)
28b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                                                   {b[0] b[1] b[2] -a[1] -a[2]} a[0]
29b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                                                   is assumed to be 1.0 */
30fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org    int16_t *y,      /* (i/o) Filter state yhi[n-1] ylow[n-1]
31b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                                                   yhi[n-2] ylow[n-2] */
32fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org    int16_t *x,      /* (i/o) Filter state x[n-1] x[n-2] */
33fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org    int16_t len)      /* (i)   Number of samples to filter */
34b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
35b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  int i;
36fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org  int32_t tmpW32;
37fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org  int32_t tmpW32b;
38b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
39b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  for (i=0; i<len; i++) {
40b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
41b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    /*
42b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        y[i] = b[0]*x[i] + b[1]*x[i-1] + b[2]*x[i-2]
43b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        + (-a[1])*y[i-1] + (-a[2])*y[i-2];
44b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    */
45b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
46b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    tmpW32  = WEBRTC_SPL_MUL_16_16(y[1], ba[3]);     /* (-a[1])*y[i-1] (low part) */
47b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    tmpW32 += WEBRTC_SPL_MUL_16_16(y[3], ba[4]);     /* (-a[2])*y[i-2] (low part) */
48b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    tmpW32 = (tmpW32>>15);
49b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    tmpW32 += WEBRTC_SPL_MUL_16_16(y[0], ba[3]);     /* (-a[1])*y[i-1] (high part) */
50b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    tmpW32 += WEBRTC_SPL_MUL_16_16(y[2], ba[4]);     /* (-a[2])*y[i-2] (high part) */
51b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    tmpW32 = (tmpW32<<1);
52b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
53b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    tmpW32 += WEBRTC_SPL_MUL_16_16(signal[i], ba[0]);   /* b[0]*x[0] */
54b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    tmpW32 += WEBRTC_SPL_MUL_16_16(x[0],      ba[1]);   /* b[1]*x[i-1] */
55b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    tmpW32 += WEBRTC_SPL_MUL_16_16(x[1],      ba[2]);   /* b[2]*x[i-2] */
56b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
57b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    /* Update state (input part) */
58b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    x[1] = x[0];
59b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    x[0] = signal[i];
60b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
61b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    /* Rounding in Q(12+1), i.e. add 2^12 */
62b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    tmpW32b = tmpW32 + 4096;
63b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
64b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    /* Saturate (to 2^28) so that the HP filtered signal does not overflow */
65fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org    tmpW32b = WEBRTC_SPL_SAT((int32_t)268435455, tmpW32b, (int32_t)-268435456);
66b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
67b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    /* Convert back to Q0 and multiply with 0.5 */
68fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org    signal[i] = (int16_t)WEBRTC_SPL_RSHIFT_W32(tmpW32b, 13);
69b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
70b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    /* Update state (filtered part) */
71b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    y[2] = y[0];
72b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    y[3] = y[1];
73b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
74b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    /* upshift tmpW32 by 3 with saturation */
75b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (tmpW32>268435455) {
76b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      tmpW32 = WEBRTC_SPL_WORD32_MAX;
77b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    } else if (tmpW32<-268435456) {
78b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      tmpW32 = WEBRTC_SPL_WORD32_MIN;
79b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    } else {
80b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      tmpW32 = WEBRTC_SPL_LSHIFT_W32(tmpW32, 3);
81b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
82b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
83fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org    y[0] = (int16_t)(tmpW32 >> 16);
84fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org    y[1] = (int16_t)((tmpW32 - WEBRTC_SPL_LSHIFT_W32((int32_t)y[0], 16))>>1);
85b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
86b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
87b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  return;
88b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
89