Home | History | Annotate | Download | only in src
      1 /*
      2  ** Copyright 2003-2010, VisualOn, Inc.
      3  **
      4  ** Licensed under the Apache License, Version 2.0 (the "License");
      5  ** you may not use this file except in compliance with the License.
      6  ** You may obtain a copy of the License at
      7  **
      8  **     http://www.apache.org/licenses/LICENSE-2.0
      9  **
     10  ** Unless required by applicable law or agreed to in writing, software
     11  ** distributed under the License is distributed on an "AS IS" BASIS,
     12  ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  ** See the License for the specific language governing permissions and
     14  ** limitations under the License.
     15  */
     16 
     17 /***********************************************************************
     18 *      File: preemph.c                                                *
     19 *                                                                     *
     20 *      Description: Preemphasis: filtering through 1 - g z^-1         *
     21 *              Preemph2 --> signal is multiplied by 2             *
     22 *                                                                     *
     23 ************************************************************************/
     24 
     25 #include "typedef.h"
     26 #include "basic_op.h"
     27 
     28 void Preemph(
     29         Word16 x[],                           /* (i/o)   : input signal overwritten by the output */
     30         Word16 mu,                            /* (i) Q15 : preemphasis coefficient                */
     31         Word16 lg,                            /* (i)     : lenght of filtering                    */
     32         Word16 * mem                          /* (i/o)   : memory (x[-1])                         */
     33         )
     34 {
     35     Word16 temp;
     36     Word32 i, L_tmp;
     37 
     38     temp = x[lg - 1];
     39 
     40     for (i = lg - 1; i > 0; i--)
     41     {
     42         L_tmp = L_deposit_h(x[i]);
     43         L_tmp -= (x[i - 1] * mu)<<1;
     44         x[i] = (L_tmp + 0x8000)>>16;
     45     }
     46 
     47     L_tmp = L_deposit_h(x[0]);
     48     L_tmp -= ((*mem) * mu)<<1;
     49     x[0] = (L_tmp + 0x8000)>>16;
     50 
     51     *mem = temp;
     52 
     53     return;
     54 }
     55 
     56 
     57 void Preemph2(
     58         Word16 x[],                           /* (i/o)   : input signal overwritten by the output */
     59         Word16 mu,                            /* (i) Q15 : preemphasis coefficient                */
     60         Word16 lg,                            /* (i)     : lenght of filtering                    */
     61         Word16 * mem                          /* (i/o)   : memory (x[-1])                         */
     62          )
     63 {
     64     Word16 temp;
     65     Word32 i, L_tmp;
     66 
     67     temp = x[lg - 1];
     68 
     69     for (i = (Word16) (lg - 1); i > 0; i--)
     70     {
     71         L_tmp = L_deposit_h(x[i]);
     72         L_tmp -= (x[i - 1] * mu)<<1; // only called with mu == 22282, so this won't overflow
     73         if (L_tmp > INT32_MAX / 2) {
     74             L_tmp = INT32_MAX / 2;
     75         }
     76         L_tmp = (L_tmp << 1);
     77         if (L_tmp > INT32_MAX - 0x8000) {
     78             L_tmp = INT32_MAX - 0x8000;
     79         }
     80         x[i] = (L_tmp + 0x8000)>>16;
     81     }
     82 
     83     L_tmp = L_deposit_h(x[0]);
     84     L_tmp -= ((*mem) * mu)<<1;
     85     if (L_tmp > INT32_MAX / 2) {
     86         L_tmp = INT32_MAX / 2;
     87     }
     88     L_tmp = (L_tmp << 1);
     89     if (L_tmp > INT32_MAX - 0x8000) {
     90         L_tmp = INT32_MAX - 0x8000;
     91     }
     92     x[0] = (L_tmp + 0x8000)>>16;
     93 
     94     *mem = temp;
     95 
     96     return;
     97 }
     98 
     99 
    100 
    101