2012-01-07 3 views
2

소리가 녹음되는 동안 데시벨 값을 얻는 방법이 있습니까? 현재 MediaRecorder을 사용하여 소리를 녹음합니다.녹음 중에 데시벨 값을 얻으시겠습니까?

마켓 플레이스에서 어떤 응용 프로그램도 사용할 수 없습니다. 사용자가 휴대 전화에 설치했는지 확신 할 수 없습니다. Audalyzer

다음 수식을 사용하고 있지만 올바른지 또는 내 결과가 정확한지 확실하지 않습니다!

short data[] = new short[bufferSize]; 
read = recorder.read(data, 0, bufferSize); 
double p2 = data[data.length-1]; 
System.out.println("p2: " + p2); 
double decibel; 

if (p2==0) 
    decibel=Double.NEGATIVE_INFINITY; 
else 
    decibel = 20.0*Math.log10(p2/65535.0); 
    System.out.println("p2/65535: " + (p2/65535.0)); 

System.out.println("decibel: " + decibel); 

현재 결과 :

01-11 16:43:03.821: I/System.out(14530): p2: 0.0 
01-11 16:43:03.821: I/System.out(14530): p2/65535: 0.0 
01-11 16:43:03.821: I/System.out(14530): decibel: -Infinity 
01-11 16:43:03.911: I/System.out(14530): p2: 0.0 
01-11 16:43:03.911: I/System.out(14530): p2/65535: 0.0 
01-11 16:43:03.911: I/System.out(14530): decibel: -Infinity 
01-11 16:43:04.001: I/System.out(14530): p2: 0.0 
01-11 16:43:04.001: I/System.out(14530): p2/65535: 0.0 
01-11 16:43:04.001: I/System.out(14530): decibel: -Infinity 
01-11 16:43:04.091: I/System.out(14530): p2: 0.0 
01-11 16:43:04.091: I/System.out(14530): p2/65535: 0.0 
01-11 16:43:04.091: I/System.out(14530): decibel: -Infinity 
01-11 16:43:04.191: I/System.out(14530): p2: 0.0 
01-11 16:43:04.191: I/System.out(14530): p2/65535: 0.0 
01-11 16:43:04.191: I/System.out(14530): decibel: -Infinity 
01-11 16:43:04.281: I/System.out(14530): p2: 0.0 
01-11 16:43:04.281: I/System.out(14530): p2/65535: 0.0 
01-11 16:43:04.281: I/System.out(14530): decibel: -Infinity 
01-11 16:43:04.371: I/System.out(14530): p2: 0.0 
01-11 16:43:04.371: I/System.out(14530): p2/65535: 0.0 
01-11 16:43:04.371: I/System.out(14530): decibel: -Infinity 
+0

신호 레벨을 dB로 얻으려고한다고 가정합니다. 이 경우 0db가 최대 값이며 그 외 모든 값은 음수입니다. 그러나 SPL을 측정하려는 경우 불가능합니다. 응용 프로그램에서 마이크, 오디오 장치의 게인 구조 등을 인식하지 못합니다. 자체 보정 방법을 제공해야합니다. – Brad

+0

그 밖의 모든 것이 부정적인 경우 어떻게 유효한 dB 값을 얻을 수 있습니까? – Neeta

+0

it *은 유효하지만 음압 레벨이 아닙니다 ... 오히려 공칭 (0dB, 가장 높은 신호 레벨)에 상대적인 신호 레벨입니다. dB로 측정 한 음압 레벨은 dB로 측정 한 신호 레벨과 완전히 다릅니다. dB 단위의 측정은 다른 것과 관련된 측정 일뿐입니다. 다시 말하면 마이크/장치를 보정하지 않으면 신호 레벨을 SPL로 변환 할 수 없습니다. – Brad

답변

1

AudioRecord를 사용하여, 당신은 직접 오디오 샘플에 액세스 할 수 있습니다 ... 거기에서, 당신은 데시벨의 소리의 볼륨이나 어느 방법 당신이 원하는을 계산할 수 있습니다. ..

This

도 동일한 질문에 대해 보인다 (및 계산을위한 공식이 있음)에 기초하여 공동

수정 (ments 및 추가 코드) :

이제 변수 data []는 배열 또는 바이트 또는 단락으로 선언됩니까? 그것은 read() 함수 중 어느 것이 사용될 것인지를 변경합니다. 반바지로 선언하면 16 비트가 처리됩니다. 바이트의 배열로 선언하면 연속 된 두 바이트를 결합해야합니다.

음수 및 양수 값에 대해 걱정할 필요가 없습니다. 데이터 []를 '부호없는 단락'의 배열로 선언해야합니다.

데시벨 값은 현재 볼륨을 다른 볼륨과 비교한다는 것을 이해해야합니다. 나는 전문가는 아니지만 가능한 최대 진폭과 비교할 때 대부분의 시간을 믿습니다. 지금 당장 당신이하는 계산은 두 개의 연속적인 샘플을 비교하는 것입니다. 그래서 값이 다소 낮습니다 ... 대신 p1 대신 값 65535를 사용하십시오 (가능한 최대 값). 그렇다면 데시벨 값은 아무 것도 없을 때 음수 값이며 노이즈가 커지면서 (여전히 음의 값을 유지해야 함) 나타납니다. (최신 코드에 기초하여)

EDIT : 샘플 크기 이후

길을 따라 모든 값 (데이터 [데이터를 인쇄하기 위해 16 비트를 사용 팬티 ...

short buffer[] = new short[bufferSize]; 
read = recorder.read(buffer, 0, bufferSize); 
double p2 = data[data.length-1]; 
double decibel; 
if (p2==0) 
    decibel=Double.NEGATIVE_INFINITY; 
else 
    decibel = 20.0*Math.log10(p2/65535.0); 

시도이다. 길이 1], p2, p2/65535, Math.log10 (p2/65535) ... 등 ...) 어디서도 0이 오지 않아야합니다.

+0

필자가 제공 한 링크와 같은 원시 pcm 바이트가 있지만, 공식을 사용하면 무한대가됩니다./내가 바이트 배열의 마지막 2 바이트 값을 사용하고 있습니다. 이 잘못? – Neeta

+0

getAudioFormat을 사용하면 오디오가 8 비트인지 16 비트인지를 알려주며, 1 바이트 또는 2 바이트 만 사용해야하는지 알 수 있습니다. 데이터에서 가져 오는 값을보고 디버깅해야합니다 , 수작업으로 수학을하고 코드가 올바른지 확인하십시오 (확실하지 않은 경우 게시하십시오) – Matthieu

+0

오디오를 16 비트로 얻었습니다. 위에서 사용하고있는 수식을 복사했으며 결과가 올바른지 확실하지 않습니다. – Neeta

관련 문제