コード例 #1
0
ファイル: Form1.cs プロジェクト: gareththegeek/ndaw
        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;
        }
コード例 #2
0
        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());
        }
コード例 #3
0
        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);
        }
コード例 #4
0
        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());
        }
コード例 #5
0
        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>());
        }
コード例 #6
0
 public void Should_throw_if_no_window_function_specified()
 {
     target = new ComplexFilter(
         new WaveFormat(),
         null,
         Substitute.For<IFilterImplementation>());
 }
コード例 #7
0
 public void Should_throw_if_no_format_specified()
 {
     target = new ComplexFilter(
         null,
         Substitute.For<IWindowFunction>(),
         Substitute.For<IFilterImplementation>());
 }
コード例 #8
0
ファイル: Form1.cs プロジェクト: gareththegeek/ndaw
        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;
        }