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: convolve.c
     19 
     20        Description:Perform the convolution between two vectors x[] and h[]
     21                    and write the result in the vector y[]
     22 
     23 ************************************************************************/
     24 
     25 #include "typedef.h"
     26 #include "basic_op.h"
     27 
     28 #define UNUSED(x) (void)(x)
     29 
     30 void Convolve (
     31         Word16 x[],        /* (i)     : input vector                           */
     32         Word16 h[],        /* (i)     : impulse response                       */
     33         Word16 y[],        /* (o)     : output vector                          */
     34         Word16 L           /* (i)     : vector size                            */
     35           )
     36 {
     37     Word32  i, n;
     38     Word16 *tmpH,*tmpX;
     39     Word32 s;
     40         UNUSED(L);
     41 
     42     for (n = 0; n < 64;)
     43     {
     44         tmpH = h+n;
     45         tmpX = x;
     46         i=n+1;
     47         s = vo_mult32((*tmpX++), (*tmpH--));i--;
     48         while(i>0)
     49         {
     50             s = L_add(s, vo_mult32((*tmpX++), (*tmpH--)));
     51             s = L_add(s, vo_mult32((*tmpX++), (*tmpH--)));
     52             s = L_add(s, vo_mult32((*tmpX++), (*tmpH--)));
     53             s = L_add(s, vo_mult32((*tmpX++), (*tmpH--)));
     54             i -= 4;
     55         }
     56         y[n] = voround(L_shl(s, 1));
     57         n++;
     58 
     59         tmpH = h+n;
     60         tmpX = x;
     61         i=n+1;
     62         s =  vo_mult32((*tmpX++), (*tmpH--));
     63         i--;
     64         s = L_add(s, vo_mult32((*tmpX++), (*tmpH--)));
     65         i--;
     66 
     67         while(i>0)
     68         {
     69             s = L_add(s, vo_mult32((*tmpX++), (*tmpH--)));
     70             s = L_add(s, vo_mult32((*tmpX++), (*tmpH--)));
     71             s = L_add(s, vo_mult32((*tmpX++), (*tmpH--)));
     72             s = L_add(s, vo_mult32((*tmpX++), (*tmpH--)));
     73             i -= 4;
     74         }
     75         y[n] = voround(L_shl(s, 1));
     76         n++;
     77 
     78         tmpH = h+n;
     79         tmpX = x;
     80         i=n+1;
     81         s =  vo_mult32((*tmpX++), (*tmpH--));
     82         i--;
     83         s = L_add(s, vo_mult32((*tmpX++), (*tmpH--)));
     84         i--;
     85         s = L_add(s, vo_mult32((*tmpX++), (*tmpH--)));
     86         i--;
     87 
     88         while(i>0)
     89         {
     90             s = L_add(s, vo_mult32((*tmpX++), (*tmpH--)));
     91             s = L_add(s, vo_mult32((*tmpX++), (*tmpH--)));
     92             s = L_add(s, vo_mult32((*tmpX++), (*tmpH--)));
     93             s = L_add(s, vo_mult32((*tmpX++), (*tmpH--)));
     94             i -= 4;
     95         }
     96         y[n] = voround(L_shl(s, 1));
     97         n++;
     98 
     99         s = 0;
    100         tmpH = h+n;
    101         tmpX = x;
    102         i=n+1;
    103         while(i>0)
    104         {
    105             s = L_add(s, vo_mult32((*tmpX++), (*tmpH--)));
    106             s = L_add(s, vo_mult32((*tmpX++), (*tmpH--)));
    107             s = L_add(s, vo_mult32((*tmpX++), (*tmpH--)));
    108             s = L_add(s, vo_mult32((*tmpX++), (*tmpH--)));
    109             i -= 4;
    110         }
    111         y[n] = voround(L_shl(s, 1));
    112         n++;
    113     }
    114     return;
    115 }
    116 
    117 
    118 
    119