void ARThread::OnPreflight( const SignalProperties& Input, SignalProperties& Output ) const { if( Input.Elements() < Parameter( "ModelOrder" ) ) bcierr << "WindowLength parameter must be large enough" << " for the number of samples to exceed the model order" << endl; if( Parameter( "OutputType" ) == Coefficients ) { Output = Input; Output.SetName( "AR Coefficients" ); Output.SetElements( Parameter( "ModelOrder" ) ); Output.ElementUnit().SetSymbol( "" ) .SetOffset( 0 ) .SetGain( 1 ) .SetRawMin( 0 ) .SetRawMax( Output.Elements() - 1 ); } else { SpectrumThread::OnPreflight( Input, Output ); Output.SetName( "AR " + Output.Name() ); } }
void WindowingThread::OnPreflight( const SignalProperties& Input, SignalProperties& Output ) const { Output = Input; double windowLength = Parameter( "WindowLength" ).InSampleBlocks(); int numSamples = static_cast<int>( windowLength * Input.Elements() ); if( numSamples < 0 ) { bcierr << "WindowLength parameter must be >= 0" << endl; numSamples = 0; } Output.SetElements( numSamples ) .SetIsStream( false ) .ElementUnit().SetRawMin( 0 ) .SetRawMax( Output.Elements() - 1 ); }
void ARFilter::Preflight( const SignalProperties& Input, SignalProperties& Output ) const { // Parameter consistency checks. float windowLength = MeasurementUnits::ReadAsTime( Parameter( "WindowLength" ) ); int samplesInWindow = windowLength * Parameter( "SampleBlockSize" ); if( samplesInWindow < Parameter( "ModelOrder" ) ) bcierr << "WindowLength parameter must be large enough" << " for the number of samples to exceed the model order" << endl; Output = Input; switch( int( Parameter( "OutputType" ) ) ) { case SpectralAmplitude: case SpectralPower: { float firstBinCenter = MeasurementUnits::ReadAsFreq( Parameter( "FirstBinCenter" ) ), lastBinCenter = MeasurementUnits::ReadAsFreq( Parameter( "LastBinCenter" ) ), binWidth = MeasurementUnits::ReadAsFreq( Parameter( "BinWidth" ) ); if( firstBinCenter > 0.5 || firstBinCenter < 0 || lastBinCenter > 0.5 || lastBinCenter < 0 ) bcierr << "FirstBinCenter and LastBinCenter must be greater zero and" << " less than half the sampling rate" << endl; if( firstBinCenter >= lastBinCenter ) bcierr << "FirstBinCenter must be less than LastBinCenter" << endl; if( binWidth <= 0 ) bcierr << "BinWidth must be greater zero" << endl; else { int numBins = ::floor( ( lastBinCenter - firstBinCenter + eps ) / binWidth + 1 ); Output.SetElements( numBins ); } Output.ElementUnit().SetOffset( firstBinCenter / binWidth ) .SetGain( binWidth * Parameter( "SamplingRate" ) ) .SetSymbol( "Hz" ); Output.ValueUnit().SetRawMin( 0 ); float inputAmplitude = Input.ValueUnit().RawMax() - Input.ValueUnit().RawMin(), whiteNoisePowerPerBin = inputAmplitude * inputAmplitude / binWidth / 10; switch( int( Parameter( "OutputType" ) ) ) { case SpectralAmplitude: Output.SetName( "AR Amplitude Spectrum" ); Output.ValueUnit().SetOffset( 0 ) .SetGain( 1e-6 ) .SetSymbol( "V/sqrt(Hz)" ) .SetRawMax( ::sqrt( whiteNoisePowerPerBin ) ); break; case SpectralPower: { Output.SetName( "AR Power Spectrum" ); Output.ValueUnit().SetOffset( 0 ) .SetGain( 1 ) .SetSymbol( "(muV)^2/Hz" ) .SetRawMax( whiteNoisePowerPerBin ); } break; } } break; case ARCoefficients: Output.SetName( "AR Coefficients" ); Output.SetElements( Parameter( "ModelOrder" ) ); Output.ElementUnit().SetOffset( 0 ) .SetGain( 1 ) .SetSymbol( "" ); Output.ValueUnit().SetOffset( 0 ) .SetGain( 1 ) .SetSymbol( "" ) .SetRawMin( -1 ) .SetRawMax( 1 ); break; default: bcierr << "Unknown OutputType" << endl; } Output.ElementUnit().SetRawMin( 0 ) .SetRawMax( Output.Elements() - 1 ); }