65 lines
1.3 KiB
C
65 lines
1.3 KiB
C
/* 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;
|
|
}
|
|
|
|
|