public List <bool[]> CreateFingerprintsFromAudioSamples(float[] samples, WorkUnitParameterObject param, out double[][] logSpectrogram) { IFingerprintingConfiguration configuration = param.FingerprintingConfiguration; AudioServiceConfiguration audioServiceConfiguration = new AudioServiceConfiguration { LogBins = configuration.LogBins, LogBase = configuration.LogBase, MaxFrequency = configuration.MaxFrequency, MinFrequency = configuration.MinFrequency, Overlap = configuration.Overlap, SampleRate = configuration.SampleRate, WindowSize = configuration.WindowSize, NormalizeSignal = configuration.NormalizeSignal, UseDynamicLogBase = configuration.UseDynamicLogBase }; // store the log spectrogram in the out variable logSpectrogram = AudioService.CreateLogSpectrogram( samples, configuration.WindowFunction, audioServiceConfiguration); return(this.CreateFingerprintsFromLogSpectrum( logSpectrogram, configuration.Stride, configuration.FingerprintLength, configuration.Overlap, configuration.TopWavelets)); }
public List<bool[]> CreateFingerprints(float[] samples, IFingerprintingConfiguration fingerprintingConfiguration) { float[][] spectrum = spectrumService.CreateLogSpectrogram(samples, fingerprintingConfiguration); return CreateFingerprintsFromLogSpectrum( spectrum, fingerprintingConfiguration.Stride, fingerprintingConfiguration.FingerprintLength, fingerprintingConfiguration.Overlap, fingerprintingConfiguration.TopWavelets); }
public WinDrawningTool(IFingerprintService fingerprintService, IAudioService audioService, ITagService tagService, IWorkUnitBuilder workUnitBuilder, IFingerprintingConfiguration fingerprintingConfiguration) { this.fingerprintService = fingerprintService; this.audioService = audioService; this.tagService = tagService; this.workUnitBuilder = workUnitBuilder; this.fingerprintingConfiguration = fingerprintingConfiguration; InitializeComponent(); Icon = Resources.Sound; _lbImageTypes.Items.Add("Single file"); _lbImageTypes.Items.Add("Separated images"); }
public float[][] CreateLogSpectrogram(float[] samples, IFingerprintingConfiguration configuration) { if (configuration.NormalizeSignal) { NormalizeInPlace(samples); } int width = (samples.Length - configuration.WdftSize) / configuration.Overlap; /*width of the image*/ float[][] frames = new float[width][]; int[] logFrequenciesIndexes = GenerateLogFrequencies(configuration); for (int i = 0; i < width; i++) { float[] complexSignal = fftService.FFTForward(samples, i * configuration.Overlap, configuration.WdftSize); frames[i] = ExtractLogBins(complexSignal, logFrequenciesIndexes, configuration.LogBins); } return frames; }
public WinDrawningTool( IAudioService audioService, ITagService tagService, IFingerprintUnitBuilder fingerprintUnitBuilder, IFingerprintingConfiguration fingerprintingConfiguration, IImageService imageService, ISpectrumService spectrumService) { this.audioService = audioService; this.tagService = tagService; this.fingerprintUnitBuilder = fingerprintUnitBuilder; this.fingerprintingConfiguration = fingerprintingConfiguration; this.imageService = imageService; this.spectrumService = spectrumService; InitializeComponent(); Icon = Resources.Sound; _lbImageTypes.Items.Add("Single file"); _lbImageTypes.Items.Add("Separated images"); }
/// <summary> /// Gets the spectrum of the wavelet decomposition before extracting top wavelets and binary transformation /// </summary> /// <param name="spectrum"> /// The spectrum. /// </param> /// <param name="configuration"> /// The configuration. /// </param> /// <returns> /// Image to be saved /// </returns> public static Image GetWaveletSpectralImage(float[][] spectrum, IFingerprintingConfiguration configuration) { List<float[][]> wavelets = new List<float[][]>(); int specLen = spectrum.GetLength(0); int start = configuration.Stride.FirstStrideSize / configuration.Overlap; int logbins = configuration.LogBins; int fingerprintLength = configuration.FingerprintLength; int overlap = configuration.Overlap; while (start + fingerprintLength < specLen) { float[][] frames = new float[fingerprintLength][]; for (int i = 0; i < fingerprintLength; i++) { frames[i] = new float[logbins]; Array.Copy(spectrum[start + i], frames[i], logbins); } start += fingerprintLength + (configuration.Stride.StrideSize / overlap); wavelets.Add(frames); } const int ImagesPerRow = 5; /*5 bitmap images per line*/ const int SpaceBetweenImages = 10; /*10 pixel space between images*/ int width = wavelets[0].GetLength(0); int height = wavelets[0][0].Length; int fingersCount = wavelets.Count; int rowCount = (int)Math.Ceiling((float)fingersCount / ImagesPerRow); int imageWidth = (ImagesPerRow * (width + SpaceBetweenImages)) + SpaceBetweenImages; int imageHeight = (rowCount * (height + SpaceBetweenImages)) + SpaceBetweenImages; Bitmap image = new Bitmap(imageWidth, imageHeight, PixelFormat.Format16bppRgb565); /*Change the background of the bitmap*/ for (int i = 0; i < imageWidth; i++) { for (int j = 0; j < imageHeight; j++) { image.SetPixel(i, j, Color.White); } } double maxValue = wavelets.Max((wavelet) => wavelet.Max((column) => column.Max())); int verticalOffset = SpaceBetweenImages; int horizontalOffset = SpaceBetweenImages; int count = 0; double max = wavelets.Max(wav => wav.Max(w => w.Max(v => Math.Abs(v)))); foreach (float[][] wavelet in wavelets) { for (int i = 0; i < width /*128*/; i++) { for (int j = 0; j < height /*32*/; j++) { Color color = ValueToBlackWhiteColor(wavelet[i][j], max / 4); image.SetPixel(i + horizontalOffset, j + verticalOffset, color); } } count++; if (count % ImagesPerRow == 0) { verticalOffset += height + SpaceBetweenImages; horizontalOffset = SpaceBetweenImages; } else { horizontalOffset += width + SpaceBetweenImages; } } return image; }
private int[] GenerateStaticLogFrequencies(IFingerprintingConfiguration configuration) { double logMin = Math.Log(configuration.MinFrequency, configuration.LogBase); double logMax = Math.Log(configuration.MaxFrequency, 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 /*32 octaves*/; ++i) { float freq = (float)Math.Pow(configuration.LogBase, logMin + accDelta); accDelta += delta; // accDelta = delta * i /*Find the start index in array from which to start the summation*/ indexes[i] = FreqToIndex(freq, configuration.SampleRate, configuration.WdftSize); } return indexes; }
private int[] GenerateLogFrequenciesDynamicBase(IFingerprintingConfiguration configuration) { double logBase = Math.Exp( Math.Log((float)configuration.MaxFrequency / configuration.MinFrequency) / configuration.LogBins); double mincoef = (float)configuration.WdftSize / configuration.SampleRate * configuration.MinFrequency; 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; }
/// <summary> /// Get logarithmically spaced indices /// </summary> /// <param name="configuration"> /// The configuration for log frequencies /// </param> /// <returns> /// Log indexes /// </returns> private int[] GenerateLogFrequencies(IFingerprintingConfiguration configuration) { if (configuration.UseDynamicLogBase) { return GenerateLogFrequenciesDynamicBase(configuration); } return GenerateStaticLogFrequencies(configuration); }
public static void SaveFingerprintingDebugImages(string fileName, double[][] logSpectrogram, List<bool[]> fingerprints, FingerprintService fingerprintService, IFingerprintingConfiguration fingerprintConfig) { ImageService imageService = new ImageService(fingerprintService.SpectrumService, fingerprintService.WaveletService); int fingerprintsPerRow = 2; imageService.GetSpectrogramImage(logSpectrogram, logSpectrogram.Length, logSpectrogram[0].Length).Save(fileName + "_spectrogram.png"); imageService.GetWaveletsImages(logSpectrogram, fingerprintConfig.Stride, fingerprintConfig.FingerprintLength, fingerprintConfig.Overlap, fingerprintsPerRow).Save(fileName + "_wavelets.png"); imageService.GetLogSpectralImages(logSpectrogram, fingerprintConfig.Stride, fingerprintConfig.FingerprintLength, fingerprintConfig.Overlap, fingerprintsPerRow).Save(fileName + "_spectrograms.png"); imageService.GetImageForFingerprints(fingerprints, fingerprintConfig.FingerprintLength, fingerprintConfig.LogBins, fingerprintsPerRow).Save(fileName + "_fingerprints.png"); }
public void SetUp() { modelService = new ModelService(new MsSqlDatabaseProviderFactory(new DefaultConnectionStringFactory()), new ModelBinderFactory()); fingerprintService = new FingerprintService(new FingerprintDescriptor(), new SpectrumService(new CachedFFTWService(new FFTWService86())), new WaveletService(new StandardHaarWaveletDecomposition())); defaultConfiguration = new DefaultFingerprintingConfiguration(); var mockedPermutations = new Mock<IPermutations>(); mockedPermutations.Setup(perms => perms.GetPermutations()).Returns(new int[1][]); permutations = mockedPermutations.Object; fingerprintUnitBuilderWithBass = new FingerprintUnitBuilder(fingerprintService, new BassAudioService(), new MinHashService(permutations)); #pragma warning disable 612,618 fingerprintUnitBuilderWithDirectSound = new FingerprintUnitBuilder(fingerprintService, new DirectSoundAudioService(), new MinHashService(permutations)); #pragma warning restore 612,618 }
public void SetUp() { connectionstring = ConnectionString; dalManager = new DaoGateway(connectionstring); fingerprintingServiceWithBass = new FingerprintService( new BassAudioService(), new FingerprintDescriptor(), new HaarWavelet()); fingerprintingServiceWithDirectSound = new FingerprintService( new DirectSoundAudioService(), new FingerprintDescriptor(), new HaarWavelet()); fingerprintingConfiguration = new DefaultFingerprintingConfiguration(); workUnitBuilder = new WorkUnitBuilder(); }