/* SigLib FIR Filter Example */

#include <stdio.h>
#include <siglib.h>
#include "GraphFunctions.h"

/* Define constants */
#define	FILTER_LENGTH	((SLArrayIndex_t)64)
#define	SAMPLE_LENGTH	((SLArrayIndex_t)512)

			/* Initialise filter coefficients */
SLData_t	pFilterTaps[FILTER_LENGTH] = {
	-3.783E-3,  2.803E-3,  2.648E-3,  2.891E-3,  3.397E-3,  4.094E-3, 
 	 4.942E-3,  5.917E-3,  7.005E-3,  8.196E-3,  9.479E-3,  1.084E-2, 
 	 1.229E-2,  1.379E-2,  1.535E-2,  1.695E-2,  1.857E-2,  2.021E-2, 
 	 2.183E-2,  2.344E-2,  2.500E-2,  2.651E-2,  2.795E-2,  2.929E-2, 
 	 3.053E-2,  3.165E-2,  3.264E-2,  3.348E-2,  3.417E-2,  3.469E-2, 
 	 3.504E-2,  3.522E-2,  3.522E-2,  3.504E-2,  3.469E-2,  3.417E-2, 
 	 3.348E-2,  3.264E-2,  3.165E-2,  3.053E-2,  2.929E-2,  2.795E-2, 
 	 2.651E-2,  2.500E-2,  2.344E-2,  2.183E-2,  2.021E-2,  1.857E-2, 
 	 1.695E-2,  1.535E-2,  1.379E-2,  1.229E-2,  1.084E-2,  9.479E-3, 
 	 8.196E-3,  7.005E-3,  5.917E-3,  4.942E-3,  4.094E-3,  3.397E-3, 
 	 2.891E-3,  2.648E-3,  2.803E-3, -3.783E-3
	};


SLData_t	pFilterState[FILTER_LENGTH];
SLArrayIndex_t	FilterIndex;
SLData_t	*pSrc1, *pSrc2;
SLData_t	SinePhase;

void	main(void);

void main(void)
{
	GraphObject *h2DGraph;							/* Declare graph object */

	SLFixData_t	i;

	pSrc1 = SUF_VectorArrayAllocate (SAMPLE_LENGTH);
	pSrc2 = SUF_VectorArrayAllocate (SAMPLE_LENGTH);

	h2DGraph =										/* Initialize graph */
		Create2DGraph ("FIR Filter",				/* Graph title */
					   "Time",						/* X-Axis label */
					   "Magnitude",					/* Y-Axis label */
					   SV_AUTO_SCALE,				/* Scaling mode */
					   SV_SIGNED,					/* Sign mode */
					   SV_GRAPH_LINE,				/* Graph type */
					   "localhost");				/* Graph server */
	if (h2DGraph == NULL)							/* Graph creation failed - e.g is server running ? */
	{
		printf ("\nGraph creation failure. Please check that the server is running\n");
		exit (1);
	}

	SIF_Fir (pFilterState,							/* Pointer to filter state array */
			 &FilterIndex,							/* Pointer to filter index register */
			 FILTER_LENGTH);						/* Filter length */

	SinePhase = SIGLIB_ZERO;

				/* Generate a noisy sinewave */
	SDA_SignalGenerate (pSrc1,						/* Pointer to destination array */
						SIGLIB_SINE_WAVE,			/* Signal type - Sine wave */
						SIGLIB_HALF,				/* Signal peak level */
						SIGLIB_FILL,				/* Fill (overwrite) or add to existing array contents */
						((SLData_t)0.01),			/* Signal frequency */
						SIGLIB_ZERO,				/* D.C. Offset */
						SIGLIB_ZERO,				/* Unused */
						SIGLIB_ZERO,				/* Signal end value - Unused */
						&SinePhase,					/* Signal phase - maintained across array boundaries */
						SIGLIB_NULL_DATA_PTR,		/* Unused */
						SAMPLE_LENGTH);				/* Output array length */

	SDA_SignalGenerate (pSrc1,						/* Pointer to destination array */
						SIGLIB_WHITE_NOISE,			/* Signal type - random white noise */
						((SLData_t)0.2),			/* Signal peak level */
						SIGLIB_ADD,					/* Fill (overwrite) or add to existing array contents */
						SIGLIB_ZERO,				/* Signal frequency - Unused */
						SIGLIB_ZERO,				/* D.C. Offset */
						SIGLIB_ZERO,				/* Unused */
						SIGLIB_ZERO,				/* Signal end value - Unused */
						SIGLIB_NULL_DATA_PTR,		/* Unused */
						SIGLIB_NULL_DATA_PTR,		/* Unused */
						SAMPLE_LENGTH);				/* Output array length */

			/* Apply fir filter and store filtered data */
	for (i = 0; i < SAMPLE_LENGTH; i++)
	{
		*pSrc2++ =
			SDS_Fir (*pSrc1++,						/* Input data sample to be filtered */
					 pFilterState,					/* Pointer to filter state array */
					 pFilterTaps,					/* Pointer to filter coefficients */
					 &FilterIndex,					/* Pointer to filter index register */
					 FILTER_LENGTH);				/* Filter length */
	}
	pSrc1 -= SAMPLE_LENGTH;
	pSrc2 -= SAMPLE_LENGTH;

	Display2DGraph (h2DGraph,						/* Graph handle */
				    "Unfiltered Signal",			/* Title of the dataset */
				    pSrc1,							/* Array of Double dataset */
				    SAMPLE_LENGTH,					/* Number of data points */
					SV_GRAPH_LINE,					/* Graph type */
				    SV_BLUE,						/* Colour */
					SV_HIDE_MARKERS,				/* Marker enable / disable */
					SV_GRAPH_NEW);					/* New graph */

	Display2DGraph (h2DGraph,						/* Graph handle */
				    "Filtered Signal",				/* Title of the dataset */
				    pSrc2,							/* Array of Double dataset */
				    SAMPLE_LENGTH,					/* Number of data points */
					SV_GRAPH_LINE,					/* Graph type */
				    SV_RED,							/* Colour */
					SV_HIDE_MARKERS,				/* Marker enable / disable */
					SV_GRAPH_ADD);					/* New graph */
	printf ("\nOriginal And Filtered Signals\n");

	SUF_MemoryFree (pSrc1);							/* Free memory */
	SUF_MemoryFree (pSrc2);
}



