/*
 ** Copyright 2003-2010, VisualOn, Inc.
 **
 ** Licensed under the Apache License, Version 2.0 (the "License");
 ** you may not use this file except in compliance with the License.
 ** You may obtain a copy of the License at
 **
 **     http://www.apache.org/licenses/LICENSE-2.0
 **
 ** Unless required by applicable law or agreed to in writing, software
 ** distributed under the License is distributed on an "AS IS" BASIS,
 ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 ** See the License for the specific language governing permissions and
 ** limitations under the License.
 */

/***********************************************************************
       File: convolve.c

	   Description:Perform the convolution between two vectors x[] and h[]
	               and write the result in the vector y[]

************************************************************************/

#include "typedef.h"
#include "basic_op.h"

#define UNUSED(x) (void)(x)

void Convolve (
		Word16 x[],        /* (i)     : input vector                           */
		Word16 h[],        /* (i)     : impulse response                       */
		Word16 y[],        /* (o)     : output vector                          */
		Word16 L           /* (i)     : vector size                            */
	      )
{
	Word32  i, n;
	Word16 *tmpH,*tmpX;
	Word32 s;
        UNUSED(L);

	for (n = 0; n < 64;)
	{
		tmpH = h+n;
		tmpX = x;
		i=n+1;
		s = vo_mult32((*tmpX++), (*tmpH--));i--;
		while(i>0)
		{
			s += vo_mult32((*tmpX++), (*tmpH--));
			s += vo_mult32((*tmpX++), (*tmpH--));
			s += vo_mult32((*tmpX++), (*tmpH--));
			s += vo_mult32((*tmpX++), (*tmpH--));
			i -= 4;
		}
		y[n] = ((s<<1) + 0x8000)>>16;
		n++;

		tmpH = h+n;
		tmpX = x;
		i=n+1;
		s =  vo_mult32((*tmpX++), (*tmpH--));i--;
		s += vo_mult32((*tmpX++), (*tmpH--));i--;

		while(i>0)
		{
			s += vo_mult32((*tmpX++), (*tmpH--));
			s += vo_mult32((*tmpX++), (*tmpH--));
			s += vo_mult32((*tmpX++), (*tmpH--));
			s += vo_mult32((*tmpX++), (*tmpH--));
			i -= 4;
		}
		y[n] = ((s<<1) + 0x8000)>>16;
		n++;

		tmpH = h+n;
		tmpX = x;
		i=n+1;
		s =  vo_mult32((*tmpX++), (*tmpH--));i--;
		s += vo_mult32((*tmpX++), (*tmpH--));i--;
		s += vo_mult32((*tmpX++), (*tmpH--));i--;

		while(i>0)
		{
			s += vo_mult32((*tmpX++), (*tmpH--));
			s += vo_mult32((*tmpX++), (*tmpH--));
			s += vo_mult32((*tmpX++), (*tmpH--));
			s += vo_mult32((*tmpX++), (*tmpH--));
			i -= 4;
		}
		y[n] = ((s<<1) + 0x8000)>>16;
		n++;

		s = 0;
		tmpH = h+n;
		tmpX = x;
		i=n+1;
		while(i>0)
		{
			s += vo_mult32((*tmpX++), (*tmpH--));
			s += vo_mult32((*tmpX++), (*tmpH--));
			s += vo_mult32((*tmpX++), (*tmpH--));
			s += vo_mult32((*tmpX++), (*tmpH--));
			i -= 4;
		}
		y[n] = ((s<<1) + 0x8000)>>16;
		n++;
	}
	return;
}



