Esempio n. 1
0
        public void TestOnlineFeatureExtractor()
        {
            var mfccOptions = new MfccOptions
            {
                SamplingRate   = 8000,
                FeatureCount   = 5,
                FrameSize      = 256,
                HopSize        = 50,
                FilterBankSize = 8
            };

            var signal = new WhiteNoiseBuilder().OfLength(1000).Build();

            var mfccExtractor = new MfccExtractor(mfccOptions);
            var mfccVectors   = mfccExtractor.ComputeFrom(signal);

            var onlineMfccExtractor = new OnlineFeatureExtractor(new MfccExtractor(mfccOptions));
            var onlineMfccVectors   = new List <float[]>();

            var i = 0;

            while (i < signal.Length)
            {
                // emulating online blocks with different sizes:
                var size  = (i + 1) * 15;
                var block = signal.Samples.Skip(i).Take(size).ToArray();

                var newVectors = onlineMfccExtractor.ComputeFrom(block);

                onlineMfccVectors.AddRange(newVectors);

                i += size;
            }

            var diff = mfccVectors.Zip(onlineMfccVectors, (e, o) => e.Zip(o, (f1, f2) => f1 - f2).Sum());

            Assert.That(diff, Is.All.EqualTo(0).Within(1e-7f));
        }
Esempio n. 2
0
        private void generateSignalButton_Click(object sender, EventArgs e)
        {
            var sampleCount  = int.Parse(durationTextBox.Text);
            var samplingRate = _signal1?.SamplingRate ?? 16000;

            SignalBuilder signalBuilder;

            switch (builderComboBox.Text)
            {
            case "Sinusoid":
                signalBuilder = new SineBuilder();
                _signal2      = signalBuilder
                                .SetParameter("low", -0.4f)
                                .SetParameter("high", 0.4f)
                                .SetParameter("freq", 233 /*Hz*/)
                                .OfLength(sampleCount)
                                .SampledAt(samplingRate)
                                .Build();
                break;

            case "Sawtooth":
                signalBuilder = new SawtoothBuilder();
                _signal2      = signalBuilder
                                .SetParameter("low", -0.3f)
                                .SetParameter("high", 0.3f)
                                .SetParameter("freq", 233 /*Hz*/)
                                .OfLength(sampleCount)
                                .SampledAt(samplingRate)
                                .Build();
                break;

            case "Triangle Wave":
                signalBuilder = new TriangleWaveBuilder();
                _signal2      = signalBuilder
                                .SetParameter("low", -0.3f)
                                .SetParameter("high", 0.3f)
                                .SetParameter("freq", 233 /*Hz*/)
                                .OfLength(sampleCount)
                                .SampledAt(samplingRate)
                                .Build();
                break;

            case "Square Wave":
                signalBuilder = new SquareWaveBuilder();
                _signal2      = signalBuilder
                                .SetParameter("low", -0.25f)
                                .SetParameter("high", 0.25f)
                                .SetParameter("freq", 233 /*Hz*/)
                                .OfLength(sampleCount)
                                .SampledAt(samplingRate)
                                .Build();
                break;

            case "Pulse Wave":
                signalBuilder = new PulseWaveBuilder();
                _signal2      = signalBuilder
                                .SetParameter("min", 0)
                                .SetParameter("max", 0.5f)
                                .SetParameter("pulse", 0.007f /*sec*/)
                                .SetParameter("period", 0.020f /*sec*/)
                                .OfLength(sampleCount)
                                .DelayedBy(50)
                                .SampledAt(samplingRate)
                                .Build();
                break;

            case "Chirp":
                signalBuilder = new ChirpBuilder();
                _signal2      = signalBuilder
                                .SetParameter("min", -0.3f)
                                .SetParameter("max", 0.3f)
                                .OfLength(sampleCount)
                                .RepeatedTimes(3)
                                .SampledAt(samplingRate)
                                .Build();
                break;

            case "Sinc":
                signalBuilder = new SincBuilder();
                _signal2      = signalBuilder
                                .SetParameter("min", 0)
                                .SetParameter("max", 0.5f)
                                .SetParameter("freq", 700 /*Hz*/)
                                .OfLength(sampleCount)
                                .SampledAt(samplingRate)
                                .Build();
                break;

            case "Ramp":
                signalBuilder = new RampBuilder();
                _signal2      = signalBuilder
                                .SetParameter("slope", 0.0007f)
                                .SetParameter("intercept", -0.5f)
                                .OfLength(sampleCount)
                                .SampledAt(samplingRate)
                                .Build();
                break;

            case "AWGN":
                signalBuilder = new AwgnBuilder();
                _signal2      = signalBuilder
                                .SetParameter("sigma", 0.25f)
                                .OfLength(sampleCount)
                                .SampledAt(samplingRate)
                                .Build();
                break;

            case "Pink Noise":
                signalBuilder = new PinkNoiseBuilder();
                _signal2      = signalBuilder
                                .SetParameter("min", -0.5f)
                                .SetParameter("max", 0.5f)
                                .OfLength(sampleCount)
                                .SampledAt(samplingRate)
                                .Build();
                break;

            case "Red Noise":
                signalBuilder = new RedNoiseBuilder();
                _signal2      = signalBuilder
                                .SetParameter("min", -0.5f)
                                .SetParameter("max", 0.5f)
                                .OfLength(sampleCount)
                                .SampledAt(samplingRate)
                                .Build();
                break;

            case "Perlin Noise":
                signalBuilder = new PerlinNoiseBuilder();
                _signal2      = signalBuilder
                                .SetParameter("min", -0.3f)
                                .SetParameter("max", 0.7f)
                                .OfLength(sampleCount)
                                .SampledAt(samplingRate)
                                .Build();
                break;

            default:
                signalBuilder = new WhiteNoiseBuilder();
                _signal2      = signalBuilder
                                .SetParameter("min", -0.5f)
                                .SetParameter("max", 0.5f)
                                .OfLength(sampleCount)
                                .SampledAt(samplingRate)
                                .Build();
                break;
            }

            builderParametersListBox.Items.Clear();
            builderParametersListBox.Items.AddRange(signalBuilder.GetParametersInfo());
            builderParametersListBox.Items.Add("");
            builderParametersListBox.Items.Add($"min: {_signal2.Samples.Min():F2}");
            builderParametersListBox.Items.Add($"max: {_signal2.Samples.Max():F2}");
            builderParametersListBox.Items.Add($"avg: {_signal2.Samples.Average():F4}");

            if (_signal1 != null)
            {
                //_signal3 = _signal1 + _signal2;
                var positions = Enumerable.Range(0, 3).Select(pos => pos * (_signal2.Length + 2000)).ToArray();
                _signal3 = _signal1.SuperimposeMany(_signal2, positions);
                superimposedSignalPanel.Signal = _signal3;
            }

            generatedSignalPanel.Stride = 1;
            generatedSignalPanel.Signal = _signal2;

            var spectrum = _fft.PowerSpectrum(_signal2.First(512));

            spectrumPanel.Line = spectrum.Samples;
            spectrumPanel.ToDecibel();
        }