protected List<SpectralImage> CutLogarithmizedSpectrum(float[][] logarithmizedSpectrum, int sampleRate, SpectrogramConfig configuration) { var strideBetweenConsecutiveImages = configuration.Stride; int overlap = configuration.Overlap; int index = (int)((float)strideBetweenConsecutiveImages.FirstStride / overlap); int numberOfLogBins = logarithmizedSpectrum[0].Length; var spectralImages = new List<SpectralImage>(); int width = logarithmizedSpectrum.GetLength(0); int fingerprintImageLength = configuration.ImageLength; int sequenceNumber = 0; while (index + fingerprintImageLength <= width) { float[][] spectralImage = AllocateMemoryForFingerprintImage(fingerprintImageLength, numberOfLogBins); for (int i = 0; i < fingerprintImageLength; i++) { Array.Copy(logarithmizedSpectrum[index + i], spectralImage[i], numberOfLogBins); } spectralImages.Add(new SpectralImage { Image = spectralImage, Timestamp = index * ((double)overlap / sampleRate), SequenceNumber = ++sequenceNumber }); index += fingerprintImageLength + (int)((float)strideBetweenConsecutiveImages.GetNextStride() / overlap); } return spectralImages; }
public int[] GenerateLogFrequenciesRanges(int sampleRate, SpectrogramConfig configuration) { if (configuration.UseDynamicLogBase) { return GenerateLogFrequenciesDynamicBase(sampleRate, configuration); } return GenerateStaticLogFrequencies(sampleRate, configuration); }
private int[] GenerateLogFrequenciesDynamicBase(int sampleRate, SpectrogramConfig configuration) { double logBase = Math.Exp(Math.Log((float)configuration.FrequencyRange.Max / configuration.FrequencyRange.Min) / configuration.LogBins); double mincoef = (float)configuration.WdftSize / sampleRate * configuration.FrequencyRange.Min; int[] indexes = new int[configuration.LogBins + 1]; for (int j = 0; j < configuration.LogBins + 1; j++) { int start = (int)((Math.Pow(logBase, j) - 1.0) * mincoef); indexes[j] = start + (int)mincoef; } return indexes; }
public List<SpectralImage> CreateLogSpectrogram(AudioSamples audioSamples, SpectrogramConfig configuration) { int width = (audioSamples.Samples.Length - configuration.WdftSize) / configuration.Overlap; if (width < 1) { return new List<SpectralImage>(); } float[][] frames = new float[width][]; int[] logFrequenciesIndexes = logUtility.GenerateLogFrequenciesRanges(audioSamples.SampleRate, configuration); float[] window = configuration.Window.GetWindow(configuration.WdftSize); Parallel.For(0, width, i => { float[] complexSignal = fftService.FFTForward(audioSamples.Samples, i * configuration.Overlap, configuration.WdftSize, window); frames[i] = ExtractLogBins(complexSignal, logFrequenciesIndexes, configuration.LogBins, configuration.WdftSize); }); return CutLogarithmizedSpectrum(frames, audioSamples.SampleRate, configuration); }
private int[] GenerateStaticLogFrequencies(int sampleRate, SpectrogramConfig configuration) { double logMin = Math.Log(configuration.FrequencyRange.Min, configuration.LogBase); double logMax = Math.Log(configuration.FrequencyRange.Max, configuration.LogBase); double delta = (logMax - logMin) / configuration.LogBins; int[] indexes = new int[configuration.LogBins + 1]; double accDelta = 0; for (int i = 0; i <= configuration.LogBins; ++i) { float freq = (float)Math.Pow(configuration.LogBase, logMin + accDelta); accDelta += delta; indexes[i] = FrequencyToSpectrumIndex(freq, sampleRate, configuration.WdftSize); // Find the start index in array from which to start the summation } return indexes; }
public new List<SpectralImage> CutLogarithmizedSpectrum(float[][] logarithmizedSpectrum, int sampleRate, SpectrogramConfig configuration) { return base.CutLogarithmizedSpectrum(logarithmizedSpectrum, sampleRate, configuration); }
public List<SpectralImage> CutLogarithmizedSpectrum(float[][] logarithmizedSpectrum, int sampleRate, SpectrogramConfig configuration) { var strideBetweenConsecutiveImages = configuration.Stride; int overlap = configuration.Overlap; int index = GetFrequencyIndexLocationOfAudioSamples(strideBetweenConsecutiveImages.FirstStride, overlap); int numberOfLogBins = configuration.LogBins; var spectralImages = new List<SpectralImage>(); int width = logarithmizedSpectrum.GetLength(0); int fingerprintImageLength = configuration.ImageLength; int sequenceNumber = 0; while (index + fingerprintImageLength <= width) { float[][] spectralImage = AllocateMemoryForFingerprintImage(fingerprintImageLength, numberOfLogBins); for (int i = 0; i < fingerprintImageLength; i++) { Buffer.BlockCopy(logarithmizedSpectrum[index + i], 0, spectralImage[i], 0, numberOfLogBins * sizeof(float)); } var startsAt = index * ((double)overlap / sampleRate); spectralImages.Add(new SpectralImage(spectralImage, startsAt, sequenceNumber)); index += fingerprintImageLength + GetFrequencyIndexLocationOfAudioSamples(strideBetweenConsecutiveImages.NextStride, overlap); sequenceNumber++; } return spectralImages; }