public void Test_SaveEmpty_Throws() { (int sampleRate, double[] audio) = WavFile.ReadMono("../../../../../data/cant-do-that-44100.wav"); int fftSize = 4096; var spec = new Spectrogram(sampleRate, fftSize, stepSize: 500); //spec.Add(audio); Assert.Throws <InvalidOperationException>(() => { spec.SaveImage("empty.png"); }); }
public void Test_Quickstart_Hal() { (int sampleRate, double[] audio) = WavFile.ReadMono("../../../../../data/cant-do-that-44100.wav"); int fftSize = 4096; var spec = new Spectrogram(sampleRate, fftSize, stepSize: 500, maxFreq: 3000); spec.Add(audio); spec.SaveImage("../../../../../dev/graphics/hal.png", intensity: .2); Console.WriteLine(spec); }
public void Test_AGC_off() { string wavFilePath = "../../../../../data/qrss-10min.wav"; (int sampleRate, double[] L) = WavFile.ReadMono(wavFilePath); int fftSize = 8192; var spec = new Spectrogram(sampleRate, fftSize, stepSize: 2000, maxFreq: 3000); spec.Add(L); spec.SaveImage("qrss-agc-off.png", intensity: 3); }
public void Test_Mel_Spectrogram() { (int sampleRate, double[] audio) = WavFile.ReadMono("../../../../../data/cant-do-that-44100.wav"); int fftSize = 4096; var spec = new Spectrogram(sampleRate, fftSize, stepSize: 500); spec.Add(audio); spec.SaveImage("halNotMel.png", 4, true); Bitmap bmp = spec.GetBitmapMel(250, 4, true); bmp.Save("../../../../../dev/graphics/halMel.png", ImageFormat.Png); }
public void Test_AGC_normWindow() { // strategy here is to create a weighted moving window mean and normalize to that string wavFilePath = "../../../../../data/qrss-10min.wav"; (int sampleRate, double[] L) = WavFile.ReadMono(wavFilePath); int fftSize = 8192; var spec = new Spectrogram(sampleRate, fftSize, stepSize: 2000, maxFreq: 3000); spec.Add(L); var ffts = spec.GetFFTs(); for (int i = 0; i < ffts.Count; i++) { ffts[i] = SubtractMovingWindowFloor(ffts[i]); } spec.SaveImage("qrss-agc-norm-window.png", intensity: 3); }
public void Test_Make_CommonColormaps() { (int sampleRate, double[] audio) = WavFile.ReadMono("../../../../../data/cant-do-that-44100.wav"); int fftSize = 1 << 12; var spec = new Spectrogram(sampleRate, fftSize, stepSize: 700, maxFreq: 2000); spec.SetWindow(FftSharp.Window.Hanning(fftSize / 3)); // sharper window than typical spec.Add(audio); // delete old colormap files foreach (var filePath in System.IO.Directory.GetFiles("../../../../../dev/graphics/", "hal-*.png")) { System.IO.File.Delete(filePath); } foreach (var cmap in Colormap.GetColormaps()) { spec.SetColormap(cmap); spec.SaveImage($"../../../../../dev/graphics/hal-{cmap.Name}.png", intensity: .5); Debug.WriteLine($"![](dev/graphics/hal-{cmap.Name}.png)"); } }
public void Test_Quickstart_Handel() { double[] audio = Mp3.Read("../../../../../data/Handel - Air and Variations.mp3"); int sampleRate = 44100; int fftSize = 16384; int targetWidthPx = 3000; int stepSize = audio.Length / targetWidthPx; var spec = new Spectrogram(sampleRate, fftSize, stepSize, maxFreq: 2200); spec.Add(audio); spec.SaveImage("../../../../../dev/spectrogram-song.jpg", intensity: 5, dB: true); Console.WriteLine(spec); /* * Spectrogram (2993, 817) * Vertical (817 px): 0 - 2,199 Hz, FFT size: 16,384 samples, 2.69 Hz/px * Horizontal (2993 px): 2.96 min, window: 0.37 sec, step: 0.06 sec, overlap: 84% */ }
public void Test_AGC_normToNoiseFloor() { // strategy here is to normalize to the magnitude of the quietest 20% of frequencies string wavFilePath = "../../../../../data/qrss-10min.wav"; (int sampleRate, double[] L) = WavFile.ReadMono(wavFilePath); int fftSize = 8192; var spec = new Spectrogram(sampleRate, fftSize, stepSize: 2000, maxFreq: 3000); spec.Add(L); var ffts = spec.GetFFTs(); double normalIntensity = 2; for (int i = 0; i < ffts.Count; i++) { double[] sorted = new double[ffts[i].Length]; ffts[i].CopyTo(sorted, 0); Array.Sort(sorted); double percentile = 0.25; int percentileIndex = (int)(percentile * ffts[0].Length); double floorValue = sorted[percentileIndex]; for (int y = 0; y < ffts[i].Length; y++) { ffts[i][y] = ffts[i][y] / floorValue * normalIntensity; } Console.WriteLine(floorValue); } spec.SaveImage("qrss-agc-norm-floor.png", intensity: 3); }