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 void Convolve (
     29 		Word16 x[],        /* (i)     : input vector                           */
     30 		Word16 h[],        /* (i)     : impulse response                       */
     31 		Word16 y[],        /* (o)     : output vector                          */
     32 		Word16 L           /* (i)     : vector size                            */
     33 	      )
     34 {
     35 	Word32  i, n;
     36 	Word16 *tmpH,*tmpX;
     37 	Word32 s;
     38 	for (n = 0; n < 64;)
     39 	{
     40 		tmpH = h+n;
     41 		tmpX = x;
     42 		i=n+1;
     43 		s = vo_mult32((*tmpX++), (*tmpH--));i--;
     44 		while(i>0)
     45 		{
     46 			s += vo_mult32((*tmpX++), (*tmpH--));
     47 			s += vo_mult32((*tmpX++), (*tmpH--));
     48 			s += vo_mult32((*tmpX++), (*tmpH--));
     49 			s += vo_mult32((*tmpX++), (*tmpH--));
     50 			i -= 4;
     51 		}
     52 		y[n] = ((s<<1) + 0x8000)>>16;
     53 		n++;
     54 
     55 		tmpH = h+n;
     56 		tmpX = x;
     57 		i=n+1;
     58 		s =  vo_mult32((*tmpX++), (*tmpH--));i--;
     59 		s += vo_mult32((*tmpX++), (*tmpH--));i--;
     60 
     61 		while(i>0)
     62 		{
     63 			s += vo_mult32((*tmpX++), (*tmpH--));
     64 			s += vo_mult32((*tmpX++), (*tmpH--));
     65 			s += vo_mult32((*tmpX++), (*tmpH--));
     66 			s += vo_mult32((*tmpX++), (*tmpH--));
     67 			i -= 4;
     68 		}
     69 		y[n] = ((s<<1) + 0x8000)>>16;
     70 		n++;
     71 
     72 		tmpH = h+n;
     73 		tmpX = x;
     74 		i=n+1;
     75 		s =  vo_mult32((*tmpX++), (*tmpH--));i--;
     76 		s += vo_mult32((*tmpX++), (*tmpH--));i--;
     77 		s += vo_mult32((*tmpX++), (*tmpH--));i--;
     78 
     79 		while(i>0)
     80 		{
     81 			s += vo_mult32((*tmpX++), (*tmpH--));
     82 			s += vo_mult32((*tmpX++), (*tmpH--));
     83 			s += vo_mult32((*tmpX++), (*tmpH--));
     84 			s += vo_mult32((*tmpX++), (*tmpH--));
     85 			i -= 4;
     86 		}
     87 		y[n] = ((s<<1) + 0x8000)>>16;
     88 		n++;
     89 
     90 		s = 0;
     91 		tmpH = h+n;
     92 		tmpX = x;
     93 		i=n+1;
     94 		while(i>0)
     95 		{
     96 			s += vo_mult32((*tmpX++), (*tmpH--));
     97 			s += vo_mult32((*tmpX++), (*tmpH--));
     98 			s += vo_mult32((*tmpX++), (*tmpH--));
     99 			s += vo_mult32((*tmpX++), (*tmpH--));
    100 			i -= 4;
    101 		}
    102 		y[n] = ((s<<1) + 0x8000)>>16;
    103 		n++;
    104 	}
    105 	return;
    106 }
    107 
    108 
    109 
    110