convolve.c revision 84333e0475bc911adc16417f4ca327c975cf6c36
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 += vo_mult32((*tmpX++), (*tmpH--)); 51 s += vo_mult32((*tmpX++), (*tmpH--)); 52 s += vo_mult32((*tmpX++), (*tmpH--)); 53 s += vo_mult32((*tmpX++), (*tmpH--)); 54 i -= 4; 55 } 56 y[n] = ((s<<1) + 0x8000)>>16; 57 n++; 58 59 tmpH = h+n; 60 tmpX = x; 61 i=n+1; 62 s = vo_mult32((*tmpX++), (*tmpH--));i--; 63 s += vo_mult32((*tmpX++), (*tmpH--));i--; 64 65 while(i>0) 66 { 67 s += vo_mult32((*tmpX++), (*tmpH--)); 68 s += vo_mult32((*tmpX++), (*tmpH--)); 69 s += vo_mult32((*tmpX++), (*tmpH--)); 70 s += vo_mult32((*tmpX++), (*tmpH--)); 71 i -= 4; 72 } 73 y[n] = ((s<<1) + 0x8000)>>16; 74 n++; 75 76 tmpH = h+n; 77 tmpX = x; 78 i=n+1; 79 s = vo_mult32((*tmpX++), (*tmpH--));i--; 80 s += vo_mult32((*tmpX++), (*tmpH--));i--; 81 s += vo_mult32((*tmpX++), (*tmpH--));i--; 82 83 while(i>0) 84 { 85 s += vo_mult32((*tmpX++), (*tmpH--)); 86 s += vo_mult32((*tmpX++), (*tmpH--)); 87 s += vo_mult32((*tmpX++), (*tmpH--)); 88 s += vo_mult32((*tmpX++), (*tmpH--)); 89 i -= 4; 90 } 91 y[n] = ((s<<1) + 0x8000)>>16; 92 n++; 93 94 s = 0; 95 tmpH = h+n; 96 tmpX = x; 97 i=n+1; 98 while(i>0) 99 { 100 s += vo_mult32((*tmpX++), (*tmpH--)); 101 s += vo_mult32((*tmpX++), (*tmpH--)); 102 s += vo_mult32((*tmpX++), (*tmpH--)); 103 s += vo_mult32((*tmpX++), (*tmpH--)); 104 i -= 4; 105 } 106 y[n] = ((s<<1) + 0x8000)>>16; 107 n++; 108 } 109 return; 110} 111 112 113 114