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