コード例 #1
0
        public static void SPLToAdjustmentDB(
            double dbSPLL,
            double dbSPLR,
            out double dbAdjustL,
            out double dbAdjustR,
            Calibration.Source source = Calibration.Source.Custom)
        {
            dbSPLL = GeneralMath.Clamp(dbSPLL, -60, dbMax);
            dbSPLR = GeneralMath.Clamp(dbSPLR, -60, dbMax);

            //Start with Left calculation
            Calibration.GetLevelOffset(
                level: dbSPLL,
                levelOffsetL: out double dbOffsetL,
                levelOffsetR: out double dbOffsetR,
                source: source);

            dbAdjustL = dbOffsetL + dbSPLL - dbOffset;

            //If they're not the same, then generate a new set of offsets
            //  (It doesn't matter if we mess up OffsetL, we already finished using it)
            if (dbSPLL != dbSPLR)
            {
                //To right calculation if it's different
                Calibration.GetLevelOffset(
                    level: dbSPLR,
                    levelOffsetL: out dbOffsetL,
                    levelOffsetR: out dbOffsetR,
                    source: source);
            }
            dbAdjustR = dbOffsetR + dbSPLR - dbOffset;
        }
コード例 #2
0
        public static double CalculateRMSLevel(float[] samples)
        {
            double[] sampleSquaredSum = new double[2];
            int      sampleCount      = samples.Length / 2;

            for (int i = 0; i < sampleCount; i++)
            {
                sampleSquaredSum[0] += samples[2 * i] * samples[2 * i];
                sampleSquaredSum[1] += samples[2 * i + 1] * samples[2 * i + 1];
            }

            sampleSquaredSum[0] = Math.Sqrt(sampleSquaredSum[0] / sampleCount);
            sampleSquaredSum[1] = Math.Sqrt(sampleSquaredSum[1] / sampleCount);

            double rmsL = sampleSquaredSum[0];
            double rmsR = sampleSquaredSum[1];

            double levelL = 20.0 * Math.Log10(rmsL / TARGET_RMS) + dbOffset;
            double levelR = 20.0 * Math.Log10(rmsR / TARGET_RMS) + dbOffset;

            if (double.IsNaN(levelL) || double.IsInfinity(levelL))
            {
                levelL = -60.0;
            }

            if (double.IsNaN(levelR) || double.IsInfinity(levelR))
            {
                levelR = -60.0;
            }

            Calibration.GetLevelOffset(
                level: levelL,
                levelOffsetL: out double dbOffsetL,
                levelOffsetR: out double dbOffsetR);

            if (levelL != levelR)
            {
                Calibration.GetLevelOffset(
                    level: levelR,
                    levelOffsetL: out _,
                    levelOffsetR: out dbOffsetR);
            }

            return(Math.Max(levelL - dbOffsetL, levelR - dbOffsetR));
        }