public async Task <TestPulseWaveformResponse> Post( TestPulseWaveformRequest testPulseWaveformRequest) { if (testPulseWaveformRequest.Sections == null) { throw new ArgumentException("Sections not supplied"); } const int samplingFrequency = 10; testPulseWaveformRequest.PulseFrequency.ChanceOfHigh = 1; testPulseWaveformRequest.PulseFrequency.Variation.Progression = 0; // progression 0 is so it will always choose to use a feature, for the no feature one we use feature chooser to nullify it. var hfPulseGenerator = pulseGeneratorProvider.GetPulseGenerator(testPulseWaveformRequest, new GetPulseGeneratorParams { ChooseFeature = nameof(FeatureProbabilityModel.Frequency), SamplingFrequency = samplingFrequency }); testPulseWaveformRequest.PulseFrequency.ChanceOfHigh = 0; var lfPulseGenerator = pulseGeneratorProvider.GetPulseGenerator(testPulseWaveformRequest, new GetPulseGeneratorParams { ChooseFeature = nameof(FeatureProbabilityModel.Frequency), SamplingFrequency = samplingFrequency }); var nfPulseGenerator = pulseGeneratorProvider.GetPulseGenerator(testPulseWaveformRequest, new GetPulseGeneratorParams { ChooseFeature = string.Empty, SamplingFrequency = samplingFrequency }); // never chooses a feature int N = testPulseWaveformRequest.Sections.SectionLengthSeconds * samplingFrequency; var dataNf = new List <double[]>(); var dataLf = new List <double[]>(); var dataHf = new List <double[]>(); for (int n = 0; n <= N; n++) { var t = testPulseWaveformRequest.Sections.SectionLengthSeconds * (double)n / N; var alf = await lfPulseGenerator.Amplitude(t, n, 0); var ahf = await hfPulseGenerator.Amplitude(t, n, 0); var anf = await nfPulseGenerator.Amplitude(t, n, 0); dataNf.Add(new[] { t, anf }); dataLf.Add(new[] { t, alf }); dataHf.Add(new[] { t, ahf }); } return(new TestPulseWaveformResponse { Success = true, SampleNoFeature = dataNf.ToArray(), SampleHighFrequency = dataHf.ToArray(), SampleLowFrequency = dataLf.ToArray() }); }
public PulseGenerator GetPulseGenerator(TestPulseWaveformRequest testPulseWaveformRequest, GetPulseGeneratorParams parameters) { var pulseFrequencyModel = mapper.Map <PulseFrequency, PulseFrequencyModel>(testPulseWaveformRequest.PulseFrequency); var sectionsModel = mapper.Map <Sections, SectionsModel>(testPulseWaveformRequest.Sections); var waveformExpressionProvider = new WaveformExpressionProvider(testPulseWaveformRequest.WaveformExpression); var trackLength = TimeSpan.FromSeconds(testPulseWaveformRequest.Sections.SectionLengthSeconds); var waveFileMetadata = new WavefileMetadata(numberOfChannels: 1, phaseShiftCarrier: false, phaseShiftPulses: false, randomization: false, trackLength: trackLength); var featureChooser = new AlwaysFeatureChooser(parameters.ChooseFeature); var samplingFrequencyProvider = new SamplingFrequencyProvider(parameters.SamplingFrequency); // this composes a subset of the main file-creation component stack // (DependencyConfig.Configure(settings) creates the full stack) var nestedContainer = container.GetNestedContainer(); nestedContainer.AddInstance(sectionsModel); nestedContainer.AddInstance(pulseFrequencyModel); nestedContainer.AddInstance <IWaveformExpressionProvider>(waveformExpressionProvider); nestedContainer.AddInstance <IWaveFileMetadata>(waveFileMetadata); nestedContainer.AddInstance <IFeatureChooser>(featureChooser); nestedContainer.AddInstance <ISamplingFrequencyProvider>(samplingFrequencyProvider); var pulseGenerator = nestedContainer.Resolve <PulseGenerator>(); return(pulseGenerator); }