2011-03-04 74 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); 

的地方,在那裏你必須校準比例因子來匹配滿量程所需的值。