2011-03-07 3 views
2

이것은 내 첫 번째 게시물이므로 도움을받을 수 있기를 바랍니다.16 비트 PCM 값을 -1 대 1 값으로 변환

AudioFileReadPackets 함수를 사용하여 오디오 데이터 (CoreAudio에서)를 읽는 중입니다.이 코드는 올바르게 작동하며 16 비트 PCM 값을 버퍼에로드합니다.

첫 번째 샘플 값은 '65491'입니다 (이 오디오의 시작 부분에는 무음이 있습니다). 나는 이것이 부호없는 정수라는 것을 이해하므로,이 값을 -1에서 1의 범위로 변환하는 방법을 알려드립니다.

현재 32768.0으로 샘플 값을 float 변수로 나눕니다. .

for (UInt32 i = 0; i < packetCount; i++){ 

      sample = *(audioData + i); 


      //turn it into the range -1.0 - 1.0 
      monoFloatDataLeft[i] = (float)sample/32768.0; 

     } 

그러나, 샘플 (예를 들어) 상기 주어진 (는 침묵되어야 됨)이 0이 아닌 '1.998626709'의 출력 결과?

이렇게 말하면 파일에서 나중에 샘플을 볼 때 그 값이 '0.3'마크 주위에 있다는 것을 알게되면 알고리즘의 결과가 '0.311584473'에 나온다. 맞습니까?

그렇다면 처음 샘플은 왜 0으로 읽히지 않습니까?

누구든지 도와 주시면 매우 감사하겠습니다.

+0

일반적으로 +1.0은 부동 소수점에 유효한 샘플 값이 아닙니다. 이렇게하면 간단한 곱셈 또는 나눗셈을 사용하여 부동 소수점으로 /에서 무손실 변환이 가능합니다. – sbooth

+0

안녕하세요. sbooth, 감사합니다. 그렇습니다. 추가 처리를하기 전에 +1.0 값을 +0.999로 변경하는 추가 서브 루틴이 있습니다! – Sammio2

+0

또한보십시오 : http://stackoverflow.com/questions/15087668/how-to-convert-pcm-samples-in-byte-array-as-floating-point-numbers-in-the-range – Brad

답변

1

먼저 서명되지 않은 데이터에서 32768를 뺄 필요가있다, 그래서 0이 중심입니다.

+0

나는이지 않습니다 내가 한 일은 같은 효과를 얻었는지 확실하지만, 샘플에서 값을 전달하는 데 사용되는 SInt16 변수 'sampleS'를 추가하는 것으로 작동하는 것 같습니다. (죄송합니다. 작동하지 못했습니다. 코드를 추가하려면 미니 마크 다운 형식을 사용하십시오.) – Sammio2

+0

또한 나누기 결과에서 0.5 하위 트랙 수 있습니다 –