2013-01-14 78 views
0

我正在研究應該做一些音頻信號處理的應用程序。我需要測量每個獲得的緩衝區中的音頻電平(通過回調函數)。我一直在網上搜索了一段時間,我發現有一個內置的屬性稱爲電流電平表:ios音頻隊列 - 如何測量緩衝區中的音頻電平?

AudioQueueGetProperty(recordState->queue,kAudioQueueProperty_CurrentLevelMeter,meters,&dlen); 

該屬性獲得我的平均或峯值音頻電平,但它不同步當前的緩衝區。 我想通了,我需要計算從自己的緩衝數據的音頻電平,所以我有這樣的:

double calcAudioRMS (SInt16 * audioData, int numOfSamples) 
{ 
double RMS, adPercent; 
RMS = 0; 

for (int i=0; i<numOfSamples; i++) 
{ 
    adPercent=audioData[i]/32768.0f; 
    RMS += adPercent*adPercent; 
} 
RMS = sqrt(RMS/numOfSamples); 
return RMS; 
} 

該函數獲得(澆鑄成Sint16)的音頻數據和樣本數量在當前緩衝區。我得到的數字確實在0到1之間,但與我從內置音頻電平測量得到的數字相比,它們似乎相當隨機且低。

的記錄音頻格式是:

format->mSampleRate = 8000.0; 
format->mFormatID = kAudioFormatLinearPCM; 
format->mFramesPerPacket = 1; 
format->mChannelsPerFrame = 1; 
format->mBytesPerFrame = 2; 
format->mBytesPerPacket = 2; 
format->mBitsPerChannel = 16; 
format->mReserved = 0; 
format->mFormatFlags = kLinearPCMFormatFlagIsSignedInteger |kLinearPCMFormatFlagIsPacked; 

我的問題是如何從緩衝區得到正確的價值觀?有沒有內置函數\屬性呢?或者我應該自己計算音頻電平,以及如何去做?

在此先感謝。

+0

你可以共享源代碼嗎? – iosMentalist

回答

1

您對RMS功率的計算是正確的。我傾向於說你的樣本數量少於蘋果,或者類似的東西,這就可以解釋這個差異。您可以通過輸入一個響亮的正弦波來檢查,並檢查Apple(和您)是以1/sqrt(2)計算RMS功率。

除非有很好的理由,否則我會使用Apple的功耗計算。我用過它們,它們對我來說似乎很好。此外,通常您不需要RMS功率,您希望RMS功率爲分貝,或使用kAudioQueueProperty_CurrentLevelMeterDB常數。 (這取決於你是否試圖建立一個音頻表,或真正顯示音頻功率)

+0

謝謝jfaller。我嘗試了一個巨大的純正弦波,並將Apple的CurrentLevelMeter設置爲1,而我的最大值爲0.70。我們做了什麼? –

+0

蘋果正在糾正1/sqrt(2)。嘗試乘以sqrt(2)的結果,他們會同意Apple的。 – jfaller