private void BuildAudioInChain(WaveFormat monoFormat) { filter = new ComplexFilter( monoFormat, new BlackmanHarrisWindowFunction(), new FirFilter()); filter.Filters.Add(new DigitalFilter { FilterFunction = new LowPassFilterFunction(), LowerCutOffFrequency = 10000f }); filterNode = new MonoSignalNode(monoFormat, filter.FilterImplementation); fourier = new FourierTransform( new FastFourierTransformProvider(), new BlackmanHarrisWindowFunction(), 2048); fourierNode = new MonoSignalNode(monoFormat, fourier); fourier.DataReady += fourierControl.fourier_DataReady; flanger = new Flanger(new SineWave()); flangerNode = new MonoSignalNode(monoFormat, flanger); flangerNode.CentreIn.Source = asioInput.Sources.First(); //flangerNode.CentreIn.Source = waveCard.Inputs.First(); filterNode.CentreIn.Source = flangerNode.CentreOut; fourierNode.CentreIn.Source = filterNode.CentreOut; asioOutput.Sinks.ElementAt(0).Source = filterNode.CentreOut; asioOutput.Sinks.ElementAt(1).Source = filterNode.CentreOut; //waveCard.Outputs.ElementAt(0).Source = filterNode.CentreOut; //waveCard.Outputs.ElementAt(1).Source = filterNode.CentreOut; }
public void Should_apply_window_function_to_coefficients_on_instantiation() { var expected = new[] { 1f, 2f, 3f, 4f, 5f, 6f, 7f, 8f, 9f, 10f, 11f, 12f, 13f, 14f, 15f, 16f, 17f, 18f, 19f, 20f, 21f }; windowFunction.CalculateCoefficients(Arg.Is<int>(20)).Returns(expected); target = new ComplexFilter(new WaveFormat(), windowFunction, implementation); CollectionAssert.AreEqual(expected, implementation.Coefficients, new FloatComparer()); }
public void TestInitialise() { format = new WaveFormat(44100, 2); windowFunction = Substitute.For<IWindowFunction>(); implementation = Substitute.For<IFilterImplementation>(); windowFunction .CalculateCoefficients(Arg.Any<int>()) .Returns(new float[21]); target = new ComplexFilter(format, windowFunction, implementation); }
public void Should_update_implementation_coefficients_when_filter_collection_changes() { var windowFunctionCoefficients = new[] { 1f, 2f, 3f, 4f, 5f, 1f, 2f, 3f, 4f, 5f, 1f, 2f, 3f, 4f, 5f, 1f, 2f, 3f, 4f, 5f, 1f }; var filterFunctionCoefficients = new[] { 7f, 5f, 2f, 7f, 5f, 2f, 7f, 5f, 2f, 7f, 5f, 2f, 7f, 5f, 2f, 7f, 5f, 2f, 7f, 5f, 2f }; var expected = new[] { // Product of filter and window functions 7f, 10f, 6f, 28f, 25f, 2f, 14f, 15f, 8f, 35f, 5f, 4f, 21f, 20f, 10f, 7f, 10f, 6f, 28f, 25f, 2f }; windowFunction.CalculateCoefficients(Arg.Any<int>()) .Returns(windowFunctionCoefficients); var filter = Substitute.For<IDigitalFilter>(); filter .CalculateCoefficients(Arg.Is<int>(20), Arg.Is<int>(44100)) .Returns(filterFunctionCoefficients); target = new ComplexFilter( new WaveFormat(44100, 2), windowFunction, implementation); target.Filters.Add(filter); CollectionAssert.AreEqual(expected, implementation.Coefficients, new FloatComparer()); }
public void Should_throw_if_window_function_returns_the_wrong_number_of_coefficients() { windowFunction.CalculateCoefficients(Arg.Any<int>()) .Returns(new float[] { }); var target = new ComplexFilter( new WaveFormat(), windowFunction, Substitute.For<IFilterImplementation>()); }
public void Should_throw_if_no_window_function_specified() { target = new ComplexFilter( new WaveFormat(), null, Substitute.For<IFilterImplementation>()); }
public void Should_throw_if_no_format_specified() { target = new ComplexFilter( null, Substitute.For<IWindowFunction>(), Substitute.For<IFilterImplementation>()); }
private void BuildSineWaveChain(WaveFormat stereoFormat) { sineWave = new SineWave(); sineWaveNode = new StereoSignalNode(stereoFormat, sineWave); sineWaveNode.LeftIn.Source = asioInput.Sources.ElementAt(0); sineWaveNode.RightIn.Source = asioInput.Sources.ElementAt(0); filter = new ComplexFilter( stereoFormat, new BlackmanHarrisWindowFunction(), new FirFilter()); filter.Filters.Add(new DigitalFilter { FilterFunction = new BandStopFilterFunction(), LowerCutOffFrequency = 10000f, UpperCutOffFrequency = 12000f }); stereoFilterNode = new StereoSignalNode(stereoFormat, filter.FilterImplementation); stereoFilterNode.LeftIn.Source = sineWaveNode.LeftOut; stereoFilterNode.RightIn.Source = sineWaveNode.RightOut; fourier = new FourierTransform( new FastFourierTransformProvider(), new BlackmanHarrisWindowFunction(), 2048); fourierNode = new MonoSignalNode(stereoFormat, fourier); fourier.DataReady += fourierControl.fourier_DataReady; fourierNode.CentreIn.Source = stereoFilterNode.LeftOut; asioOutput.Sinks.ElementAt(0).Source = stereoFilterNode.LeftOut; asioOutput.Sinks.ElementAt(1).Source = stereoFilterNode.RightOut; }