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; }