iPhone SDK: AVAudioRecorder metering — how to change peakPowerForChannel from decibel into percentage?

后端 未结 2 2088
眼角桃花
眼角桃花 2020-12-14 12:07

The AVAudioRecorder in the iPhone SDK can be used to get the peak and average power for a channel, in decibels. The range is between 0db to 160db. What is the calculation us

相关标签:
2条回答
  • 2020-12-14 12:47

    The range is from -160 dB to 0 dB. You probably want to display it in a meter that goes from -90 dB to 0 dB. Displaying it as decibels is actually more useful than as a linear audio level, because the decibels are a logarithmic scale, which means that it more closely approximates how loud we perceive a sound.

    That said, you can use this to convert from decibels to linear:

    linear = pow (10, decibels / 20);

    and the reverse:

    decibels = log10 (linear) * 20;

    The range for the above decibels is negative infinity to zero, and for linear is 0.0 to 1.0. When the linear value is 0.0, that is -inf dB; linear at 1.0 is 0 dB.

    0 讨论(0)
  • 2020-12-14 13:05

    Apple also implemented a dB to linear amplitude conversion class MeterTable.cpp and MeterTable.h Look for it in SpeakHere app example.

    You can either use their inline function that calculates the value "on-the-fly"

    inline double DbToAmp(double inDb);
    

    OR

    create a MeterTable instance to use pre-calculated lookup table. This stores conversion values in memory so your application can reduce number of calculations.

    float ValueAt(float inDecibels);
    

    NOTE: lookup table is probably needed if you have a lot of other calculations going on at the same time or you need VERY fast processing.

    0 讨论(0)
提交回复
热议问题