formula pembatas puncak / kompresi audio diperlukan

9

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.)

Daniel R Hicks
sumber

Jawaban:

9

Dua masalah di sini: cara mendapatkan estimasi tingkat yang andal, dan cara mengompres data.

  • Gunakan statistik yang kuat pada data asli (bukan puncak terbatas) seperti median atau kuantil daripada rata-rata berjalan untuk membuat deteksi "level tipikal" Anda kuat untuk outlier.
  • k×tanh(xk)C

contoh

  • Biru: sinyal asli
  • Hijau: 2 x median dari nilai absolut di atas jendela geser sebagai deteksi "level umum"
  • Merah: kompresi tanh (rumus yang diberikan di atas dengan k sama dengan tingkat diplot hijau)
pichenettes
sumber
Terima kasih, itu terlihat menjanjikan. Saya akan pasang dan lihat bagaimana hasilnya.
Daniel R Hicks
1
Saya mencobanya dan tampaknya berfungsi baik (setelah saya membersihkan beberapa pemeriksaan jari). Satu-satunya masalah saya dengan itu adalah bahwa tampaknya tidak ada cara untuk menyesuaikan ketajaman "lutut" tanpa menaikkan tingkat klip atau apa pun.
Daniel R Hicks
Mengapa "median bergerak" lebih baik dari "rata-rata bergerak"? Saya membaca di banyak tempat bahwa itu kurang sensitif terhadap pencilan. Tetapi saya tidak dapat melihat ini dengan data nyata . Adakah pertanyaan tentang pertanyaan ini?
Basj