클리핑없이 오디오 신호를 믹싱하는 알고리즘


49

두 개 이상의 PCM 오디오 채널 (예 : 녹음 된 샘플)을 음향 적으로 충실한 방식으로 디지털 방식으로 혼합하고 싶습니다 (가급적이거나 거의 없음).

이를 수행하는 물리적 "올바른"방법은 샘플을 합산하는 것입니다. 그러나 두 개의 임의 샘플을 추가하면 결과 값이 최대 값의 두 배가 될 수 있습니다.

예를 들어 샘플이 16 비트 값인 경우 결과는 최대 65536 * 2가됩니다. 클리핑이 발생합니다.

여기서 순진한 해결책은 N으로 나누는 것입니다. 여기서 N은 혼합되는 채널의 수입니다. 그러나 이로 인해 각 샘플의 1 / N은 큰 소리로 들리므로 완전히 비현실적입니다. 실제로는 두 악기가 동시에 연주 할 때 각 악기의 반이 크지 않습니다.

주변에서 읽을 때 일반적인 믹싱 방법은 다음과 같습니다. result = A + B-AB. 여기서 A와 B는 혼합 된 두 개의 표준화 된 샘플이며 AB는 더 큰 소리가 점점 "부드럽게"고정되는 용어입니다.

그러나 이로 인해 신호 왜곡이 발생합니다. 이 수준의 왜곡은 고품질 오디오 합성에서 허용됩니까?

이 문제를 해결하기 위해 어떤 다른 방법이 있습니까? 효율적인 저품질 알고리즘과 저효율 고품질 알고리즘에 관심이 있습니다.

여러 악기 트랙을 믹싱하기 위해 디지털 음악 합성의 맥락에서 내 질문을하고 있습니다. 트랙은 오디오, 사전 녹음 된 샘플 또는 실시간 마이크 입력일 수 있습니다.


신호를 약간 시간 이동하여 클리핑을 피하는 것이 얼마나 자주 가능한지 궁금합니다.
Sebastian Reichelt

좋은 생각이지만, 특히 예견이 많지 않은 경우 (예 : 실시간) 그렇게 간단하지는 않습니다. 문제는 어떤 종류의 타임 시프트가 적합한 지 미리 알고 있어야한다는 것입니다. 즉, 대부분의 음악에서는 상관 가능성이 높으므로 임의의 시간 이동이 매우 효과적 일 수 있습니다. 여기에 경험이 있습니까?
bryhoyt

2
@bryhoyt : 실제 믹서는 신호를 합칩니다. 그게 다야. 시간 지연이나 비선형 처리가 필요하지 않습니다. 원본 신호가 너무 크지 않기 때문에 클리핑은 문제가되지 않습니다.
endolith

2
16 + 16 비트 = 17 비트 ;-)
nikwal

1
입력 수로 나누면 클리핑이 불가능합니다. 소리가 너무 조용하면 앰프를 켜십시오.
Sarge Borsch

답변:


14

문제의 상황을 모르면 관련 기술을 지적하기가 매우 어렵습니다.

분명한 답은 클리핑이 거의 발생하지 않도록 각 샘플의 게인을 조정하도록 알려주는 것입니다. 뮤지션이 솔로 연주를 요청할 때보 다 앙상블에서 더 부드럽게 연주한다고 가정하는 것은 비현실적이지 않습니다.

A + B-AB에 의한 왜곡은 허용되지 않습니다. 링 변조와 같은 B의 고조파 양쪽에 A의 미러 이미지를 만듭니다. 이는 A와 B에 정수 비가 아닌 고조파를 가진 풍부한 스펙트럼이있는 경우 꽤 끔찍합니다. 예를 들어 220과 400Hz에서 두 개의 구형파에서 사용해보십시오.

샘플 당 샘플로 작동하는보다 "자연적인"클리핑 기능은 tanh 기능입니다. 실제로 일부 아날로그 요소의 소프트 제한 동작과 일치합니다. 그 외에도 고전적인 동적 압축 기술을 살펴볼 수 있습니다. 시스템을 미리보고 최고점을 미리 볼 수 있다면 훨씬 좋습니다.


4
추가 및 하드 클리핑. 모든 오픈 소스 모드 플레이어를 살펴보십시오. 클리핑을 최소화하기 위해 입력을 적절하게 조정 한 다음 믹싱을위한 추가 기능을 사용하면 예외가 아닌 하드 리미터 (옵션)가 표준이됩니다.
pichenettes

4
대부분의 상황에서 이것은 문제를 해결하는 개발자의 책임이 아닙니다. 사용자 / 작곡가에게 각 채널의 음량을 조절할 수있는 가능성을 부여하고 클리핑이 허용되도록 믹스를 수행하는 것은 사용자의 책임입니다. 예를 들어, Renoise에서 기본적으로 각 악기 / 노트의 게인은 1이며 트랙을 추가 할 때 클리핑이 심하게 시작됩니다. 모듈에서 음표 또는 악기의 음량을 조절하여 마스터 트랙 (원하지 않는 한). 다음을 보여주는 스크린 샷이 있습니다 : i.imgur.com/KVxDt.png .
pichenettes

2
IIRC, FastTracker는 각 트랙에 감쇠를 적용한 다음 환경 설정 대화 상자에서 x1에서 x32까지의 전역 "메이크 게인"을 가졌다는 점에서 더욱 보수적이었습니다. CD를 위해 모든 모듈을 .WAV로 렌더링해야했을 때 클리핑을 발생시키지 않은 가장 낮은 것을 발견 할 때까지 게인 값을 시도해야했습니다.
pichenettes

2
루프에서 사용자를 가질 수없는 경우 감쇠 레벨과 관련하여; 1/32는 절대적으로 안전한 수준입니다 (클리핑 없음). 채널이 서로 관련이 없다고 가정하면 (배경 분위기를 혼합 할 때 더 정확하지는 않지만 음악에는 해당되지 않음) 1 / sqrt (32) 값은 음량과 클리핑 확률 사이의 좋은 절충안이됩니다. 가장 좋은 해결책은 여전히 ​​1/32를 사용한 다음 다이내믹 컴프레서로 샘플을 후 처리하는 것입니다.
pichenettes

3
추가. 그것은 어쨌든 하드웨어 믹서가하는 일이며 사람들이 일을 기대하는 방식입니다. 시스템 레벨 믹서는 간단히 클리핑됩니다. 시스템 드라이버가 어떤 종류의 비선형 프로세싱을 구현한다면 큰 문제가 될 것입니다. 마스터 링 엔지니어가 자신의 컴프레서 플러그인 설정인지 또는 시스템 수준의 동적 프로세싱인지 파악하려고 애쓰는 것은 어려울 것입니다. 음악 제작 소프트웨어는 광범위한 다이나믹 압축 플러그인을 제공하며 믹스가 잘리지 않도록하는 것은 사용자의 몫입니다.
pichenettes

16

이를 수행하는 물리적 "올바른"방법은 샘플을 합산하는 것입니다. 그러나 두 개의 임의 샘플을 추가하면 결과 값이 최대 값의 두 배가 될 수 있습니다. ... 여기서 순진한 해결책은 N으로 나누는 것입니다. 여기서 N은 혼합되는 채널의 수입니다.

이것이 유일한 솔루션 인 "순진한"솔루션이 아닙니다 . 그것이 모든 아날로그 및 디지털 믹서가하는 것입니다. 왜냐하면 공기가하는 것과 뇌가하는 것입니다.

불행히도, 이것은 다른 잘못된 비선형 "혼합"(왜곡) 알고리즘에서 알 수 있듯이 일반적인 오해 인 것 같습니다.

"N으로 나누기"를 헤드 룸 이라고합니다 . 파형의 RMS 레벨 위에 할당 된 피크를위한 추가 공간. 신호에 필요한 헤드 룸의 양은 신호의 파고율에 의해 결정됩니다 . (디지털 신호 레벨과 헤드 룸에 대한 이해는 아마도 Loudness 전쟁Elephunk에 대한 일부 책임이 있습니다.)

아날로그 하드웨어에서 헤드 룸은 20dB 일 수 있습니다. 하드웨어 DSP에서는 고정 헤드 룸이있는 고정 소수점이 종종 사용됩니다. 예를 들어 AD의 SigmaDSP 는 헤드 룸이 24dB입니다. 컴퓨터 소프트웨어에서 오디오 처리는 일반적으로 32 비트 부동 소수점으로 수행되므로 헤드 룸이 엄청납니다.

이상적으로는 N으로 나눌 필요가 없으며 신호는 처음에 0dBFS에서 생성되지 않기 때문에 신호를 합산하면됩니다.

어쨌든 대부분의 신호는 서로 상관되지 않으므로 믹서의 모든 채널이 건설적으로 동시에 간섭하는 경우는 드 un니다. 그렇습니다. 동일한 동 위상 사인파 10 개를 혼합하면 피크 레벨이 10 배 (20dB) 증가하지만 10 개의 비코 히어 런트 노이즈 소스를 혼합하면 피크 레벨이 3.2 배 (10dB) 증가합니다. 실제 신호의 경우 값은 이러한 극단 사이에 있습니다.

클리핑없이 DAC에서 믹스 된 신호를 얻으려면 믹스 게인을 줄이면됩니다. 하드 클리핑없이 믹스의 RMS 레벨을 높게 유지하려면 파형의 피크를 제한하기 위해 압축 유형을 적용해야 하지만 이것은 믹싱의 일부가 아니며 별도의 단계입니다. 먼저 충분한 헤드 룸과 혼합 한 다음 원하는 경우 나중에 다이나믹 레인지 압축을 수행합니다.


1
나는이 개념들을 이해하지만 그것이 옳은지 확신하지 못한다. 물론, 16 비트 샘플을 추가하면 32 비트는 숫자의 공간을줍니다. 그러나 실제 사운드 시스템에서 정규화 된 볼륨으로 결과 믹스를 재생해야합니다. 각 채널을 개별적으로 재생하는 것보다 2 채널 더 큰 소리를 내고 싶지만 클리핑을 원하지 않습니다. 32 또는 64 비트로 합계를 계산해도 도움이되지 않습니다. 아마도 내 자신의 질문에 대답하기 시작했을 것입니다. 원래 샘플은 최대 진폭보다 조용한 레벨에서 정규화되어야합니다. 당신이 제안하는대로, 믹싱 헤드 룸을 남겨 둡니다.
bryhoyt

3
@bryhoyt : 그렇습니다. 그러나 파도가 서로 거의 연관되어 있지 않다는 것을 기억해야합니다. 따라서 5 개의 사운드를 합쳐서 5 배나 더 높은 피크를 만들지는 않습니다.
endolith

1
고마워, @endolith, 나는 이것이 정말로이 모든 것의 핵심이라고 생각하며, 그것이 내가 처음 생각했던 것만 큼 큰 문제가 아닌 이유를 설명 해줍니다.
bryhoyt

따라서 10 개의 비 간섭 소스가 10dB를 제공한다면 sqrt (소스 수)로 나누는 것이 합리적인 휴리스틱입니까? 즉, 3 개의 출처가 있다면 합산하고 sqrt (3)로 나눕니 까? (고대 스레드에 대해 언급 해
주셔서

@ nerdfever.com 이것이 RMS 레벨의 결합 방식입니다. 아마도 ... 아마도?
endolith

6

공식

result=A+BAB

AB=AB

result=g(A+B)

g1

g=0.5g=1/2

g

result[i]=g[i](A[i]+B[i])

[나는]에이결과

아마도 이것 :

[나는]=에프(에이[나는]+[나는],[나는1])

업데이트 : hotpaw2에서 제안한 것처럼 입력 신호를 지연시킬 수 있지만 이득 억제는 할 수 없습니다. 이를 "미리보기 제한 기"라고합니다.


"AB"는 "A * B"를 의미합니다. 진폭이 양수 또는 음수 일 수 있음을 이해합니다. 네 말이 맞아, 내 방정식은 음의 진폭과 관련된 조합에 대해서는 의미가 없습니다.
bryhoyt

8-10 개의 다른 부비동 파를 혼합해야합니다. 경험적으로 나는 올바른 값이 약 0.3 ... 1 / √N 인 것 같다는 것을 알고 있었다. 왜 그 공식이 올바른가?
Zibri

5

비 실시간 믹싱이 미리 예측 AGC를 사용하기 위해 수행 될 수있는 한 가지 방법은 합 진폭이 클리핑 한계를 초과하기 전에 하나 또는 두 채널의 이득이인지하기 어려운 속도로 낮아지는 것입니다. 예견이 적을수록 AGC 게인 조정이 더 잘 들리거나 부드러운 게인 조정 램프의 최대 게인이 채널당 0.5에 가까워지고 한계에 도달합니다. 예측 가능성이있는 음원의 경우 시간에 따른 엔벨로프의 동작에 관한 통계를 사용하여 이득 한계를 적응 적으로 추측 할 수 있지만 고장 가능성이 있습니다 (급격한 AGC 이득 조정).


이것은 미리보기 AGC가 아닌 미리보기 제한 기입니다.
Bjorn Roche

2
@BjornRoche : 리미터를 AGC 유형으로 간주 할 수 없습니까?
endolith

일부 리미터는 AGC이지만 미리보기 리미터는 AGC가 아닙니다.
Bjorn Roche

1
@BjornRoche 잘 그것은 자동이며 게인 제어 ...
Olli Niemitalo

2

나는 디지털 웨이브로 진행된 1990 년대 후반과 최초 2000 년대의 믹서 디자이너와 이야기를 나 had습니다 (발신 후). 나는 그 남자가 SPL의 디자이너라고 생각하지만 그다지 크지 않을 것입니다. 나는 이름이나 브랜드도 전혀 기억하지 못합니다. 나는 기계가 실제로 얼마나 크고 비쌌는지 기억합니다.

우리는 오랫동안 말을했고 마지막으로 64/128 @ 24 비트 채널이 함께 혼합되어 클리핑없이 24 비트 정확한 혼합 출력 채널이 유지되도록하는 기술에 대해 이야기했습니다.

그가 설명하는 기술은 다소 단순했습니다. 64 개 트랙 (24 비트)이 48 비트 채널에 추가되었으며 클리핑이 발생하지 않습니다. 직진.

그 신호가 어떻게 48 비트에서 24 비트로 디더링되었는지 어떻게 말할 수 없습니다. 어쩌면 까다로운 주방 레시피가 적용되는 곳 일 수도 있습니다.

그리고이를 달성하기위한 많은 기술이있을 수 있습니다. 무엇보다도 실시간으로 수행하든 이미 높은 피크로 기록 된 모든 신호를 사용하여 결정하기가 간단합니다.


2

글로벌 볼륨을 낮추십시오. 임펄스 트래커는 기본적으로 기본적으로 최대 약 33 % 볼륨에서 채널을 출력합니다.

채널 수가 적은 음악 (4 채널 Amiga MOD)과 50 채널의 노래에는 충분히 큰 것처럼 보입니다 (채널 내용은 일반적으로 상관 관계가 없으므로 볼륨이 특정 레벨을 지나서 빠르게 합산되지 않기 때문에 ... 그리고 더 적은 수의 채널이 최대 볼륨으로 출력 될 것입니다. 또한 왼쪽 또는 오른쪽으로 패닝 된 채널 (범위의 66 % 사용)에 충분한 헤드 룸을 남겨 둡니다.

또한 채널을 16 비트로 함께 추가하고 싶지 않고 32 비트로 함께 추가 한 다음 결과를 잘라내어 16 비트로 줄이려고합니다. 수학을 수행하는 동안 둘러싸이지 않도록 더 높은 범위가 필요합니다. 또 다른 옵션은 32 비트 부동 소수점을 사용하는 것입니다 (필터, 효과 등을 수행하는 데 편리함).


0

열쇠는 16 비트 값이 있고 잠재적으로 최대 값보다 클 수있는 2 개의 값을 더하면 2 가지 옵션이 있다고 생각합니다.

1) 32 비트 추가로 캐스팅 한 다음 추가가 해당 값을 초과하면 최대 값을 반환합니다. 그런 다음 16 비트로 다시 캐스팅하십시오. 예를 들어 값이 32768 및 34567 인 경우 65535를 초과하고 키는 65535를 반환하는 것입니다. 최소값 끝에서 부호있는 값을 사용하는 경우 동일한 작업을 수행합니다.

2) 두 값을 압축 한 다음 함께 더하십시오.

첫 번째는 기본적으로 하드 클리핑이고 두 번째는 소프트 클리핑입니다. 아날로그 시스템은 모두 하드 클리핑입니다.


0

두 트랙의 주파수가 같은 공간 주파수를 현명하게 차지하는 경우 공간의 두 배만됩니다. eq와 압축을 사용하여 각 사운드에 대한 주파수 스펙트럼 영역을 잘라 내고 사운드의 과도 및 지속을 제어하여 모든 위치에서 튀어 나오는 소리를냅니다. 그래도 질문에 대답하지 못할 수도 있습니다. 저주파 신호를 최대 2ms 지연시킬 수 있습니다. 파장이 더 높은 주파수보다 길기 때문에 위상을 통해 취소되지 않으며 과도 전류가 전력이 부족한 저음 신호와 완전히 일치하지 않기 때문에 공간을 추가합니다. 지연을 추가로 선형 적으로 추가하는 것은 신호를 낮추는 것이 흥미로울 것입니다.


-1
A + B + {
    (|A| = A) = (|B| = B) = true: -AB;
    (|A| = A) = (|B| = B) = false: AB;
    else: 0
}

즉, A와 B가 모두 부호를 공유하는 경우 제한 오프셋을 적용하십시오. 오프셋의 크기는 A와 B의 곱입니다. 오프셋의 방향은 A와 B의 방향과 반대입니다.

A와 B가 부호를 공유하지 않으면 넘칠 수있는 방법이 없으므로 제한이 적용되지 않습니다.


이것은 정식이 아닙니다. 두 가지 이상의 음색을 믹싱하려면 한 번에 모두 믹싱해야합니다. 이 경우 모든 것을 한 방향으로 "평평하게"해야합니다 (너무 높으면 양수 값을 음수 값으로 낮추십시오. 너무 낮 으면 음수 값을 양수 값으로 내리십시오). 오프셋을 고려한 후에 (나머지 값에 비례하여 적용); 이진 방법을 사용하지만 혼합 값의 수에 따라 리미터를 스케일링하십시오.
Rich Remer

-1

나의 제안:

  1. 16 비트 고정 소수점에서 32 비트 부동 소수점으로 트랙 오디오 형식을 변환합니다.
  2. 믹싱 할 모든 트랙의 현재 샘플 값을 추가하십시오.
  3. 다른 일을하지 마십시오.

사용자는 디더링 및 16 비트 고정 소수점 형식으로 다시 변환하기 전에 압축 및 / 또는 제한을 사용하여이 혼합 스트림을 처리 할 수 ​​있습니다 (이 변환을 가정 할 경우 ...


2
안녕하세요. DSP.se에 오신 것을 환영합니다. 기여해 주셔서 감사합니다. 그러나 OP의 질문에 전혀 답하지 않는 것 같습니다. OP는 자신의 시스템의 "사용자"에 대해서는 언급하지 않았습니다. 자신이 직접 게임을하거나 특정 요구 사항에 맞게 프로그램을 작성했을 수 있습니다. 공감에 대해 유감스럽게 생각합니다. 답변을 더 자세히 알려면 기꺼이 투표를하겠습니다. 또한 형식을 잘 관리하십시오. FAQ 에서 적절한 답변을 작성하는 방법을 살펴보십시오.
penelope
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.