internal override void Process(Sample Sample) { if (Sample.Silent) { return; } double minFreq = Sample.MinFreq; double maxFreq = Sample.MaxFreq; double sampleRate = Sample.Format.SamplesPerSecond; double[] spectr = new double[Sample.Spectrogram.Length]; for (int i = 0; i < spectr.Length; i++) { spectr[i] = Spectrometer.Abs2(Sample.Spectrogram[i]); } int usefullMinSpectr = Math.Max(0, (int)(minFreq * spectr.Length / sampleRate)); int usefullMaxSpectr = Math.Min(spectr.Length, (int)(maxFreq * spectr.Length / sampleRate) + 1); int[] peakIndices = FindPeaks(spectr, usefullMinSpectr, usefullMaxSpectr - usefullMinSpectr, PeaksCount); if (Array.IndexOf(peakIndices, usefullMinSpectr) >= 0) { Sample.FundamentalFreq = 0; return; } const int verifyFragmentOffset = 0; int verifyFragmentLength = (int)(sampleRate / minFreq); double minPeakValue = Double.PositiveInfinity; int minPeakIndex = 0; int minOptimalInterval = 0; for (int i = 0; i < peakIndices.Length; i++) { int index = peakIndices[i]; int binIntervalStart = spectr.Length / (index + 1); int binIntervalEnd = spectr.Length / index; int interval; double peakValue; ScanSignalIntervals(Sample.EqualizedData, verifyFragmentOffset, verifyFragmentLength, binIntervalStart, binIntervalEnd, out interval, out peakValue); if (peakValue < minPeakValue) { minPeakValue = peakValue; minPeakIndex = index; minOptimalInterval = interval; } } Sample.FundamentalFreq = (double)sampleRate / minOptimalInterval; }
public SoundProcessor(UpdateMuscialSymbolDelegate UpdateMuscialSymbolDelegate, Settings settings) { Preprocessor = new Preprocessor(); Splitter = new KvantSound.Splitter(OnSplittedSamples); Equalizer = new KvantSound.Equalizer(); Normalizer = new KvantSound.Normalizer(); Spectrometer = new KvantSound.Spectrometer(); PitchDetector = new PitchDetector(); this.UpdateMuscialSymbolDelegate = UpdateMuscialSymbolDelegate; this.settings = settings ?? new Settings(); ApplySettings(); }
internal override void Process(Sample Sample) { double[] Spectr = new double[Sample.Spectrogram.Length]; for (int i = 0; i < Spectr.Length; i++) { Spectr[i] = Spectrometer.Abs2(Sample.Spectrogram[i]); } double[][] DownSamples = new double[DownSamplesCount][]; for (int i = 0; i < DownSamplesCount; i++) { int DownSampleLength = Spectr.Length / (i + 2); double Ratio = (double)DownSampleLength / Spectr.Length; DownSamples[i] = new double[DownSampleLength]; for (int j = 0; j < Spectr.Length; j++) { DownSamples[i][(int)(j * Ratio)] += Spectr[j]; } for (int j = 0; j < DownSamples[i].Length; j++) { DownSamples[i][j] *= Ratio; } } double[] SampleMult = new double[DownSamples[DownSamplesCount - 1].Length]; double Max = 0; int IndOfMax = 0; for (int i = 0; i < SampleMult.Length; i++) { SampleMult[i] = Spectr[i]; for (int j = 0; j < DownSamplesCount; j++) { SampleMult[i] *= DownSamples[j][i]; } if (Max < SampleMult[i]) { Max = SampleMult[i]; IndOfMax = i; } } Sample.FundamentalFreq = (double)IndOfMax / Spectr.Length * Sample.Format.SamplesPerSecond; }