You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
58 lines
1.2 KiB
58 lines
1.2 KiB
/* 16-bit signed integer dot product |
|
* Portable C version |
|
* Copyright 2004 Phil Karn |
|
* May be used under the terms of the GNU Lesser General Public License (LGPL) |
|
*/ |
|
#include <stdlib.h> |
|
#include "fec.h" |
|
|
|
struct dotprod { |
|
int len; /* Number of coefficients */ |
|
|
|
signed short *coeffs; |
|
}; |
|
|
|
/* Create and return a descriptor for use with the dot product function */ |
|
void *initdp_port(signed short coeffs[],int len){ |
|
struct dotprod *dp; |
|
int j; |
|
|
|
if(len == 0) |
|
return NULL; |
|
|
|
dp = (struct dotprod *)calloc(1,sizeof(struct dotprod)); |
|
dp->len = len; |
|
|
|
/* Just one copy of the coefficients for the C version */ |
|
dp->coeffs = (signed short *)calloc(len,sizeof(signed short)); |
|
for(j=0;j<len;j++) |
|
dp->coeffs[j] = coeffs[j]; |
|
return (void *)dp; |
|
} |
|
|
|
|
|
/* Free a dot product descriptor created earlier */ |
|
void freedp_port(void *p){ |
|
struct dotprod *dp = (struct dotprod *)p; |
|
|
|
if(dp->coeffs != NULL) |
|
free(dp->coeffs); |
|
free(dp); |
|
} |
|
|
|
/* Compute a dot product given a descriptor and an input array |
|
* The length is taken from the descriptor |
|
*/ |
|
long dotprod_port(void *p,signed short a[]){ |
|
struct dotprod *dp = (struct dotprod *)p; |
|
long corr; |
|
int i; |
|
|
|
corr = 0; |
|
for(i=0;i<dp->len;i++){ |
|
corr += (long)a[i] * dp->coeffs[i]; |
|
} |
|
return corr; |
|
} |
|
|
|
|
|
|