2013-05-13 2 views
0

32 비트 부동 소수점에 짧은 16 비트 변환 : 나는 아이폰 OS에 Float32에 짧은 배열을 변환하려고 http://www.cocoawithlove.com/2010/10/ios-tone-generator-introduction-to.htmliOS 용 톤 제너레이터의 예에서

.

 Float32 *buffer = (Float32 *)ioData->mBuffers[channel].mData; 
     short* outputShortBuffer = static_cast<short*>(outputBuffer); 

     for (UInt32 frame = 0, j=0; frame < inNumberFrames; frame++, j=j+2) 
     { 
      buffer[frame] = outputShortBuffer[frame]; 
     } 

몇 가지 이유로 인해 스피커에서 재생할 때 추가 소음이 들립니다. Short에서 Float32로 변환 할 때 문제가 있다고 생각합니다.

답변

3

예, 있습니다.

부동 소수 샘플의 값 범위는 -1.0 <= Xn <= 1.0이고 signed short의 값 범위는 -32767 <= Xn <= +32767입니다. 단지 캐스팅 만하면 거의 모든 샘플에서 클리핑됩니다.

그래서 계정이 점을 고려 :

Float32 *buffer = (Float32 *)ioData->mBuffers[channel].mData; 
    short* outputShortBuffer = static_cast<short*>(outputBuffer); 

    for (UInt32 frame = 0, j=0; frame < inNumberFrames; frame++, j=j+2) 
    { 
     buffer[frame] = ((float) outputShortBuffer[frame])/32767.0f; 
    } 

[참고 :이이 일을 최적의 방법이 아니다].

그러나 프레임이 모노인지 확인 하시겠습니까? 그렇지 않으면 하나의 채널 만 복사하므로 오디오 손상의 원인이 될 수 있습니다.

왜, 출력 버퍼가 float이라면 왜 사용하지 않으십니까?

+0

float 배열을 짧은 배열로 변환하는 방법은 무엇입니까? – Khusboo