Esempio n. 1
0
        private void GetOnsets(Wav w, MemoryAllocator allocator)
        {
            //construct the spectrogram
            var s = new Spectrogram(w, allocator, _options.WindowSize, _options.FPS, _options.Online, NeedPhaseInformation(_options.DetectionFunction));

            //perform adaptive whitening
            if (_options.AdaptiveWhitening)
            {
                s.AW(_options.AWFloor, _options.AWRelax);
            }

            //construct the filterbank
            var filt = new Filter(_options.WindowSize / 2, w.Samplerate, allocator);

            //filter the spectrogram
            s.Filter(filt.Filterbank);

            //take the log of the spectrogram
            if (_options.Log)
            {
                s.Log(_options.LogMultiplier, _options.LogAdd);
            }

            //calculate the activations
            var sodf = new SpectralODF(s, allocator);
            var act  = GetActivations(sodf, _options.DetectionFunction);

            //detect the onsets
            var o = new Onsets(act, _options.FPS);

            o.Detect(_options.ActivationThreshold, _options.MinimumTimeDelta, delay: w.Delay * 1000);
            var count = o.Detections.Count(f => f < (w.Delay + w.Padding));

            //add the onsets to the collection
            lock (_lock)
            {
                _onsets.AddRange(o.Detections.Skip(count));
                _amplitudes.AddRange(o.Amplitudes.Skip(count));
            }

            _completed++;
            ProgressReporter.Report(String.Format("{0}%", Math.Round((((float)_completed / _sliceCount)) * 100f)));

            //cleanup
            s.Cleanup();
            filt.Cleanup();
        }
Esempio n. 2
0
 /// <summary>
 /// Creates a new ODF object instance
 /// </summary>
 /// <param name="spectogram">the spectrogram on which the detection functions operate</param>
 /// <param name="ratio">calculate the difference to the frame which has the given magnitude ratio</param>
 /// <param name="frames">calculate the difference to the N-th previous frame</param>
 public SpectralODF(Spectrogram spectogram, MemoryAllocator allocator, float ratio=0.22f, int frames=0)
 {
     _s = spectogram;
     _allocator = allocator;
     //determine the number of diff frames
     if (frames == 0)
     {
         //get the first sample with a higher magnitude than given ratio
         var sample = _s.Window.Find(f => f > ratio).Item1;
         var diff_samples = _s.Window.Count / 2 - sample;
         //convert to frames
         frames = (int)Math.Round(diff_samples / _s.HopSize);
     }
     //set the minimum to 1
     if (frames < 1) frames = 1;
     _diffFrames = frames;
 }
Esempio n. 3
0
 /// <summary>
 /// Creates a new ODF object instance
 /// </summary>
 /// <param name="spectogram">the spectrogram on which the detection functions operate</param>
 /// <param name="ratio">calculate the difference to the frame which has the given magnitude ratio</param>
 /// <param name="frames">calculate the difference to the N-th previous frame</param>
 public SpectralODF(Spectrogram spectogram, MemoryAllocator allocator, float ratio = 0.22f, int frames = 0)
 {
     _s         = spectogram;
     _allocator = allocator;
     //determine the number of diff frames
     if (frames == 0)
     {
         //get the first sample with a higher magnitude than given ratio
         var sample       = _s.Window.Find(f => f > ratio).Item1;
         var diff_samples = _s.Window.Count / 2 - sample;
         //convert to frames
         frames = (int)Math.Round(diff_samples / _s.HopSize);
     }
     //set the minimum to 1
     if (frames < 1)
     {
         frames = 1;
     }
     _diffFrames = frames;
 }
Esempio n. 4
0
        private void GetOnsets(Wav w, MemoryAllocator allocator)
        {
            //construct the spectrogram
            var s = new Spectrogram(w, allocator, _options.WindowSize, _options.FPS, _options.Online, NeedPhaseInformation(_options.DetectionFunction));

            //perform adaptive whitening
            if (_options.AdaptiveWhitening) s.AW(_options.AWFloor, _options.AWRelax);

            //construct the filterbank
            var filt = new Filter(_options.WindowSize / 2, w.Samplerate, allocator);

            //filter the spectrogram
            s.Filter(filt.Filterbank);

            //take the log of the spectrogram
            if (_options.Log) s.Log(_options.LogMultiplier, _options.LogAdd);

            //calculate the activations
            var sodf = new SpectralODF(s, allocator);
            var act = GetActivations(sodf, _options.DetectionFunction);

            //detect the onsets
            var o = new Onsets(act, _options.FPS);
            o.Detect(_options.ActivationThreshold, _options.MinimumTimeDelta,  delay: w.Delay * 1000);
            var count = o.Detections.Count(f => f < (w.Delay + w.Padding));

            //add the onsets to the collection
            lock (_lock)
            {
                _onsets.AddRange(o.Detections.Skip(count));
                _amplitudes.AddRange(o.Amplitudes.Skip(count));
            }

            _completed++;
            ProgressReporter.Report(String.Format("{0}%", Math.Round((((float)_completed / _sliceCount))*100f)));

            //cleanup
            s.Cleanup();
            filt.Cleanup();
        }