Beispiel #1
0
        private void openToolStripMenuItem_Click(object sender, EventArgs e)
        {
            var ofd = new OpenFileDialog();

            if (ofd.ShowDialog() != DialogResult.OK)
            {
                return;
            }

            using (var stream = new FileStream(ofd.FileName, FileMode.Open))
            {
                var waveFile = new WaveFile(stream);
                _signal = waveFile[Channels.Left];
            }

            _fftSize      = int.Parse(fftSizeTextBox.Text);
            _cepstrumSize = int.Parse(cepstrumSizeTextBox.Text);
            _hopSize      = int.Parse(hopSizeTextBox.Text);

            _fft = new RealFft(_fftSize);
            _cepstralTransform = new CepstralTransform(_cepstrumSize, _fftSize);

            var options = new PitchOptions
            {
                SamplingRate  = _signal.SamplingRate,
                FrameDuration = (double)_fftSize / _signal.SamplingRate,
                HopDuration   = (double)_hopSize / _signal.SamplingRate
            };

            var pitchExtractor = new PitchExtractor(options);

            _pitches = pitchExtractor.ParallelComputeFrom(_signal);

            _specNo = 0;
            specNoComboBox.DataSource = Enumerable.Range(1, _pitches.Count).ToArray();

            // obtain spectrogram

            _stft = new Stft(_fftSize, _hopSize, WindowTypes.Rectangular);
            var spectrogram = _stft.Spectrogram(_signal);

            spectrogramPanel.ColorMapName      = "viridis";
            spectrogramPanel.MarklineThickness = 6;
            spectrogramPanel.Spectrogram       = spectrogram.Select(s => s.Take(224).ToArray()).ToList();
            spectrogramPanel.Markline          = _pitches.Select(p => p[0] * _fftSize / _signal.SamplingRate).ToArray();
        }
Beispiel #2
0
        /// <summary>
        /// Constructs extractor from configuration <paramref name="options"/>.
        /// </summary>
        public PitchExtractor(PitchOptions options) : base(options)
        {
            _low  = (float)options.LowFrequency;
            _high = (float)options.HighFrequency;

            _blockSize = MathUtils.NextPowerOfTwo(2 * FrameSize - 1);
            _convolver = new Convolver(_blockSize);

            _reversed = new float[FrameSize];
            _cc       = new float[_blockSize];

            FeatureCount        = 1;
            FeatureDescriptions = new List <string>()
            {
                "pitch"
            };
        }
Beispiel #3
0
        public async void StartRecording()
        {
            if (_recorder != null)
            {
                StopRecording();
            }

            var context      = Android.App.Application.Context;
            var audioManager = (AudioManager)context.GetSystemService(Context.AudioService);

            _samplingRate = int.Parse(audioManager.GetProperty(AudioManager.PropertyOutputSampleRate));

            //_bufferSize = 4 * AudioRecord.GetMinBufferSize(_samplingRate, ChannelIn.Mono, Encoding.PcmFloat);
            _bufferSize = 4 * AudioRecord.GetMinBufferSize(_samplingRate, ChannelIn.Mono, Encoding.Pcm16bit);
            _recorder   = new AudioRecord(AudioSource.Mic, _samplingRate, _channelCount, _audioEncodingType, _bufferSize);

            //uncomment for PcmFloat mode: =====================
            //_sizeInFloats = _bufferSize / sizeof(float);
            //instead of Pcm16bit: =============================
            _sizeInFloats = _bufferSize / sizeof(short);
            _data         = new float[1][];
            _data[0]      = new float[_sizeInFloats]; // only one channel (mono)

            _bytes = new byte[_bufferSize];
            _temp  = new byte[_sizeInFloats * sizeof(float)];


            var options = new PitchOptions
            {
                SamplingRate  = _samplingRate,
                FrameDuration = (double)_sizeInFloats / _samplingRate
            };

            _pitchExtractor = new PitchExtractor(options);
            _pitch          = new float[1];

            _robotizer = new RobotEffect(216, 1024);

            _recorder.StartRecording();
            _isRecording = true;

            await ProcessAudioData();
        }
Beispiel #4
0
        private void openToolStripMenuItem_Click(object sender, EventArgs e)
        {
            var ofd = new OpenFileDialog();

            if (ofd.ShowDialog() != DialogResult.OK)
            {
                return;
            }

            using (var stream = new FileStream(ofd.FileName, FileMode.Open))
            {
                var waveFile = new WaveFile(stream);
                _signal = waveFile[Channels.Left];
            }

            _stft = new Stft(_frameSize, _hopSize);

            var frameDuration = (double)_frameSize / _signal.SamplingRate;
            var hopDuration   = (double)_hopSize / _signal.SamplingRate;

            var freqs = new[] { 300f, 600, 1000, 2000, 4000, 7000 };

            var pitchOptions = new PitchOptions
            {
                SamplingRate  = _signal.SamplingRate,
                FrameDuration = frameDuration,
                HopDuration   = hopDuration,
                HighFrequency = 900/*Hz*/
            };

            var pitchExtractor = new PitchExtractor(pitchOptions);
            var pitchTrack     = pitchExtractor.ParallelComputeFrom(_signal)
                                 .Select(p => p[0])
                                 .ToArray();

            var options = new MultiFeatureOptions
            {
                SamplingRate  = _signal.SamplingRate,
                FrameDuration = frameDuration,
                HopDuration   = hopDuration
            };

            var tdExtractor = new TimeDomainFeaturesExtractor(options);

            tdExtractor.AddFeature("pitch_zcr", (signal, start, end) => Pitch.FromZeroCrossingsSchmitt(signal, start, end));

            var mpeg7Extractor = new Mpeg7SpectralFeaturesExtractor(options);

            mpeg7Extractor.IncludeHarmonicFeatures("all");
            mpeg7Extractor.SetPitchTrack(pitchTrack);

            options.FeatureList = "sc+sn";
            options.Frequencies = freqs;
            var spectralExtractor = new SpectralFeaturesExtractor(options);
            //spectralExtractor.AddFeature("pitch_hss", (spectrum, fs) => Pitch.FromHss(spectrum, _signal.SamplingRate));

            var tdVectors       = tdExtractor.ParallelComputeFrom(_signal);
            var spectralVectors = spectralExtractor.ParallelComputeFrom(_signal);
            var mpeg7Vectors    = mpeg7Extractor.ComputeFrom(_signal);

            _vectors = FeaturePostProcessing.Join(tdVectors, spectralVectors, mpeg7Vectors);

            //FeaturePostProcessing.NormalizeMean(_vectors);
            //FeaturePostProcessing.AddDeltas(_vectors);

            var descriptions = tdExtractor.FeatureDescriptions
                               .Concat(spectralExtractor.FeatureDescriptions)
                               .Concat(mpeg7Extractor.FeatureDescriptions)
                               .ToList();

            FillFeaturesList(_vectors, descriptions, tdExtractor.TimeMarkers(_vectors.Length));

            spectrogramPlot.ColorMapName      = "afmhot";
            spectrogramPlot.MarklineThickness = 2;
            spectrogramPlot.Spectrogram       = _stft.Spectrogram(_signal);
        }