convolve.c revision 5d453222ae6dcc10efedb1e4805247d7c22a4168
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
30void 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