0

After comparing more than 20 apps, I found that the decibel values measured by each app are different.

// Method 1:
float power = [self.audioRecorder averagePowerForChannel:0];
float powerMax = [self.audioRecorder peakPowerForChannel:0];

power = power + 160  - 50;

int dB = 0;
if (power < 0.f) {
    dB = 0;
} else if (power < 40.f) {
    dB = (int)(power * 0.875);
} else if (power < 100.f) {
    dB = (int)(power - 15);
} else if (power < 110.f) {
    dB = (int)(power * 2.5 - 165);
} else {
    dB = 110;
}

NSLog(@"power = %f, powerMax = %f , dB = %d",power, powerMax,dB); 


// Method 2:

float   level;                // The linear 0.0 .. 1.0 value we need.
float   minDecibels = -80.0f; // Or use -60dB, which I measured in a silent room.
float   decibels = [self.audioRecorder averagePowerForChannel:0];
if (decibels < minDecibels)
{
    level = 0.0f;
}
else if (decibels >= 0.0f)
{
    level = 1.0f;
}
else
{
    float   root            = 2.0f;
    float   minAmp          = powf(10.0f, 0.05f * minDecibels);
    float   inverseAmpRange = 1.0f / (1.0f - minAmp);
    float   amp             = powf(10.0f, 0.05f * decibels);
    float   adjAmp          = (amp - minAmp) * inverseAmpRange;
    level = powf(adjAmp, 1.0f / root);
}
NSLog(@"leval %f", level * 120);

There is a big gap between Method 1 and Method 2

So,Are these methods accurate? Is there a more correct way?

YZ Shin
  • 1
  • 1

0 Answers0