Giúp thực hiện nén dải động


8

Tôi đang cố gắng thực hiện nén dải động âm thanh trong JavaScript (không sử dụng API âm thanh web).

Có rất nhiều bài viết cho các kỹ thuật viên âm thanh và một số tài liệu cấp cao, nhưng tôi không thể tìm thấy bất kỳ tài liệu tham khảo hữu ích nào để thực sự thực hiện nén dải động kỹ thuật số.

Theo những gì tôi hiểu, có ít nhất 3 bước trong việc tính toán tín hiệu được chỉnh lưu.

  1. tính toán mức đầu vào
  2. tính toán mức tăng để áp dụng cho tín hiệu
  3. áp dụng mức tăng

Tôi xử lý âm thanh theo khối, vì vậy trong 1) Tôi đã nghĩ đến việc tính toán RMS của một khối

Bất kỳ con trỏ đến một tài liệu tham khảo tốt? Hoặc bất cứ ai sẵn sàng giải thích cho tôi một chút các bước cần thiết để thực hiện điều này?


1
Chỉ cần chắc chắn: bạn muốn thực hiện một cái gì đó như thế này: wave.com/plugins/c1-compressor , phải không?
Deve

có :) nhưng đơn giản hơn nhiều! Các điều khiển tôi cần sẽ là ngưỡng, đầu gối, tỷ lệ, tấn công, phát hành. Nhưng tôi có thể bắt đầu với thậm chí đơn giản hơn
sebpiq

Câu trả lời:


4

Đây là một vài gợi ý:

  • Có rất nhiều triển khai mã nguồn mở (Sox, Audacity, v.v.). Ngay cả khi bạn không hiểu chúng, bạn có thể dịch mã từ C sang javascript.
  • Tôi không biết về một lời giải thích tốt về quy trình trực tuyến, nhưng có rất nhiều sách về chủ đề này:
    • Xử lý tín hiệu âm thanh kỹ thuật số bao gồm chủ đề này và được viết tốt. (Cũng như DAFX , nhưng DAFX được tổ chức kém và phạm vi bảo hiểm ít đơn giản hơn)
    • Âm thanh kỹ thuật số với Java cũng bao gồm chủ đề này và đi kèm với mã Java hoạt động nên dễ dịch sang các ngôn ngữ khác, chẳng hạn như javascript. Cuốn sách này có nhiều sai sót, nhưng nó tốt cho người không có kinh nghiệm lập trình âm thanh.

Nguyên tắc là tạo một đường bao tín hiệu (được điều khiển bằng tấn công và giải phóng), định hình đường bao đó bằng cách sử dụng một số chức năng truyền (được điều khiển theo tỷ lệ, ngưỡng và đầu gối), sau đó áp dụng kết quả đó trở lại tín hiệu ban đầu. Một giai đoạn tăng trang điểm thường theo sau.

Câu trả lời của @ Deve cho thấy một số chức năng chuyển có thể.


Vấn đề là tôi không biết C, và vâng, đó là một trở ngại lớn khi làm việc với dsp âm thanh, vì tôi không thể kiểm tra các triển khai hiện có. Mặt khác, cảm ơn về những cuốn sách, tôi chắc chắn sẽ kiểm tra cái đầu tiên ít nhất.
sebpiq

Cuốn sách DAFX có mã MATLAB. IDK nếu nó có mã MATLAB cho máy nén.
Bjorn Roche

Đối với cuốn sách "Xử lý tín hiệu âm thanh kỹ thuật số", các bình luận trên amazon nói rằng nó tốt hơn cho những người có nền tảng kỹ sư điện. Bạn có biết bất kỳ cuốn sách nào tập trung nhiều hơn vào các thuật toán, tốt nhất sẽ là ví dụ trong mã giả?
sebpiq

1
Bằng cách này hay cách khác, tôi sẽ phải học một số kỹ năng mới, tôi nghĩ vậy.
Bjorn Roche

Vâng tôi biết! Và tôi đã sẵn sàng cho điều đó. Chỉ là tôi không thực sự muốn mã MATLAB chẳng hạn, vì tôi không muốn trả tiền cho MATLAB để có thể kiểm tra chúng. Đó là lý do tại sao tôi hỏi bạn có biết những cuốn sách khác với mã giả chẳng hạn, thay vì một ngôn ngữ cụ thể (như Java mà tôi thực sự không hứng thú với việc học).
sebpiq

2

Để bắt đầu đơn giản, tôi sẽ sử dụng một đặc tính phi tuyến tính để nén tín hiệu đầu vào của bạn:g(x)

y=g(x)

trong đó (như được chỉ ra bởi endolith trong các ý kiến) là đường bao của tín hiệu âm thanh đầu vào và là đường bao đầu ra được áp dụng cho tín hiệu âm thanh thực tế. có thể là bất kỳ hàm nào làm suy giảm các giá trị đầu vào lớn mạnh hơn các giá trị đầu vào nhỏ. Các chức năng A-Law -Law đã được phát triển để nén tín hiệu giọng nói cho điện thoại, ví dụ. Tôi không biết làm thế nào âm thanh này tốt cho âm nhạc, mặc dù.xyg(x)μ

Một chức năng nén rất đơn giản khác sẽ làm giảm tất cả các biên độ trên một ngưỡng nhất định : trong đó là suy hao. Nhưng điều này sẽ không hoạt động tốt vì ý thức nghe của chúng ta là logarit do đó sự suy giảm có thể quá mạnh. Đây là lý do tại sao máy nén âm thanh hoạt động theo thang logarit và nó dẫn đến chức năng tương tự như trên, nhưng tất cả các giá trị được lấy logarit và liên quan đến giá trị tối đa có thể. Với : δ

g(x)={xforxδax+(1a)δforx>δ
a<1x>0
log(g(x))={log(x)forxδ1rlog(x)+(11r)log(δ)forx>δ

Đối với máy nén âm thanh, thường được tính theo dB và được biểu thị theo tỷ lệ nào đó, ví dụ 3: 1 (nghĩa làδrr=3). Điều này mang lại một hàm số mũ, khi được biểu thị tuyến tính (hy vọng nó đúng, vui lòng kiểm tra nó, cũngx>0):

g(x)={xforxδδ11/rx1/rforx>δ
Hàm này có "đầu gối cứng", nghĩa là hàm này logg(x)không phân biệt tại . Đối với một "đầu gối mềm", bạn sẽ cần một số chuyển tiếp trơn tru tại thời điểm đó. Việc mở rộng các hàm trên cho âm rất đơn giản, chỉ cần nhân với hàm dấu và lấy giá trị tuyệt đối của .x=δxx

Tấn công và phát hành có tác động đến các âm thanh khác nhau như đá, tiếng bẫy và giọng hát. Họ xác định khoảng thời gian trước khi đạt đến ngưỡng, máy nén sẽ bắt đầu hoạt động và bao lâu thì nó vẫn hoạt động sau khi tín hiệu đã giảm xuống dưới ngưỡng. Để thực hiện điều này, bạn sẽ phải sử dụng một số loại nhìn về phía trước.

Vì tất cả các biên độ dưới đều bị suy giảm, nên dải động có sẵn ist không được khai thác triệt để. Điều này được sửa bởi cái gọi là "make make gain", đây chỉ là một phép nhân đơn giản của tín hiệu nén với hệ số . Bằng cách đầu tiên giảm dải động và sau đó khuếch đại bộ nén tín hiệu có thể làm cho âm nhạc có vẻ "to hơn".δG>1


Cảm ơn! Giải thích tuyệt vời. Tôi đã đến một hàm chuyển gần với hàm bạn đã đưa, nhưng hàm của tôi không bao gồm ngưỡng (tôi đã đơn giản hóa với ngưỡng = 0), vì vậy tôi phải tính toán lại.
sebpiq

Trên thực tế, chức năng chuyển tôi nhận được bằng cách thêm ngưỡng là x ^ (1 / r) * 10 ^ (- sigma / (20 * r))
sebpiq

Xin lỗi, định nghĩa fucntion của tôi là một mớ hỗn độn vì tôi quên thêm sai lệch liên tục. Tôi đã sửa nó. Tuy nhiên, biểu hiện cuối cùng là chính xác theo ý kiến ​​của tôi. Nó phải hoàn thànhg(δ)=δ. Không có yếu tố nào liên quan đến 20 ở đây bởi vì chúng tôi lấy logarit của bên tay trái và bên phải để bất kỳ yếu tố không đổi nào bị hủy bỏ.
Deve

Chúng trông giống như méo, không nén. Biến dạng là sự thay đổi mức độ xảy ra trên cơ sở từng mẫu, trong khi nén là điều xảy ra trong nhiều chu kỳ của dạng sóng (mỗi biến thể được tạo thành từ nhiều mẫu). Méo phi tuyến tính sẽ âm thanh khủng khiếp.
endolith

@endolith Bạn nói đúng, cảm ơn vì gợi ý. Tôi đã cập nhật câu trả lời của mình cho phù hợp.
Deve
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.