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(); }
/// <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; }
/// <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; }
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(); }