Digital Signal Processing Reference
In-Depth Information
#include <stdio.h >
#define N 12
#define L 8
// Test data and filter coefficients
short xbf[N+L-1]={1, 1, 2, 3, 4, 1, 2, 3, 1, 2, 1, 4, 5, -1, 2, 0, 1, -2, 3};
short hbf[L]={5, 9, -22, 11, 8, 21, 64, 18};
short ybf[N];
// The function performs block filtering operation
void BlkFilter(short *xptr, short *hptr, int len_x, int len_h, short *ybf)
{
int n, k, m;
for (n=0; n<len_x; n++)
{
sum = 0;
for(k=0, m=n; k<len_h; k++, m-)
sum += xptr[m]*hptr[k]; // MAC operation
ybf[n] = sum;
}
}
// Program to test BlkFilter and BlkFilterUnroll functions
void main(void)
{
short *xptr, *hptr;
xptr = &[L-1]; // xbf has L-1 old samples
hptr = hbf;
BlkFilterUnroll (xptr, hptr, N, L, ybf);
BlkFilter (xptr, hptr, N, L, ybf);
}
The unrolled loop for effective HW mapping is given here:
// Function unrolls the inner loop to perform 4 MAC operations
// while performing block filtering function
void BlkFilterUnroll(short *xptr, short *hptr,
int len_x, int len_h, short *ybf)
{
short sum_n_0, sum_n_1, sum_n_2, sum_n_3;
int n, k, m;
// Unrolling outer loop by a factor of 4
for (n=4-1; n<len_x; n+=4)
{
sum_n_0 = 0;
sum_n_1 = 0;
sum_n_2 = 0;
sum_n_3 = 0;
for (k=0, m=n; k<len_h; k++, m-)
{
sum_n_0 += hptr[k] * xptr[m];
sum_n_1 += hptr[k] * xptr[m-1];
sum_n_2 += hptr[k] * xptr[m-2];
sum_n_3 += hptr[k] * xptr[m-3];
}
Search WWH ::




Custom Search