는 예컨대 「제로 레벨」0
또는 0.0
즉, 대답은 매우 간단 그리고 S_B
(A와 B)
샘플에 부호없는 값을 사용하는 경우 더 많은 작업을 수행해야합니다. 먼저 이들을 0 점이있는 부호있는 값으로 변환해야합니다 (예 : 16 비트 부호없는 샘플, 각각에서 32768을 뺀 다음) 수식을 적용한 다음 con 다시 부호없는 형식으로 바꾼다. 오버 플로우의주의 - 여기에 언급 한 16 비트 샘플에 대한 변환 작업을 수행하는 방법의 예 :
#define PCM_16U_ZERO 32768
short pcm_16u_to_16s(unsigned short u)
{
/* Ensure that we never overflow a signed integer value */
return (u < PCM_16U_ZERO) ? (short)u - PCM_16U_ZERO : (short)(u - PCM_16U_ZERO);
}
unsigned short pcm_16s_to_16u(short s)
{
/* As long as we convert to unsigned before the addition, unsigned arithmetic
does the right thing */
return (unsigned short)s + PCM_16U_ZERO;
}
출처
2009-11-17 23:24:32
caf
그냥 궁금 해서요 : 왜'/ 2'입니까? – dtb
두 신호를 뺄셈은 다른 신호를 180도 위상 편이 버전에 추가하는 것과 같습니다. 2로 나누면 결과 신호의 전력 (레벨)이 개별 입력 신호와 동일하게 유지됩니다. 수행하지 않으면 결과 신호가 효과적으로 6dB만큼 증폭됩니다 (클립 할 가능성이 높음). – caf
직관적으로, 나는 이것에 문제가있다. 'S_B'가 모두 0 (silent)이라고 가정하십시오. 이 경우,'S_C' 결과가'S_A'와 동일하게되기를 원할 것입니다. 서명 된 수식은'S_C'가 절반'S_A'이되게합니다. –