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.
59 lines
1.2 KiB
59 lines
1.2 KiB
4 months ago
|
/* 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;
|
||
|
}
|
||
|
|
||
|
|