2011-10-13 7 views
1

4 개의 버퍼를 혼합하고 패닝을 적용합니다. 그러나 팬의 변경을 트리거 할 때 클립이 들립니다. 어떤 몸이 다음 코드 잠재적으로 잘못된 것을 볼 수 있습니다 -DSP/수동 혼합 및 팬 법

for (int i = 0 ; i < numFrames; i++) { 
    //Convert buffer to float 
    float s1 = track1[0][i]/32768.0f; 
    float s2 = track2[0][i]/32768.0f;; 
    float s3 = track3[0][i]/32768.0f;; 
    float s4 = track4[0][i]/32768.0f;; 

    //Apply pan on track one 
    float s1R = s1 * sqrt(1 - panA); 
    float s1L = s1 * sqrt(panA); 

    //Apply pan on track two 
    float s2R = s2 * sqrt(1 - panB); 
    float s2L = s2 * sqrt(panB); 

    //Apply pan on track three 
    float s3R = s3 * sqrt(1 - panC); 
    float s3L = s3 * sqrt(panC); 

    //Apply pan on track four 
    float s4R = s4 * sqrt(1 - panD); 
    float s4L = s4 * sqrt(panD); 

    //Mix the right channel 
    float mixedR = s1R + s2R + s3R + s4R; 

    mixedR *= 0.6f; 
    if(mixedR > 1.0f) mixedR = 1.0f; 
    if(mixedR < -1.0f) mixedR = -1.0f; 

    //Mix the Left channel 
    float mixedL = s1L + s2L + s3L + s4L; 

    mixedL *= 0.6f; 
    if(mixedL > 1.0f) mixedL = 1.0f; 
    if(mixedL < -1.0f) mixedL = -1.0f; 

    //Apply the Left channel 
    audioIn[0][i] = (short) (mixedL * 32768.0f); 

    //Apply the right channel 
    audioIn[1][i] = (short) (mixedR * 32768.0f); 
} 

패닝 알고리즘이 개선 될 수있다, 나는 여기에서 그것을 해제 : -

http://www.kvraudio.com/forum/viewtopic.php?t=181222&postdays=0&postorder=asc&start=0

NumFrames가 512; 오디오가 믹싱되면 Dirac을 사용하여 시간 스트레칭 알고리즘을 적용합니다.

Dirac 처리없이 클리핑이 발생합니다.

답변

2

결과 출력 신호를 포화시키기 전에 잠재적으로 4 개의 실제 신호를 취하여 함께 추가 한 다음 0.6으로 스케일링합니다. 따라서 포화되기 전에 최대 범위는 +/- 4 * 0.6 = +/- 2.4입니다. 그러므로 당신이 약간의 클리핑을 듣는 것은 놀라운 일이 아닙니다. 0.6 대신 0.25를 곱하면 가장 극단적 인 경우에도 클리핑을 제거해야하지만 일반적으로 출력 신호 레벨은 약간 낮을 수 있습니다.

이것을 확인하려면 채도 코드에 디버그 로깅을 추가하면됩니다.

#if DEBUG 
    if (mixedR > 1.0f || mixedR < -1.0f) 
     fprintf(stderr, "Clipping occurred for mixedR = %g\n", mixedR); 
#endif 
    if(mixedR > 1.0f) mixedR = 1.0f; 
    if(mixedR < -1.0f) mixedR = -1.0f; 
+0

@peter - 답장을 보내 주셔서 감사합니다. 난 그냥 0.25 곱하기 시도하고 동일한 클립 얻을. 이는 동적으로 패닝을 변경하는 경우에만 발생합니다. – Carl

+0

OK - 팬 값이 범위를 벗어날 가능성이 있습니까? 즉 < 0 or > 1입니까? –

+0

@peter - 절대로 플로트, 1 또는 0 테스트로 하드 코딩하고 있습니다. – Carl

0

당신은 아마 모든 4096 개 샘플을 클리핑 그러나 불연속에서 터지는되지 듣고 무엇 (또는 버퍼 길이 무엇이든). 급격한 변경을 피하기 위해 패닝 값을 부드럽게 보간해야합니다. 두 가지 쉬운 방법 : 1) 샘플 당 최대 변경을 정의하거나 2) 전체 버퍼 길이에 대해 새 값으로 보간합니다.

어느 쪽이든, 근본적인 혁신은 현재 실제 팬 값과 대상 팬 값을 저장하는 것입니다.

0

"버퍼를 부동으로 변환"기능이 잘못되었습니다. 32768 대신 32767로 나누어야합니다. 그렇지 않으면 MSB의 뒤집기로 인해 클리핑이 발생합니다.