2009-11-17 2 views
4

다른 오디오 웨이브를 빼는 방법?한 오디오 웨이브를 다른 오디오 웨이브에서 빼는 방법은 무엇입니까?

(우리는 C/C에서 C#을 ++에서 할 수없는 경우 나) 나는 (BTW : 그들은 PCM에) 음파 A와 음파 B가 일반적으로와 C#으로 나는

에서 B를 빼 할

무엇이 필요합니까? 오픈 소스 libs와 (또는 libs와 사용하지 않고)이 주제에 기사 등의 작업을 수행하는 방법에 대한 자습서 (NOT GPL하지만 LGPL이 확인 될 것입니다)

PS : 그것은 ... 모든 AEC에 관하여

답변

5

는 예컨대 「제로 레벨」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; 
} 
+3

그냥 궁금 해서요 : 왜'/ 2'입니까? – dtb

+6

두 신호를 뺄셈은 다른 신호를 180도 위상 편이 버전에 추가하는 것과 같습니다. 2로 나누면 결과 신호의 전력 (레벨)이 개별 입력 신호와 동일하게 유지됩니다. 수행하지 않으면 결과 신호가 효과적으로 6dB만큼 증폭됩니다 (클립 할 가능성이 높음). – caf

+1

직관적으로, 나는 이것에 문제가있다. 'S_B'가 모두 0 (silent)이라고 가정하십시오. 이 경우,'S_C' 결과가'S_A'와 동일하게되기를 원할 것입니다. 서명 된 수식은'S_C'가 절반'S_A'이되게합니다. –

0

https://stackoverflow.com/questions/1723563/acoustic-echo-cancellation-aec-in-wpf-with-c 유사한 질문을하고 받아 들인 답이 있습니다. 제안 된 라이브러리에는 내가 생각하는 일종의 Echo Cancellation이 있습니다.

불행히도 저는 오픈 소스 오디오 라이브러리를 사용하지 않았습니다. 이전에 오디오를 처리하기 위해 Fmod을 사용했는데, 거기에 AEC가 있다는 것을 기억하지 못합니다.하지만 처리하는 동안 원시 오디오에 액세스 할 수 있으며 자신의 코드를 실행할 수 있습니다.

S_C = (S_A/2) - (S_B/2); 

각 샘플 S_A 용 : 샘플이 동일한 레벨로 정규화하고, 서명 된 포맷으로 저장하는 경우

+0

링크 된 질문은 – dtb

+0

는 포스터를보고하지에 대한 권리 나 역할 ... 같은 사람입니다. 미안합니다. – Glenn

+0

그는 * Taxonomist * 배지를 추측합니다 : http://stackoverflow.com/questions/tagged/aec – dtb

관련 문제