Saya mencari rumus untuk secara efektif mengompresi bentuk gelombang audio untuk membatasi puncak. Ini bukan aplikasi "kontrol volume otomatis" di mana orang akan mengontrol penguatan amplifier untuk mempertahankan level volume, tetapi saya ingin membatasi ("soft" truncate) puncak individu. (Saya tahu ini memperkenalkan harmonik, tetapi saya mencoba menganalisis data, bukan mendengarkannya.)
Formula saya (sangat kasar) sejauh ini adalah:
factor = (10 * average / level) + exp(-sqrt(0.1 * level / average))
Di mana level adalah tingkat suara instan, rata - rata adalah tingkat suara rata-rata historis, dan faktor adalah pengganda yang digunakan untuk menghasilkan tingkat "yang disesuaikan" ( faktor kali tingkat ).
Selanjutnya, pengganda ini hanya diterapkan jika ia menghitung nilai kurang dari 1. Jika tidak, tingkat dibiarkan tidak disesuaikan.
Maksudnya adalah untuk membatasi level yang disesuaikan untuk beberapa kelipatan (sekitar 15x dengan rumus ini) dari rata-rata historis. Formula ini adalah jenis yang saya butuhkan, tetapi menunjukkan "penurunan" ketika jumlahnya semakin besar. Artinya, tingkat penyesuaian (yaitu, tingkat faktor kali ) meningkat ke titik dengan meningkatnya tingkat tidak disesuaikan tetapi kemudian, alih-alih asimptotik, mulai benar-benar semakin kecil. (Faktanya, faktor pertama ditambahkan terutama untuk mencegah formula menjadi nol dengan nilai yang sangat tinggi.)
(Alasan ingin membatasi nilai-nilai dengan cara ini adalah terutama sehingga kebisingan sementara tidak serius mengganggu rata-rata berjalan dari tingkat suara. Tetapi ketika Anda menganalisis mendengkur "kebisingan transien" cukup signifikan, jadi saya bisa cukup memadamkannya .)
Jadi, adakah yang bisa menyarankan sesuatu yang lebih baik? (Tampaknya perilaku asimptotik mudah dihasilkan ketika Anda tidak menginginkannya, tetapi sulit ketika Anda melakukannya.)