2011-03-04 45 views
1

我显示一个音频电平表,用于录制和播放该录制内容。等级值从0到1.0。我在屏幕上绘制一个代表0 - 1.0值的栏。要获得记录的音频电平使用:如何让iPhone录音和播放音频电平表看起来一样?

OSStatus status = AudioQueueGetProperty(aqData.mQueue, kAudioQueueProperty_CurrentLevelMeter, aqLevelMeterState, &levelMeterStateDataSize); 

float level = aqLevelMeterState[0].mAveragePower; 

对于播放我用:

// soundPlayer is an AVSoundPlayer 
float level = [soundPlayer averagePowerForChannel:0]; 

我正常化从0级 - 1.0。

现在他们看起来非常不同,当显示酒吧。记录仪表杆位于较低端,而回放杆仪表在播放相同的录制音频时位于中间。

我正在试图使两个米看起来一样,但我对音频相当新。我已经做了一些研究,并且知道录音正在返回一个RMS值,播放以分贝返回。

有人可以通过音频知道我的链接或文档,或者给出一点暗示来理解这两个值,以便我可以开始让它们看起来一样吗?

回答

1

它是给定定时器间隔的RMS或均方根。 RMS是通过总和每个信号值的平方求和来计算的,其中求出样本的数量以得到平均值,然后取平均值的平方根。

 uint64 avgTotal; 
    for(int i =0; i < sampleCount; i++) 
     avgTotal+= (sample[i]*sample[i])/(uint64)sampleCount; //divide to help with overlfow 

    float rms = sqrt(avgTotal); 

您将必须充分了解您播放的数据以获取信号值。您考虑的时间浪费应该不重要。 50-80ms应该这样做。

+0

嗯。由于录音是在RMS中,我会为播放值做到这一点。我想我会尝试使用分贝值作为样本,然后看看结果如何。谢谢! – kailoon 2011-03-04 20:41:19

+0

这看起来不像。你是对的,我需要更多地了解数据。我想这就是我的问题主要是关于什么。他们说mAveragePower是RMS,我有点理解那是什么,但他们用什么来获得它?平均功率是分贝的均方根,然后归一化为0 - 1.0等吗?也许我会在问题中加入这个问题或发布后续问题以获取有关这些值的详细信息。 – kailoon 2011-03-04 22:11:21

+0

RMS基于样本值。音频信号由给定采样率的采样组成。它确实与分贝无关。在这里阅读有关PCM。 http://en.wikipedia.org/wiki/Pulse-code_modulation可能会有所帮助。 – madmik3 2011-03-04 22:15:16

1

分贝是对数缩放的。所以,你可能需要一些公式,例如:

myDb = 20.0 * log (myRMS/scaleFactor); 

的地方,在那里你必须校准比例因子来匹配满量程所需的值。