📄 fir4.c
字号:
#include <ops/custom_defs.h>
#define NROF_SAMPLES 400
void
initialize( char *a, char *b )
{
int i;
for(i = 0; i < 8; i++)
b[i] = i - 4;
for(i = 0; i < 8; i++)
a[i] = 0; /* Prepend zeros */
for(i = 8; i < NROF_SAMPLES; i++)
a[i] = i - 24; /* Actual data */
for(i = NROF_SAMPLES; i < NROF_SAMPLES + 8; i++)
a[i] = 0; /* Append zeros */
}
/*
* Implementation with custom operators.
* Four multiplications and three additions are done with
* one FUNSHIFT and one IFIR8II instructions.
*/
void
custom_ops_direct_convolution(
char * restrict a,
char * restrict b,
int * restrict c )
{
int i, ib0, ib1, i0, i1, i2;
int * restrict ia;
ia = (int *) a;
/*
* Copy b, in a new array called rev_b in time reversed order.
* ib points this array as an integer pointer.
* Let A = |abcd| and B = |pqrs| with where a,b,c,d,p,q,r, and s are
* all 8 bit integers. Then
* PACKBYTES(A,B) = |ds] and
* PACK16LSB(A,B) = |cdrs|
*/
ib0 = PACK16LSB(PACKBYTES(b[7], b[6]), PACKBYTES(b[5], b[4]));
ib1 = PACK16LSB(PACKBYTES(b[3], b[2]), PACKBYTES(b[1], b[0]));
for(i = 0; i < NROF_SAMPLES/4 ; i++) {
/*
* Let A = |abcd| and B = |pqrs| where a,b,c,d,p,q,r, and s are
* all 8 bit integers. Then
* FUNSHIFT1(A,B) = |bcdp|
* FUNSHIFT2(A,B) = |cdpq|
* FUNSHIFT3(A,B) = |dpqr|
*
* IFIR8II(A,B) = a*p + b*q + c*r + d*s
*/
i0 = ia[i - 2];
i1 = ia[i - 1];
i2 = ia[i];
c[0] = IFIR8II(ib0, FUNSHIFT1(i0, i1)) +
IFIR8II(ib1, FUNSHIFT1(i1, i2));
c[1] = IFIR8II(ib0, FUNSHIFT2(i0, i1)) +
IFIR8II(ib1, FUNSHIFT2(i1, i2));
c[2] = IFIR8II(ib0, FUNSHIFT3(i0, i1)) +
IFIR8II(ib1, FUNSHIFT3(i1, i2));
c[3] = IFIR8II(ib0, i1) +
IFIR8II(ib1, i2);
c += 4;
}
}
int
main( void )
{
char a[8+NROF_SAMPLES], b[8];
int c[NROF_SAMPLES];
initialize( a, b );
custom_ops_direct_convolution( a + 8, b, c );
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -