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; }
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; }