Thuật toán để trộn tín hiệu âm thanh mà không cần cắt


49

Tôi muốn kết hợp hai hoặc nhiều kênh âm thanh PCM (ví dụ như các mẫu được ghi) theo cách âm thanh, tốt nhất là trong thời gian gần như thời gian thực (có nghĩa là ít hoặc không nhìn trộm trước).

Cách "chính xác" để làm điều này là tổng hợp các mẫu. Tuy nhiên, khi bạn thêm hai mẫu tùy ý, giá trị kết quả có thể lên tới gấp đôi giá trị tối đa.

Ví dụ: nếu các mẫu của bạn là các giá trị 16 bit, kết quả sẽ lên tới 65536 * 2. Điều này dẫn đến việc cắt.

Giải pháp ngây thơ ở đây là chia cho N, trong đó N là số kênh được trộn. Tuy nhiên, điều này dẫn đến mỗi mẫu là 1 / Nth là lớn, điều này là hoàn toàn không thực tế. Trong thế giới thực, khi hai nhạc cụ chơi cùng một lúc, mỗi nhạc cụ không trở nên to bằng một nửa.

Từ việc đọc xung quanh, một phương pháp trộn phổ biến là: result = A + B - AB, trong đó A và B là hai mẫu được chuẩn hóa được trộn lẫn và AB là một thuật ngữ để đảm bảo âm thanh to hơn đang ngày càng "bị cắt bớt".

Tuy nhiên, điều này giới thiệu một sự biến dạng của tín hiệu. Mức độ biến dạng này có được chấp nhận trong tổng hợp âm thanh chất lượng cao không?

Có những phương pháp nào khác để giải quyết vấn đề này? Tôi quan tâm đến các thuật toán chất lượng kém hiệu quả cũng như các thuật toán chất lượng cao kém hiệu quả hơn.

Tôi đang đặt câu hỏi của mình trong bối cảnh tổng hợp nhạc số, với mục đích trộn nhiều bản nhạc với nhau. Các bản nhạc có thể được tổng hợp âm thanh, mẫu được ghi trước hoặc đầu vào micrô thời gian thực.


Tôi tự hỏi mức độ thường xuyên có thể tránh bị cắt bằng cách chỉ thay đổi thời gian các tín hiệu một chút.
Sebastian Reichelt

Ý tưởng hay, mặc dù tôi nghi ngờ nó không hoàn toàn đơn giản, đặc biệt là khi bạn không có nhiều vẻ ngoài (ví dụ như trong thời gian thực). Vấn đề là, bạn phải biết mẫu trước để biết loại dịch chuyển thời gian nào sẽ phù hợp. Điều đó nói rằng, trong hầu hết âm nhạc, bạn có xác suất tương quan cao, do đó, một chút thay đổi thời gian ngẫu nhiên có thể hoạt động rất tốt. Bất cứ ai có kinh nghiệm để rút ra ở đây?
bryhoyt

2
@bryhoyt: Máy trộn thực tổng hợp các tín hiệu lại với nhau. Đó là nó. Không có độ trễ thời gian hoặc xử lý phi tuyến tính cần thiết. Việc cắt không phải là một vấn đề bởi vì các tín hiệu ban đầu không quá to.
endolith

2
16 + 16bit = 17 bit ;-)
nikwal

1
chỉ cần chia cho số lượng đầu vào, sau đó cắt sẽ không thể. và nếu âm thanh quá nhỏ, hãy bật bộ khuếch đại lên
Sarge Borsch

Câu trả lời:


14

Rất khó để chỉ cho bạn các kỹ thuật có liên quan mà không biết bất kỳ bối cảnh nào cho vấn đề của bạn.

Câu trả lời rõ ràng sẽ là bảo bạn điều chỉnh mức tăng của từng mẫu để việc cắt xén hiếm khi xảy ra. Không phải là không thực tế khi cho rằng các nhạc sĩ sẽ chơi nhẹ nhàng hơn trong một bản hòa tấu so với khi được yêu cầu chơi solo.

Sự biến dạng được giới thiệu bởi A + B - AB là không thể chấp nhận được. Nó tạo ra hình ảnh phản chiếu của A ở mỗi bên của sóng hài B - tương đương với điều chế vòng - khá tệ nếu A và B có phổ phổ phong phú với các sóng hài không ở tỷ lệ nguyên. Hãy thử nó trên hai sóng vuông ở 220 và 400 Hz chẳng hạn.

Hàm cắt "tự nhiên" hơn hoạt động trên cơ sở mẫu trên mỗi mẫu, là hàm tanh - nó thực sự phù hợp với hành vi giới hạn mềm của một số yếu tố tương tự. Ngoài ra, bạn có thể xem xét các kỹ thuật nén động cổ điển - nếu hệ thống của bạn có thể nhìn về phía trước và nhìn thấy các đỉnh đến trước thì điều này thậm chí còn tốt hơn.


4
Bổ sung và cắt cứng. Chỉ cần nhìn vào bất kỳ người chơi mod nguồn mở. Sử dụng một phép cộng để trộn, với các đầu vào được chia tỷ lệ thích hợp để giảm thiểu việc cắt, và sau đó một bộ giới hạn cứng (mềm tùy chọn) là tiêu chuẩn, không phải là ngoại lệ ...
pichenettes

4
Trong hầu hết các tình huống, đây không phải là trách nhiệm của nhà phát triển để giải quyết vấn đề. Bạn cung cấp cho người dùng / nhà soạn nhạc khả năng điều chỉnh âm lượng của từng kênh và tùy thuộc vào người dùng thực hiện việc trộn để việc cắt được chấp nhận đối với họ. Ví dụ, trong Ren rùa, theo mặc định, mức tăng của mỗi nhạc cụ / ghi chú là 1 và mọi thứ bắt đầu bị cắt xén khi thêm các bản nhạc - tùy thuộc vào người dùng điều chỉnh âm lượng của các ghi chú hoặc nhạc cụ trong mô-đun để ngăn việc cắt trên bản nhạc chính (trừ khi nó muốn). Đây là một ảnh chụp màn hình cho thấy: i.imgur.com/KVxDt.png .
pichenettes

2
IIRC, FastTracker bảo thủ hơn, ở chỗ nó áp dụng mức suy giảm trên mỗi bản nhạc và sau đó có "mức tăng trang điểm" toàn cầu trong hộp thoại ưu tiên từ x1 đến x32. Tôi nhớ rằng khi tôi phải kết xuất tất cả các mô-đun của mình thành .WAV cho CD, tôi đã phải thử các giá trị của mức tăng cho đến khi tôi tìm thấy giá trị thấp nhất không gây ra sự cắt xén ...
pichenettes

2
Về mức độ suy giảm, trong trường hợp bạn không thể có người dùng trong vòng lặp; 1/32 là mức an toàn tuyệt đối (không cắt). Giả sử rằng các kênh không tương quan (điều này không đúng với âm nhạc - chính xác hơn khi trộn các amidan nền), giá trị 1 / sqrt (32) sẽ là một sự thỏa hiệp tốt giữa độ ồn và xác suất cắt. Giải pháp tốt nhất vẫn là sử dụng 1/32 và sau đó xử lý mẫu của bạn bằng máy nén động.
pichenettes

3
Bổ sung. Đó là những gì các bộ trộn phần cứng thực hiện và đó là cách mọi người mong đợi mọi thứ hành xử. Máy trộn cấp hệ thống chỉ đơn giản là clip. Sẽ là một vấn đề lớn nếu các trình điều khiển hệ thống thực hiện bất kỳ loại xử lý phi tuyến tính nào - tôi sẽ tưởng tượng nỗi đau của việc thành thạo các kỹ sư đang cố gắng tìm hiểu xem những gì họ nghe thấy là cài đặt trình cắm máy nén của họ hay xử lý động ở cấp hệ thống. Phần mềm sản xuất âm nhạc cung cấp một bảng rộng các plugin nén động, tùy thuộc vào người dùng để đảm bảo bản phối của họ không bị cắt.
pichenettes

16

Cách "chính xác" để làm điều này là tổng hợp các mẫu. Tuy nhiên, khi bạn thêm hai mẫu tùy ý, giá trị kết quả có thể lên tới gấp đôi giá trị tối đa. ... Giải pháp ngây thơ ở đây là chia cho N, trong đó N là số kênh được trộn.

Đó không phải là giải pháp "ngây thơ", đó là giải pháp duy nhất . Đó là những gì mọi máy trộn tương tự và kỹ thuật số làm, bởi vì đó là những gì không khí làm, và đó là những gì bộ não của bạn làm.

Thật không may, điều này dường như là một quan niệm sai lầm phổ biến, được thể hiện bằng các thuật toán "trộn" (méo) phi tuyến tính không chính xác khác:

"Chia cho N" được gọi là headroom ; phòng thêm cho các đỉnh được phân bổ trên mức RMS của dạng sóng. Lượng khoảng không cần thiết cho tín hiệu được xác định bởi hệ số đỉnh của tín hiệu . (Hiểu lầm về mức tín hiệu kỹ thuật số và khoảng không có lẽ là một phần để đổ lỗi cho cuộc chiến ồn àoVoi .)

Trong phần cứng tương tự, khoảng không có thể là 20 dB. Trong DSP phần cứng, điểm cố định thường được sử dụng, với khoảng không cố định; Ví dụ, SigmaDSP của AD có khoảng trống 24 dB. Trong phần mềm máy tính, việc xử lý âm thanh thường được thực hiện ở điểm nổi 32 bit, do đó, khoảng không rất lớn.

Lý tưởng nhất là bạn không cần phải chia cho N chút nào, bạn chỉ cần tổng hợp các tín hiệu lại với nhau, vì tín hiệu của bạn sẽ không được tạo ở 0 dBFS ở vị trí đầu tiên.

Tuy nhiên, lưu ý rằng hầu hết các tín hiệu không tương quan với nhau, do đó, không phổ biến cho tất cả các kênh của bộ trộn để can thiệp xây dựng cùng một lúc. Có, trộn 10 sóng hình sin cùng pha sẽ tăng mức cực đại lên 10 lần (20 dB), nhưng trộn 10 nguồn nhiễu không kết hợp sẽ chỉ làm tăng mức cực đại thêm 3,2 lần (10 dB). Đối với các tín hiệu thực, giá trị sẽ nằm giữa các cực trị này.

Để có được tín hiệu hỗn hợp từ một bộ xử lý tín hiệu mà không bị cắt, bạn chỉ cần giảm mức tăng của hỗn hợp. Nếu bạn muốn giữ mức RMS của hỗn hợp ở mức cao mà không bị cắt cứng, bạn sẽ cần áp dụng một số loại nén để hạn chế các đỉnh của dạng sóng, nhưng đây không phải là một phần của pha trộn, đó là một bước riêng biệt. Bạn trộn trước, với nhiều khoảng trống, sau đó đặt nó thông qua nén phạm vi động sau, nếu muốn.


1
Tôi hiểu những khái niệm này, nhưng tôi không chắc nó hoàn toàn chính xác. Chắc chắn, nếu tôi thêm một loạt các mẫu 16 bit, 32 bit cho tôi rất nhiều phòng số. Nhưng tôi vẫn phải chơi bản phối kết quả ở mức âm lượng chuẩn hóa trên hệ thống âm thanh trong thế giới thực. Tôi muốn 2 kênh phát ra âm thanh lớn hơn mỗi kênh được phát riêng, nhưng tôi không muốn cắt. Việc tính tổng của tôi trong 32 hoặc thậm chí 64 bit không giúp ích gì cho việc này. Có lẽ tôi đang bắt đầu trả lời câu hỏi của riêng mình: các mẫu ban đầu nên được chuẩn hóa ở mức độ yên tĩnh hơn biên độ tối đa. Như bạn đề xuất, để lại một số khoảng trống trộn.
bryhoyt

3
@bryhoyt: Có, nhưng bạn cũng phải nhớ rằng các sóng hiếm khi tương quan với nhau, vì vậy, cộng 5 âm thanh lại với nhau sẽ không tạo ra các đỉnh cao gấp 5 lần.
endolith

1
Cảm ơn, @endolith, tôi đoán đó thực sự là cốt lõi của tất cả những điều này, và giải thích cho tôi tại sao nó không hoàn toàn là một vấn đề lớn như tôi nghĩ đầu tiên.
bryhoyt

Vì vậy, nếu 10 nguồn không kết hợp cho 10 dB, thì việc chia cho sqrt (số lượng nguồn) có phải là một heuristic hợp lý không? Đó là, nếu bạn đã có 3 nguồn, tính tổng chúng và chia cho sqrt (3)? (xin lỗi vì đã bình luận về một chủ đề cổ xưa)
nerdfever.com

@ nerdfever.com Đó là cách các cấp RMS kết hợp, vì vậy ... có lẽ?
endolith

6

công thức

result=A+BAB

AB=AB

result=g(A+B)

g1

g=0.5g=1/2

g

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

g[i]ABgresult

Có lẽ đây:

g[i]=f(A[i]+B[i],g[i1])

CẬP NHẬT: Theo đề xuất của hotpaw2, bạn có thể trì hoãn tín hiệu đầu vào nhưng không triệt tiêu khuếch đại. Điều này được gọi là "giới hạn nhìn về phía trước".


Theo "AB" tôi có nghĩa là "A * B". Tôi hiểu rằng biên độ có thể là dương hoặc âm. Bạn nói đúng, phương trình của tôi không có ý nghĩa gì cho sự kết hợp liên quan đến biên độ âm.
bryhoyt

Tôi phải trộn 8 đến 10 (N) sóng xoang khác nhau. Theo kinh nghiệm, tôi biết giá trị đúng là khoảng 0,3 ... 1 / √N có vẻ đúng ... bất kỳ liên kết nào tại sao công thức đó đúng?
Zibri

5

Một cách này có thể được thực hiện để trộn không theo thời gian thực để sử dụng AGC nhìn về phía trước, trong đó mức tăng của một hoặc cả hai kênh được hạ xuống ở tốc độ khó nhận biết trước khi biên độ tổng vượt quá giới hạn cắt. Càng ít nhìn về phía trước, điều chỉnh mức tăng AGC sẽ trở nên dễ nghe hơn hoặc mức tăng tối đa cho đoạn điều chỉnh mức tăng mềm hơn sẽ tiến gần hơn và gần hơn 0,5 trên mỗi kênh ở giới hạn. Đối với các nguồn âm thanh có khả năng dự đoán, người ta cũng có thể sử dụng số liệu thống kê về hành vi của phong bì theo thời gian để đoán một cách thích nghi giới hạn khuếch đại, nhưng với một số xác suất thất bại (sẽ là điều chỉnh tăng AGC đột ngột).


Đây là một giới hạn nhìn về phía trước, không phải là một AGC nhìn về phía trước.
Bjorn Roche

2
@BjornRoche: Không thể coi bộ giới hạn là một loại AGC?
endolith

Một số bộ hạn chế là AGC, nhưng bộ giới hạn nhìn không phải là AGC.
Bjorn Roche

1
@BjornRoche, nó là tự động và kiểm soát mức tăng ...
Olli Niemitalo

2

Tôi đã nói chuyện với một nhà thiết kế máy trộn vào cuối những năm 1990 và những năm 2000 đầu tiên đang diễn ra trên sóng kỹ thuật số (sau khi đã nhón chân). Tôi nghĩ anh chàng này là một nhà thiết kế cho SPL, nhưng có lẽ không lớn lắm, tôi hoàn toàn không nhớ tên cũng không phải thương hiệu, tôi chỉ nhớ chiếc máy thực sự to và đắt như thế nào.

Chúng tôi đã nói chuyện rất lâu, và cuối cùng đã nói về các kỹ thuật để thực sự đảm bảo rằng các kênh 64/128 @ 24 bit của chúng được trộn với nhau vẫn là kênh đầu ra hỗn hợp chính xác 24 bit mà không bị cắt.

Kỹ thuật anh giải thích khá đơn giản. 64 rãnh (trên 24 bit) đã được thêm vào trong kênh 48 bit, trong đó việc cắt không thể xảy ra. Thẳng.

Tôi không thể nói làm thế nào tín hiệu đó được hòa sắc 48 trở lại từ 24 bit. Có lẽ đó là nơi áp dụng các công thức nấu ăn nhà bếp khó khăn.

Và có thể có rất nhiều kỹ thuật để đạt được điều đó, trên hết là dù được thực hiện trong thời gian thực hay với tất cả tín hiệu đã được ghi với các đỉnh cao đơn giản để xác định ... tất cả các loại chuẩn hóa để tưởng tượng tôi nghĩ.


2

Giảm khối lượng toàn cầu. Theo dõi Impulse theo cách cổ điển xuất các kênh ở mức tối đa khoảng 33% âm lượng theo mặc định.

Điều đó dường như vừa đủ lớn cho âm nhạc với một vài kênh (MOD Amiga 4 kênh) và đủ mềm cho các bài hát có 50 kênh (vì nội dung kênh thường không tương quan nên âm lượng không tăng quá nhanh đến một mức nhất định ... cộng với một vài kênh sẽ xuất ra ở mức âm lượng tối đa với nhiều thứ đang diễn ra). Nó cũng để lại khoảng trống đủ cho các kênh được đặt cứng bên trái hoặc bên phải (sử dụng 66% phạm vi).

Ngoài ra, bạn không muốn thêm các kênh của mình lại với nhau trong 16 bitcoin, bạn muốn thêm chúng lại với nhau trong 32 bit, sau đó cắt kết quả và giảm xuống 16 bit vào cuối. Bạn sẽ cần phạm vi cao hơn để nó không bao quanh trong khi làm toán. Một tùy chọn khác là sử dụng dấu phẩy động 32 bit (thuận tiện cho việc thực hiện các bộ lọc, hiệu ứng, v.v.).


0

Tôi nghĩ rằng chìa khóa là, nếu bạn có các giá trị 16 bit và việc thêm 2 giá trị của bạn với nhau có khả năng có thể nhiều hơn giá trị tối đa, thì bạn có 2 tùy chọn:

1) truyền cả hai thành 32 bit sau đó trả về giá trị tối đa nếu phép cộng vượt quá giá trị đó. Sau đó bỏ nó trở lại 16 bit. Ví dụ: nếu các giá trị của bạn là 32768 và 34567, nó vượt quá 65535 và khóa là trả về 65535. Bạn sẽ làm điều tương tự nếu sử dụng các giá trị đã ký ở cuối giá trị tối thiểu.

2) nén cả hai giá trị, sau đó thêm chúng lại với nhau.

Thứ nhất về cơ bản là cắt cứng, thứ hai là cắt mềm. Các hệ thống tương tự đều khó cắt.


0

Chúng sẽ chỉ gấp đôi không gian nếu tần số trong cả hai rãnh chiếm cùng tần số không gian. Sử dụng eq và nén để khắc phục điều này bằng cách khắc các vùng phổ tần số cho từng âm thanh và kiểm soát các quá độ và độ bền của âm thanh để mọi thứ thò ra ở nơi cần thiết. Có lẽ điều đó không trả lời câu hỏi mặc dù. Bạn có thể trì hoãn tín hiệu tần số thấp hơn tới 2 ms. Nó sẽ không hủy qua pha vì các bước sóng dài hơn tần số cao hơn và nó sẽ thêm không gian vì các quá độ không hoàn toàn đúng lúc với các tín hiệu âm trầm đói. Một cái gì đó tuyến tính thêm nhiều độ trễ, tín hiệu thấp hơn sẽ rất thú vị để kiểm tra.


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

Đó là, nếu cả A và B chia sẻ một dấu hiệu, áp dụng một giới hạn bù. Độ lớn của phần bù là tích của A và B. Hướng của phần bù ngược với hướng của A và B.

Nếu A và B không chia sẻ một dấu hiệu, không có giới hạn nào được áp dụng, vì không có cách nào để tràn.


Lưu ý điều này không giao hoán. Nếu bạn muốn trộn nhiều hơn 2 giọng nói, bạn phải trộn tất cả chúng cùng một lúc. Trong trường hợp này, bạn nên "làm phẳng" mọi thứ theo một hướng (nếu bạn quá cao, hãy làm phẳng các giá trị dương xuống với các giá trị âm; nếu bạn quá thấp, hãy làm phẳng các giá trị âm xuống với các giá trị dương). Khi bạn đã tính toán bù đắp (áp dụng theo tỷ lệ trên các giá trị còn lại); sử dụng phương pháp nhị phân, nhưng chia tỷ lệ giới hạn dựa trên số lượng giá trị hỗn hợp.
Rich Remer

-1

Đề xuất của tôi:

  1. Chuyển đổi định dạng âm thanh theo dõi từ điểm cố định 16 bit thành điểm nổi 32 bit.
  2. Thêm giá trị mẫu hiện tại của tất cả các bản nhạc được trộn.
  3. Đừng làm gì khác.

Người dùng có thể muốn xử lý luồng hỗn hợp này với nén và / hoặc giới hạn trước khi phối màu và chuyển đổi thành định dạng điểm cố định 16 bit (giả sử chuyển đổi này ... trộn lẫn để chuyển sang các kỹ sư thành thạo thường được để ở định dạng độ phân giải cao hơn)


2
Xin chào, và chào mừng bạn đến với DSP.se. Chúng tôi cảm ơn bạn đã cố gắng đóng góp, nhưng tôi không cảm thấy câu trả lời này của OP cả. OP không đề cập đến "người dùng" hệ thống của anh ấy: anh ấy có thể tự chơi với nó hoặc viết chương trình theo yêu cầu cụ thể. Tôi rất tiếc khi downvote: Tôi sẽ vui lòng sửa lại phiếu bầu của mình nếu bạn đưa ra câu trả lời của mình nhiều hơn. Ngoài ra, hãy quan tâm đến định dạng của bạn: hãy xem Câu hỏi thường gặp để xem cách viết câu trả lời hay.
Penelope
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.