Esempio n. 1
0
static RCCResult
run(RCCWorker *self, RCCBoolean timedOut, RCCBoolean *newRunCondition) {
  (void)timedOut;(void)newRunCondition;  

  Sym_fir_realProperties *p = self->properties;
  State *myState = self->memories[0];  

  RCCPort
    *in = &self->ports[SYM_FIR_REAL_IN],
    *out = &self->ports[SYM_FIR_REAL_OUT];

  Sym_fir_realInData
    *inData = in->current.data,
    *outData = out->current.data;

  if (in->input.length > out->current.maxLength) {
    self->container.setError( "output buffer too small" );
    return RCC_ERROR;
  }

  switch( in->input.u.operation ) {

  case SYM_FIR_REAL_IN_DATA:
    {
#ifndef NDEBUG
      printf("%s got %zu bytes of data\n", __FILE__,  in->input.length);
#endif

      if ( p->bypass ) {
	self->container.send( out, &in->current, in->input.u.operation, in->input.length);
	return RCC_OK;
      }
      else if (in->input.length) {
	unsigned i;
	double gain = Gain( p->gain);
	unsigned len = byteLen2Real(in->input.length) - UnRoll;
	for ( i=0; i<len; i++ ) {
	  double v = apply_filter( myState->taps, &inData->real[i] );
	  if ( fabs(v) > p->peakDetect ) {
	    p->peakDetect = Scale( fabs(v) );
	  }
	  outData->real[i] =  Scale( gain * v );
	}
      }
    }
    break;

  case SYM_FIR_REAL_IN_SYNC:
  case SYM_FIR_REAL_IN_TIME:
    self->container.send( out, &in->current, in->input.u.operation, in->input.length);
    return RCC_OK;
    break;

  };

  out->output.length = in->input.length;
  out->output.u.operation = in->input.u.operation;
  return RCC_ADVANCE;
}
Esempio n. 2
0
static void
runRealTest( RCCWorker * self ) 
{
  MyState *s = self->memories[0];
  Comparator_realProperties *p = self->properties;

  RCCPort
    *in_unit_test = &self->ports[COMPARATOR_REAL_IN_UNIT_TEST],
    *in_expected = &self->ports[COMPARATOR_REAL_IN_EXPECTED],
    *out_delta = &self->ports[COMPARATOR_REAL_OUT_DELTA],
    *out_actual = &self->ports[COMPARATOR_REAL_OUT_ACTUAL];
   
  int16_t
    *inUTData = in_unit_test->current.data,
    *inEXData = in_expected->current.data,
    *outActualData = out_actual->current.data;

  int16_t
    *outDeltaData = out_delta->current.data;


  if ( in_unit_test->input.length != in_expected->input.length ) {
    fprintf( stderr, "/n/n The data length coming from the unit under test and the expected results file differ\n");
    fprintf( stderr, "UUT data length = %zu, expected data length = %zu\n", in_unit_test->input.length ,  in_expected->input.length );
    fprintf( stderr, "This will cause the test to fail. The output of the UUT and the expected results data should be identical\n");
    p->passed = 0;
  }

  int len = byteLen2Real(in_unit_test->input.length);
  int i;
  for ( i=0; i<len; i++ ) {
    double delta = fabs( (double)(inUTData[i]-inEXData[i]) );

    /*   if ( delta != 0 ) printf("Calculated delta(%d) = %f, %d,%d \n", i, delta, inUTData[i], inEXData[i] ); */
    if ( delta > s->deviation ) {
      p->passed = 0;
    }
    outDeltaData[i] = Scale( delta );
  }
  out_delta->output.u.operation = 0;
  out_delta->output.length = len;

  memcpy( outActualData, inUTData,  in_unit_test->input.length);
  out_actual->output.u.operation = in_unit_test->input.u.operation;
  out_actual->output.length = in_unit_test->input.length;

}