Beispiel #1
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 #2
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);
        }