Beispiel #1
0
        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"); });
        }
Beispiel #2
0
        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);
        }
Beispiel #3
0
        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);
        }
Beispiel #4
0
        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);
        }
Beispiel #5
0
        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);
        }
Beispiel #6
0
        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)");
            }
        }
Beispiel #7
0
        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%
             */
        }
Beispiel #8
0
        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);
        }