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; }
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)); }