2011-03-04 2 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]; 

I는 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); 

신호 값을 얻기 위해 연주하는 데이터에 대해 충분히 이해해야합니다. 당신이 생각하는 시간의 durration은 그다지 중요하지 않아야합니다. 50-80ms해야합니다.

+0

흠. 녹음은 RMS로되어 있으므로 재생 값에 대해이 작업을 수행합니다. 데시벨 값을 샘플로 사용하고 이것이 어떻게 진행되는지 살펴 보겠습니다. 감사! – kailoon

+0

이것은 그렇게 보이지 않습니다. 네 말이 맞아, 데이터에 대해 더 알고 싶다. 나는 나의 질문이 주로 무엇에 관한 것인지 추측한다. 그들은 mAveragePower가 RMS라고 말하면서 그것이 무엇인지 이해하지만, 그것을 얻기 위해 무엇을 사용 했습니까? 평균 전력은 데시 볼 (decibals)의 RMS이며 0 - 1.0 등으로 정규화됩니까? 질문에 추가하거나 후속 질문을 게시하여 해당 값에 대한 세부 정보를 얻으십시오. – kailoon

+0

RMS는 샘플 값을 기반으로합니다. 오디오 신호는 주어진 샘플 속도의 샘플로 구성됩니다. 데시보 (decibals)와는 아무런 관련이 없습니다. 여기 PCM에 대해 읽어보십시오. http://en.wikipedia.org/wiki/Pulse-code_modulation 도움이 될 수 있습니다. – madmik3

1

데시벨은 대수적으로 스케일됩니다. 당신이 풀 스케일에 대해 원하는 값을 일치하도록 scaleFactor와 교정해야 할 것 곳

myDb = 20.0 * log (myRMS/scaleFactor); 

: 그래서 당신은 아마 다음과 같은 몇 가지 방정식을합니다.

관련 문제