이것은 내 첫 번째 게시물이므로 도움을받을 수 있기를 바랍니다.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으로 읽히지 않습니까?
누구든지 도와 주시면 매우 감사하겠습니다.
샘
일반적으로 +1.0은 부동 소수점에 유효한 샘플 값이 아닙니다. 이렇게하면 간단한 곱셈 또는 나눗셈을 사용하여 부동 소수점으로 /에서 무손실 변환이 가능합니다. – sbooth
안녕하세요. sbooth, 감사합니다. 그렇습니다. 추가 처리를하기 전에 +1.0 값을 +0.999로 변경하는 추가 서브 루틴이 있습니다! – Sammio2
또한보십시오 : http://stackoverflow.com/questions/15087668/how-to-convert-pcm-samples-in-byte-array-as-floating-point-numbers-in-the-range – Brad