コード例 #1
0
        private float[] calculateLogAverages(float[] freqs)
        {
            var       realWidth = this.formWidth / this.pixelsPerLine;
            const int shift     = 0;
            var       width     = realWidth + shift;// width used to ignore low frequences

            int samples  = freqs.Length;
            var averages = new WeightedAverage(realWidth);

            float logRatio = width / (float)Math.Log(samples, 2);

            for (int i = 1; i < samples; i++)
            {
                float freq = i;
                float amp  = freqs[i];

                float logFreq = (float)Math.Log(i, 2);

                int newIndex = (int)(logFreq * logRatio) - shift;
                if (newIndex >= 0)
                {
                    averages.Add(newIndex, amp);
                }
            }

            return(averages.GetAverges());
        }
コード例 #2
0
        private static void findBand(WeightedAverage averages, float[] bandThresholds, float freq, float amp)
        {
            for (int n = 0; n < averages.Length; n++)
            {
                if (freq < bandThresholds[n])
                {
                    averages.Add(n, amp);
                    return;
                }
            }

            throw new Exception("Should have returned in for loop");
        }
コード例 #3
0
        private float[] calculateBands(float[] freqs)
        {
            /**
             * Source https://youtu.be/mHk3ZiKNH48
             * 7 hz Bands
             * 20-60
             * 60-250
             * 250-500
             * 500-2k
             * 2k-4k
             * 4k-6k
             * 6k-11k
             * 11k-20k
             *
             * 4000 samples between 20hz - 20khz
             * ~ 1 samples every 5hz
             *
             * use https://www.szynalski.com/tone-generator/
             * for testing
             *
             *
             *
             * Bands From HeadPhone software
             * 32
             * 64
             * 128
             * 250
             * 500
             * 1000
             * 2000
             * 4000
             * 8000
             * 16000
             *
             * using above as mid points
             *
             * 0= 0-48hz
             * 1= 48-96hz
             * 2= 96-..
             * 3= 192
             * 4= 384
             * 5= 768
             * 6= 1536
             * 7= 3072
             * 8= 6144
             * 9= 12288
             *
             * can use powers of 2 times 1.5
             * 2^n * 1.5
             * eg 2^5 * 1.5 = 48
             */


            const int bandCount = 10;
            int       samples   = freqs.Length;
            var       averages  = new WeightedAverage(bandCount)
            {
                squareValues = true
            };

            const int startPower     = 5;
            var       bandThresholds = new float[bandCount];

            for (int n = 0; n < bandCount; n++)
            {
                var max = (float)Math.Pow(2, n + startPower) * 1.5f;
                bandThresholds[n] = max;
            }

            float ratio = 20000f / samples;

            for (int i = 1; i < samples; i++)
            {
                float freq = i * ratio;
                float amp  = freqs[i];
                findBand(averages, bandThresholds, freq, amp);
            }

            return(averages.GetAverges());
        }