void ExpressionFilter::Preflight( const SignalProperties& Input, SignalProperties& Output ) const { // Test whether configuration can be loaded. LCRandomGenerator rg; Expr startRunExpression( rg, Parameter( "StartRunExpression" ) ), stopRunExpression( rg, Parameter( "StopRunExpression" ) ); ExpressionMatrix expressions; LoadExpressions( Parameter( "Expressions" ), expressions, rg ); VariableContainer variables; // Request output signal properties: Output = Input; size_t numRows = expressions.size(), numCols = numRows ? expressions[0].size() : 0; if( numCols != 0 ) Output.SetChannels( numRows ) .SetElements( numCols ) .ElementUnit().SetGain( 1.0 ).SetOffset( 0.0 ).SetSymbol( "" ); // Try evaluating expressions. startRunExpression.Compile( variables ); startRunExpression.Evaluate(); GenericSignal preflightInput( Input ), preflightOutput( Output ); CompileExpressions( expressions, variables ); EvaluateExpressions( expressions, &preflightInput, &preflightOutput ); stopRunExpression.Compile( variables ); stopRunExpression.Evaluate(); }
void SpatialFilter::Preflight( const SignalProperties& Input, SignalProperties& Output ) const { // Parameter/Input consistency. if( Input.Channels() != Parameter( "SpatialFilter" )->NumColumns() ) bcierr << "The input signal's number of channels must match " << "the number of columns in the SpatialFilter parameter" << endl; // Output signal description. Output = Input; Output.SetChannels( 0 ).SetChannels( Parameter( "SpatialFilter" )->NumRows() ); if( !Parameter( "SpatialFilter" )->RowLabels().IsTrivial() ) for( int i = 0; i < Parameter( "SpatialFilter" )->NumRows(); ++i ) Output.ChannelLabels()[ i ] = Parameter( "SpatialFilter" )->RowLabels()[ i ]; }
void P3TemporalFilter::Preflight( const SignalProperties& Input, SignalProperties& Output ) const { // Required states. State( "Running" ); State( "StimulusCode" ); State( "StimulusType" ); OptionalState( "StimulusBegin" ); float outputSamples = MeasurementUnits::ReadAsTime( Parameter( "EpochLength" ) ); outputSamples *= Input.Elements(); outputSamples = ::ceil( outputSamples ); // Requested output signal properties. Output = Input; Output.SetChannels( Input.Channels() ) .SetElements( outputSamples ) .SetType( SignalType::float32 ) .ElementUnit().SetRawMin( 0 ) .SetRawMax( outputSamples - 1 ); }
void P3TemporalFilter::Initialize( const SignalProperties& /*Input*/, const SignalProperties& Output ) { mEpochs.clear(); mEpochSums.clear(); mOutputProperties = Output; mEpochsToAverage = Parameter( "EpochsToAverage" ); mVisualize = int( Parameter( "VisualizeP3TemporalFiltering" ) ); if( mVisualize ) { mTargetERPChannel = Parameter( "TargetERPChannel" ); SignalProperties visProperties = Output; visProperties.SetChannels( 12 ); mVisSignal = GenericSignal( visProperties ); mVis.Send( CfgID::WindowTitle, "ERP" ) .Send( mVisSignal.Properties() ) .Send( mVisSignal ); } }
void BufferedADC::Preflight( const SignalProperties&, SignalProperties& Output ) const { if( Parameter( "SourceBufferSize" ).InSampleBlocks() < 2 ) bcierr << "The SourceBufferSize parameter must be greater or" << " equal 2 sample blocks." << endl; State( "SourceTime" ); State( "Running" ); mAcquisitionProperties = Output; this->OnPreflight( mAcquisitionProperties ); Output = mAcquisitionProperties; int numStateChannels = 0; for( int ch = 0; ch < Output.Channels(); ++ch ) { bool isStateChannel = ( *Output.ChannelLabels()[ch].c_str() == StateMark ); if( numStateChannels && !isStateChannel ) bcierr_ << "State channels must be located at the end of the channel list"; else if( isStateChannel ) ++numStateChannels; } Output.SetChannels( Output.Channels() - numStateChannels ); }