public DefaultFingerprintingConfiguration()
        {
            // The parameters used in these transformation steps will be equal to those that have been found to work well in other audio fingerprinting studies
            // (specifically in A Highly Robust Audio Fingerprinting System):
            // audio frames that are 371 ms long (2048 samples),
            // taken every 11.6 ms (64 samples),
            // thus having an overlap of 31/32
            FingerprintLength = 128;
            WdftSize = 2048; 	// 2048/5512 	= 371 ms
            Overlap = 64;		// 64/5512 		= 11,6 ms
            SamplesPerFingerprint = FingerprintLength * Overlap;
            MinFrequency = 318;
            MaxFrequency = 2000;
            SampleRate = 5512;
            LogBase = 2; // 2 or 10;

            // In Content Fingerprinting Using Wavelets, a static 928 ms stride was used in database creation,
            // and a random 0-46 ms stride was used in querying (random stride was used in order to minimize the coarse effect of unlucky time alignment).
            Stride = new IncrementalStaticStride(5115, FingerprintLength * Overlap); // 5115 / 5512 = 0,928 sec

            TopWavelets = 200;
            LogBins = 32;
            WindowFunction = new HannWindow(WdftSize);
            NormalizeSignal = true;
            UseDynamicLogBase = false;
        }
        public FullFrequencyFingerprintingConfiguration(bool useRandomStride = false)
        {
            // http://www.codeproject.com/Articles/206507/Duplicates-detector-via-audio-fingerprinting
            // The parameters used in these transformation steps will be close to those that have been found to work well in other audio fingerprinting studies
            // (specifically in A Highly Robust Audio Fingerprinting System):
            // audio frames that are 371 ms long
            // taken every 11.6 ms,
            // thus having an overlap of 31/32

            // 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
            WindowSize = 8192;

            // 11,6 ms	is 	64/5512		or	512/44100	or 372/32000
            // The closest power of 2 in 2's complement format: 512 / 32000 = 16 ms
            // 1024 / 32000 = 32 ms
            Overlap = 1024;

            // Gets number of samples to read in order to create single signature.
            // The granularity is 1.48 seconds (11,6 ms	* 128) for SR 5512 hz
            // The granularity is 2.048 seconds (16 ms	* 128) for SR 32000 hz
            // 512 * 128 = 65536
            FingerprintLength = 128;
            SamplesPerFingerprint = FingerprintLength * Overlap;

            // (Originally this was 32, but 40 seems to work better with SCMS?!)
            LogBins = 40;

            // Each fingerprint will be LogBins x FingerprintLength x 2 Bits long
            // e.g. 128 x 32 x 2 = 8192
            // or 128 x 40 x 2 = 10240
            StartFingerprintIndex = 0;
            EndFingerprintIndex = LogBins * FingerprintLength * 2;

            // Reduce the frequency range
            MinFrequency = 40; 		// 318; 	Full Frequency: 20
            MaxFrequency = 16000; 	// 2000; 	Full Frequency: 22050

            // Using 32000 (instead of 44100) gives us a max of 16 khz resolution, which is OK for normal adult human hearing
            SampleRate = 32000; 	// 5512 or 44100
            LogBase = 10; 		// Math.E, 2 or 10;

            // In Content Fingerprinting Using Wavelets, a static 928 ms stride was used in database creation,
            // and a random 0-46 ms stride was used in querying (random stride was used in order to minimize the coarse effect of unlucky time alignment).
            if (useRandomStride) {
                // 0,046 sec is 2028 / 44100	or 	1472/32000
                // use a 128 ms random stride instead = 4096, since every 46 ms gives way too many fingerprints to query efficiently
                Stride = new IncrementalRandomStride(1, 4096, SamplesPerFingerprint);
            } else {
                // 0,928 sec is	5115 / 5512 or 40924 / 44100	or	29695/32000
                Stride = new IncrementalStaticStride(29695, SamplesPerFingerprint);
            }

            TopWavelets = 200;
            WindowFunction = new HannWindow(WindowSize);
            NormalizeSignal = true; 	// true;
            UseDynamicLogBase = false;	// false;

            // Number of LSH tables
            NumberOfHashTables = 25;

            // Number of Min Hash keys per 1 hash function (1 LSH table)
            NumberOfKeys = 4;
        }