public DefaultSpectrogramConfig() { Overlap = 64; WdftSize = 2048; FrequencyRange = Configs.FrequencyRanges.Default; LogBase = 2; LogBins = 32; ImageLength = 128; UseDynamicLogBase = true; Stride = Configs.FingerprintStrides.Default; Window = new HanningWindow(); }
public static Complex[] BandPassFilterFactors(double lowPassFreq, double highPassFreq, double sampleFreq, int filterLength, int n) { var window = new HanningWindow(); var windowFilterFactors = window.WindowFactors(filterLength); var low = LowPassFilterFactors(lowPassFreq, sampleFreq, filterLength); var high = HighPassFilterFactors(highPassFreq, sampleFreq, filterLength); var lowWindowed = new double[n]; var highWindowed = new double[n]; for (int i = 0; i < filterLength; i++) { lowWindowed[i] = low[i] * windowFilterFactors[i]; highWindowed[i] = high[i] * windowFilterFactors[i]; } for (int i = filterLength; i < n; i++) { lowWindowed[i] = 0; highWindowed[i] = 0; } var shiftNumberFilter = (filterLength - 1) / 2; var lowShiftedFilter = lowWindowed.Take(shiftNumberFilter); var lowFilteredTemp = lowWindowed.Skip(shiftNumberFilter).ToList(); lowFilteredTemp.AddRange(lowShiftedFilter); lowWindowed = lowFilteredTemp.ToArray(); var highShiftedFilter = highWindowed.Take(shiftNumberFilter); var highFilteredTemp = highWindowed.Skip(shiftNumberFilter).ToList(); highFilteredTemp.AddRange(highShiftedFilter); highWindowed = highFilteredTemp.ToArray(); var lowComplex = FourierTransform.FFT(lowWindowed); var highComplex = FourierTransform.FFT(highWindowed); var bandPass = new Complex[n]; for (int i = 0; i < n; i++) { bandPass[i] = lowComplex[i] * highComplex[i]; } return(bandPass); }
public DefaultSpectrogramConfig() { Overlap = 64; WdftSize = 2048; FrequencyRange = new FrequencyRange { Min = 318, Max = 2000 }; LogBase = 2; LogBins = 32; ImageLength = 128; UseDynamicLogBase = true; NormalizeSignal = false; Stride = new IncrementalStaticStride(1536); Window = new HanningWindow(); }
public void WindowInPlaceTest() { const int length = 128 * 64; float[] outerSpace = TestUtilities.GenerateRandomSingleArray(length); float[] outerSpaceCopy = new float[outerSpace.Length]; outerSpace.CopyTo(outerSpaceCopy, 0); var windowFunction = new HanningWindow(); windowFunction.WindowInPlace(outerSpace, outerSpace.Length); WeightByHanningWindow(outerSpaceCopy); for (int i = 0; i < outerSpace.Length; i++) { Assert.AreEqual(true, (outerSpace[i] - outerSpaceCopy[i]) < 0.00001); } }
public DefaultSpectrogramConfig() { Overlap = 64; WdftSize = 2048; FrequencyRange = Configs.FrequencyRanges.Default; LogBase = 2; LogBins = 32; ImageLength = 128; UseDynamicLogBase = true; Stride = Configs.FingerprintStrides.Default; Window = new HanningWindow(); ScalingFunction = (value, max) => { float scaled = System.Math.Min(value / max, 1); int domain = 255; float c = (float)(1 / System.Math.Log(1 + domain)); return((float)(c * System.Math.Log(1 + scaled * domain))); }; }
public ShortSamplesSpectrogramConfig() { // 11,6 ms is 64/5512 or 512/44100 or 372/32000 // The closest power of 2 in 2's complement format: // 1024 / 32000 = 32 ms // 512 / 32000 = 16 ms // 256 / 32000 = 8 ms Overlap = 1024; // Original 64 // 371 ms is 2048/5512 or 16384/44100 or 11889/32000 // The closest power of 2 in 2's complement format: // 8192 / 32000 = 256 ms // 4096 / 32000 = 128 ms // 2048 / 32000 = 64 ms // Due to using this on many small samples, we need to reduce the window and overlap sizes // A transient is around 50 ms WdftSize = 2048; // 4096; // Original 2048 FrequencyRange = new FrequencyRange(40, 16000); // Original FrequencyRange(318, 2000); LogBase = System.Math.E; // Original 2 LogBins = 32; ImageLength = 128; // Original 128 // calculate samples per fingerprint //int samplesPerFingerprint = ImageLength * Overlap; UseDynamicLogBase = false; // Original true // 0,928 sec is 5115 / 5512 or 40924 / 44100 or 29695/32000 //Stride = new IncrementalStaticStride(29695, 0, samplesPerFingerprint); // Original IncrementalStaticStride(512); // a static stride of 0 means no gaps between consecutive images (fingerprints) Stride = new StaticStride(0); // Original IncrementalStaticStride(512); Window = new HanningWindow(); ScalingFunction = (value, max) => { float scaled = System.Math.Min(value / max, 1); int domain = 255; float c = (float)(1 / System.Math.Log(1 + domain)); return((float)(c * System.Math.Log(1 + scaled * domain))); }; }