Tôi đang tìm kiếm một công thức để nén một cách hiệu quả một dạng sóng âm thanh để hạn chế các đỉnh. Đây không phải là một ứng dụng "điều khiển âm lượng tự động" trong đó người ta sẽ điều khiển mức khuếch đại để duy trì mức âm lượng, nhưng tôi muốn giới hạn các đỉnh riêng lẻ ("mềm"). (Tôi biết điều này giới thiệu sóng hài, nhưng tôi đang cố gắng phân tích dữ liệu, không nghe nó.)
Công thức (rất thô sơ) của tôi cho đến nay là:
factor = (10 * average / level) + exp(-sqrt(0.1 * level / average))
Trong trường hợp mức là mức âm thanh tức thời, trung bình là mức âm thanh trung bình lịch sử, và yếu tố là một số nhân sử dụng để tạo ra "điều chỉnh" mức ( yếu tố lần mức ).
Hơn nữa, hệ số nhân này chỉ được áp dụng nếu nó tính toán với giá trị nhỏ hơn 1. Mức khác được điều chỉnh.
Mục đích là để giới hạn mức điều chỉnh ở một số bội số (khoảng 15 lần với công thức này) của mức trung bình lịch sử. Công thức này là những gì tôi cần, nhưng thể hiện sự "nhúng" khi số lượng ngày càng lớn. Đó là, mức độ điều chỉnh (tức là, yếu tố lần mức ) tăng lên đến một điểm với sự gia tăng mức độ không điều chỉnh nhưng sau đó, thay vì đi tiệm cận, bắt đầu để thực sự trở nên nhỏ hơn. (Trên thực tế, yếu tố đầu tiên được thêm vào chủ yếu để ngăn công thức về 0 với giá trị cực cao.)
(Lý do muốn giới hạn các giá trị theo cách này chủ yếu là vì tiếng ồn thoáng qua không làm ảnh hưởng nghiêm trọng đến mức trung bình đang chạy của mức âm thanh. .)
Vì vậy, bất cứ ai có thể đề nghị một cái gì đó tốt hơn? (Có vẻ như hành vi tiệm cận rất dễ tạo ra khi bạn không muốn, nhưng khó khi bạn làm.)