Пример #1
0
 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();
 }
Пример #2
0
        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);
        }
Пример #3
0
 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();
 }
Пример #4
0
        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)));
     };
 }
Пример #6
0
        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)));
            };
        }