1*638691a0SAndroid Build Coastguard Worker /* 16-bit signed integer dot product 2*638691a0SAndroid Build Coastguard Worker * Portable C version 3*638691a0SAndroid Build Coastguard Worker * Copyright 2004 Phil Karn 4*638691a0SAndroid Build Coastguard Worker * May be used under the terms of the GNU Lesser General Public License (LGPL) 5*638691a0SAndroid Build Coastguard Worker */ 6*638691a0SAndroid Build Coastguard Worker #include <stdlib.h> 7*638691a0SAndroid Build Coastguard Worker #include "fec.h" 8*638691a0SAndroid Build Coastguard Worker 9*638691a0SAndroid Build Coastguard Worker struct dotprod { 10*638691a0SAndroid Build Coastguard Worker int len; /* Number of coefficients */ 11*638691a0SAndroid Build Coastguard Worker 12*638691a0SAndroid Build Coastguard Worker signed short *coeffs; 13*638691a0SAndroid Build Coastguard Worker }; 14*638691a0SAndroid Build Coastguard Worker 15*638691a0SAndroid Build Coastguard Worker /* Create and return a descriptor for use with the dot product function */ initdp_port(signed short coeffs[],int len)16*638691a0SAndroid Build Coastguard Workervoid *initdp_port(signed short coeffs[],int len){ 17*638691a0SAndroid Build Coastguard Worker struct dotprod *dp; 18*638691a0SAndroid Build Coastguard Worker int j; 19*638691a0SAndroid Build Coastguard Worker 20*638691a0SAndroid Build Coastguard Worker if(len == 0) 21*638691a0SAndroid Build Coastguard Worker return NULL; 22*638691a0SAndroid Build Coastguard Worker 23*638691a0SAndroid Build Coastguard Worker dp = (struct dotprod *)calloc(1,sizeof(struct dotprod)); 24*638691a0SAndroid Build Coastguard Worker dp->len = len; 25*638691a0SAndroid Build Coastguard Worker 26*638691a0SAndroid Build Coastguard Worker /* Just one copy of the coefficients for the C version */ 27*638691a0SAndroid Build Coastguard Worker dp->coeffs = (signed short *)calloc(len,sizeof(signed short)); 28*638691a0SAndroid Build Coastguard Worker for(j=0;j<len;j++) 29*638691a0SAndroid Build Coastguard Worker dp->coeffs[j] = coeffs[j]; 30*638691a0SAndroid Build Coastguard Worker return (void *)dp; 31*638691a0SAndroid Build Coastguard Worker } 32*638691a0SAndroid Build Coastguard Worker 33*638691a0SAndroid Build Coastguard Worker 34*638691a0SAndroid Build Coastguard Worker /* Free a dot product descriptor created earlier */ freedp_port(void * p)35*638691a0SAndroid Build Coastguard Workervoid freedp_port(void *p){ 36*638691a0SAndroid Build Coastguard Worker struct dotprod *dp = (struct dotprod *)p; 37*638691a0SAndroid Build Coastguard Worker 38*638691a0SAndroid Build Coastguard Worker if(dp->coeffs != NULL) 39*638691a0SAndroid Build Coastguard Worker free(dp->coeffs); 40*638691a0SAndroid Build Coastguard Worker free(dp); 41*638691a0SAndroid Build Coastguard Worker } 42*638691a0SAndroid Build Coastguard Worker 43*638691a0SAndroid Build Coastguard Worker /* Compute a dot product given a descriptor and an input array 44*638691a0SAndroid Build Coastguard Worker * The length is taken from the descriptor 45*638691a0SAndroid Build Coastguard Worker */ dotprod_port(void * p,signed short a[])46*638691a0SAndroid Build Coastguard Workerlong dotprod_port(void *p,signed short a[]){ 47*638691a0SAndroid Build Coastguard Worker struct dotprod *dp = (struct dotprod *)p; 48*638691a0SAndroid Build Coastguard Worker long corr; 49*638691a0SAndroid Build Coastguard Worker int i; 50*638691a0SAndroid Build Coastguard Worker 51*638691a0SAndroid Build Coastguard Worker corr = 0; 52*638691a0SAndroid Build Coastguard Worker for(i=0;i<dp->len;i++){ 53*638691a0SAndroid Build Coastguard Worker corr += (long)a[i] * dp->coeffs[i]; 54*638691a0SAndroid Build Coastguard Worker } 55*638691a0SAndroid Build Coastguard Worker return corr; 56*638691a0SAndroid Build Coastguard Worker } 57*638691a0SAndroid Build Coastguard Worker 58*638691a0SAndroid Build Coastguard Worker 59