Algoritma untuk mencampur sinyal audio tanpa kliping

49

Saya ingin mencampur dua atau lebih saluran audio PCM (misalnya sampel yang direkam) secara digital dengan cara yang akustik, lebih disukai dalam waktu yang hampir bersamaan (artinya sedikit atau tidak ada yang mengintip ke depan).

Cara yang "benar" secara fisik untuk melakukan ini adalah menjumlahkan sampel. Namun ketika Anda menambahkan dua sampel acak, nilai yang dihasilkan bisa hingga dua kali lipat nilai maksimum.

Misalnya, jika sampel Anda bernilai 16-bit, hasilnya akan mencapai 65536 * 2. Ini menghasilkan kliping.

Solusi naif di sini adalah untuk membagi dengan N, di mana N adalah jumlah saluran yang dicampur. Namun, ini menghasilkan setiap sampel 1 / N sebagai keras, yang sama sekali tidak realistis. Di dunia nyata, ketika dua instrumen dimainkan secara bersamaan, masing-masing instrumen tidak menjadi setengah keras.

Dari membaca sekitar, metode umum pencampuran adalah: hasil = A + B - AB, di mana A dan B adalah dua sampel yang dinormalisasi dicampur, dan AB adalah istilah untuk memastikan suara lebih keras semakin "jepretan lembut".

Namun, ini menimbulkan distorsi sinyal. Apakah tingkat distorsi ini dapat diterima dalam sintesis audio berkualitas tinggi?

Apa metode lain yang ada untuk mengatasi masalah ini? Saya tertarik pada algoritma berkualitas rendah yang kurang efisien serta algoritma berkualitas tinggi yang kurang efisien.

Saya mengajukan pertanyaan saya dalam konteks sintesis musik digital, untuk tujuan pencampuran beberapa trek instrumen bersama. Trek dapat berupa audio yang disintesis, sampel yang direkam sebelumnya, atau input mikrofon waktu nyata.

bryhoyt
sumber
Saya bertanya-tanya seberapa sering mungkin untuk menghindari kliping hanya dengan menggeser waktu sinyal sedikit.
Sebastian Reichelt
Ide bagus, meskipun saya curiga itu tidak sesederhana itu, terutama ketika Anda tidak memiliki banyak lookahead (misalnya secara real-time). Masalahnya adalah, Anda harus mengetahui sampel terlebih dahulu untuk mengetahui jenis waktu yang sesuai. Yang mengatakan, di sebagian besar musik, Anda akan memiliki probabilitas korelasi yang tinggi, sehingga sedikit pengalihan waktu acak mungkin bekerja dengan sangat baik. Adakah yang punya pengalaman untuk menggambar di sini?
bryhoyt
2
@ bryhoyt: Mixer nyata menjumlahkan sinyal. Itu dia. Tidak diperlukan waktu tunda atau pemrosesan non-linear. Memotong tidak menjadi masalah karena sinyal aslinya tidak sekeras itu.
endolith
2
16 + 16bit = 17 bit ;-)
nikwal
1
cukup bagi dengan jumlah input, maka kliping tidak akan mungkin. dan jika suaranya terlalu sepi, nyalakan amplifier ...
Sarge Borsch

Jawaban:

14

Sangat sulit untuk mengarahkan Anda ke teknik yang relevan tanpa mengetahui konteks apa pun untuk masalah Anda.

Jawaban yang jelas adalah untuk memberitahu Anda untuk menyesuaikan perolehan setiap sampel sehingga kliping jarang terjadi. Bukanlah hal yang tidak realistis untuk mengasumsikan bahwa musisi akan bermain lebih lembut dalam sebuah ensemble daripada ketika diminta untuk bermain solo.

Distorsi yang diperkenalkan oleh A + B - AB tidak dapat diterima. Ini menciptakan gambar cermin A di setiap sisi harmonik B - setara dengan modulasi cincin - yang cukup mengerikan jika A dan B memiliki spektrum yang kaya dengan harmonik yang tidak pada rasio integer. Cobalah dua gelombang persegi pada 220 dan 400 Hz misalnya.

Fungsi kliping yang lebih "alami" yang bekerja berdasarkan sampel per sampel, adalah fungsi tanh - itu benar-benar cocok dengan perilaku pembatas lunak beberapa elemen analog. Di luar itu, Anda dapat melihat teknik kompresi dinamis klasik - jika sistem Anda dapat melihat ke depan dan melihat puncaknya di muka, ini bahkan lebih baik.

pichenettes
sumber
4
Tambahan dan kliping keras. Lihat saja pemain mod open-source apa pun. Menggunakan tambahan untuk pencampuran, dengan input yang diskalakan dengan tepat untuk meminimalkan kliping, dan kemudian hard-limiter (opsional lunak) adalah norma, bukan pengecualian ...
pichenettes
4
Dalam sebagian besar situasi, ini bukan tanggung jawab pengembang untuk menyelesaikan masalah. Anda memberi pengguna / komposer kemungkinan untuk menyesuaikan volume setiap saluran, dan terserah kepada pengguna untuk melakukan campuran sehingga kliping dapat diterima oleh mereka. Misalnya, dalam Renoise, secara default, penguatan setiap instrumen / catatan adalah 1 dan hal-hal mulai terpotong dengan buruk saat menambahkan trek - tergantung pada pengguna untuk menyesuaikan volume catatan atau instrumen dalam modul untuk mencegah kliping pada instrumen. master track (kecuali jika diinginkan). Berikut screenshot yang menunjukkan itu: i.imgur.com/KVxDt.png .
pichenettes
2
IIRC, FastTracker lebih konservatif, karena menerapkan atenuasi pada setiap lagu, dan kemudian memiliki "peningkatan makeup" global dalam dialog preferensi dari x1 ke x32. Saya ingat bahwa ketika saya harus me-render semua modul saya ke. WAV untuk CD, saya harus mencoba nilai-nilai gain sampai saya menemukan yang terendah yang tidak menyebabkan kliping ...
pichenettes
2
Mengenai tingkat atenuasi, jika Anda tidak dapat memiliki pengguna di loop; 1/32 adalah level yang benar-benar aman (tidak ada kliping). Dengan asumsi bahwa saluran tidak berkorelasi (yang tidak terlalu benar untuk musik - lebih benar ketika mencampur suasana latar belakang), nilai 1 / sqrt (32) akan menjadi kompromi yang baik antara kenyaringan dan probabilitas kliping. Solusi terbaik adalah tetap menggunakan 1/32 dan kemudian memposting sampel Anda dengan kompresor dinamis.
pichenettes
3
Tambahan. Itulah yang dilakukan mixer perangkat keras dan itulah cara orang mengharapkan sesuatu untuk berlaku. Mixer tingkat sistem hanya memotong. Ini akan menjadi masalah besar jika driver sistem mengimplementasikan segala jenis pemrosesan non-linear - Saya akan membayangkan sakitnya menguasai insinyur yang mencoba mencari tahu apakah yang mereka dengar adalah pengaturan plug-in kompresor atau pemrosesan dinamis tingkat sistem. Perangkat lunak produksi musik menawarkan beragam palet plug-in kompresi dinamika, tergantung pada pengguna untuk memastikan campuran mereka tidak terpotong.
pichenettes
16

Cara yang "benar" secara fisik untuk melakukan ini adalah menjumlahkan sampel. Namun ketika Anda menambahkan dua sampel acak, nilai yang dihasilkan bisa hingga dua kali lipat nilai maksimum. ... Solusi naif di sini adalah untuk membagi dengan N, di mana N adalah jumlah saluran yang dicampur.

Itu bukan solusi "naif", itu satu - satunya solusi. Itulah yang dilakukan oleh setiap mixer analog dan digital, karena itulah yang dilakukan udara, dan itulah yang dilakukan otak Anda.

Sayangnya, ini tampaknya merupakan kesalahpahaman yang umum, seperti yang ditunjukkan oleh algoritma "pencampuran" (distorsi) non-linear yang salah ini:

"Membagi dengan N" disebut ruang kepala ; ruang ekstra untuk puncak yang dialokasikan di atas level RMS dari bentuk gelombang. Jumlah ruang kepala yang diperlukan untuk suatu sinyal ditentukan oleh faktor puncak sinyal . (Kesalahpahaman tingkat sinyal digital dan ruang kepala mungkin sebagian disalahkan untuk perang Kenyaringan dan Elephunk .)

Dalam perangkat keras analog, ruang kepala mungkin 20 dB. Dalam DSP perangkat keras, titik tetap sering digunakan, dengan ruang kepala tetap; SigmaDSP AD , misalnya, memiliki ruang kepala 24 dB. Dalam perangkat lunak komputer, pemrosesan audio biasanya dilakukan dalam floating point 32 bit, sehingga ruang kepala sangat besar.

Idealnya, Anda tidak perlu membagi dengan N sama sekali, Anda hanya perlu menjumlahkan sinyal bersama, karena sinyal Anda tidak akan dihasilkan pada 0 dBFS di tempat pertama.

Perhatikan bahwa sebagian besar sinyal tidak berkorelasi satu sama lain, jadi tidak umum untuk semua saluran mixer untuk secara konstruktif mengganggu pada saat yang sama. Ya, mencampurkan 10 gelombang sinus in-phase yang identik akan meningkatkan level puncak sebesar 10 kali (20 dB), tetapi mencampur 10 sumber kebisingan yang tidak koheren hanya akan meningkatkan level puncak sebesar 3,2 kali (10 dB). Untuk sinyal nyata, nilainya antara ekstrem ini.

Untuk mendapatkan sinyal campuran dari DAC tanpa kliping, Anda cukup mengurangi gain dari campuran. Jika Anda ingin agar level RMS dari campuran tetap tinggi tanpa kliping keras, Anda perlu menerapkan beberapa jenis kompresi untuk membatasi puncak gelombang, tetapi ini bukan bagian dari pencampuran, ini merupakan langkah terpisah. Anda mencampurnya terlebih dahulu, dengan banyak ruang kepala, dan kemudian menempatkannya melalui kompresi rentang dinamis nanti, jika diinginkan.

endolith
sumber
1
Saya mengerti konsep-konsep ini, tetapi saya tidak yakin itu benar. Tentu, jika saya menambahkan banyak sampel 16-bit, 32 bit memberi saya banyak ruang numerik. Tetapi saya masih harus memainkan mix yang dihasilkan pada volume yang dinormalisasi pada sistem suara dunia nyata. Saya ingin 2 saluran terdengar lebih keras daripada setiap saluran diputar secara terpisah, tetapi saya tidak ingin kliping. Melakukan jumlah saya dalam 32 atau bahkan 64 bit tidak membantu dengan ini. Mungkin saya mulai menjawab pertanyaan saya sendiri: sampel asli harus dinormalisasi pada tingkat yang lebih tenang daripada amplitudo maksimum. Seperti yang Anda sarankan, tinggalkan beberapa ruang kepala pencampuran.
bryhoyt
3
@ Bryhoyt: Ya, tetapi Anda juga harus ingat bahwa ombaknya jarang berkorelasi satu sama lain, jadi menambahkan bersama 5 suara tidak membuat puncak 5 kali lebih tinggi.
endolith
1
Terima kasih, @endolith, saya rasa itu benar-benar inti dari semua ini, dan menjelaskan kepada saya mengapa itu tidak menjadi masalah besar seperti yang saya pikirkan.
bryhoyt
Jadi jika 10 sumber non-koheren memberikan 10 dB, akankah membagi dengan sqrt (jumlah sumber) menjadi heuristik yang masuk akal? Artinya, jika Anda punya 3 sumber, jumlahkan dan bagi dengan sqrt (3)? (maaf karena mengomentari utas kuno)
nerdfever.com
@ nerdfever.com Begitulah tingkat RMS bergabung, jadi ... mungkin?
endolith
6

formulanya

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

Mungkin ini:

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

PEMBARUAN: Seperti yang disarankan oleh hotpaw2, Anda dapat menunda sinyal input tetapi tidak menekan penguatan. Ini disebut "look-ahead limiter".

Bjorn Roche
sumber
Yang saya maksud dengan "AB" adalah "A * B". Saya mengerti bahwa amplitudo dapat positif atau negatif. Anda benar, persamaan saya tidak masuk akal untuk kombinasi yang melibatkan amplitudo negatif.
bryhoyt
Saya harus mencampur 8 hingga 10 (N) gelombang sinus yang berbeda. Secara empiris saya tahu nilai yang tepat adalah sekitar 0,3 ... 1 / √N tampaknya tidak benar ... ada tautan ke mengapa rumus itu benar?
Zibri
5

Salah satu cara ini dapat dilakukan untuk pencampuran non-real-time menggunakan AGC lihat-depan, di mana keuntungan dari satu atau kedua saluran diturunkan pada tingkat yang sulit dilihat sebelum amplitudo jumlah melebihi batas kliping. Semakin sedikit pandangan ke depan yang tersedia, baik penyesuaian gain AGC akan menjadi lebih terdengar, atau kenaikan maksimal untuk ramp penyesuaian gain yang lebih lembut akan semakin dekat dan lebih dekat ke 0,5 per saluran pada batas. Untuk sumber suara dengan beberapa prediktabilitas, seseorang juga dapat menggunakan statistik mengenai perilaku amplop dari waktu ke waktu untuk menebak batas kenaikan secara adaptif, tetapi dengan beberapa kemungkinan kegagalan (yang akan menjadi penyesuaian perolehan AGC yang tiba-tiba).

hotpaw2
sumber
Ini adalah pembatas tampilan depan, bukan AGC tampilan depan.
Bjorn Roche
2
@BjornRoche: Tidak bisakah limiter dianggap sebagai jenis AGC?
endolith
Beberapa pembatas adalah AGC, tetapi pembatas lookahead bukan AGC.
Bjorn Roche
1
@BjornRoche baik itu otomatis dan kontrol mendapatkan ...
Olli Niemitalo
2

Saya telah berbicara dengan desainer mixer akhir 1990-an dan 2000-an pertama yang terjadi pada gelombang digital (setelah berjinjit). Saya pikir orang itu adalah desainer untuk SPL, tapi mungkin tidak sebesar itu, saya sama sekali tidak ingat nama maupun mereknya, saya hanya ingat betapa sangat besar dan mahalnya mesin itu.

Kami berbicara lama, dan akhirnya berbicara tentang teknik untuk benar-benar menjamin bahwa saluran 64/128 @ 24bits mereka bercampur menjadi satu tetap 24 bit akurat saluran keluaran campuran tanpa kliping.

Teknik yang dia jelaskan agak sederhana. 64 trek (pada 24 bit) ditambahkan dalam saluran 48 bit, di mana kliping tidak dapat terjadi. Lurus.

Saya tidak bisa mengatakan bagaimana sinyal itu kemudian diputar 48 kembali dari ke 24 bit. Mungkin di situlah resep dapur yang rumit diterapkan.

Dan mungkin ada banyak teknik untuk mencapai itu, di atas semua berbeda apakah dilakukan secara real-time atau dengan semua sinyal yang sudah direkam dengan puncak-puncak tinggi yang sederhana untuk menentukan ... semua jenis normalisasi yang saya bayangkan.

Stephane Rolland
sumber
2

Turunkan volume global. Pelacak impuls secara klasik menghasilkan saluran sekitar 33% volume maks secara default.

Itu tampaknya cukup keras untuk musik dengan beberapa saluran (4 kanal Amiga MOD) dan cukup lunak untuk lagu dengan 50 saluran (karena konten saluran biasanya tidak berkorelasi sehingga volume tidak bertambah cepat melewati tingkat tertentu ... ditambah beberapa saluran akan menghasilkan pada volume maksimal dengan banyak hal yang terjadi). Ini juga menyisakan ruang kepala yang cukup untuk saluran panahan hard-left atau hard-right (yang menggunakan 66% dari jangkauan).

Anda juga tidak ingin menambahkan saluran bersama dalam 16 bit, Anda ingin menambahkannya bersama dalam 32 bit, lalu jepitkan hasilnya dan kurangi menjadi 16 bit di bagian paling akhir. Anda akan memerlukan rentang yang lebih tinggi sehingga tidak membungkus saat melakukan matematika. Pilihan lain adalah menggunakan floating point 32bit (yang nyaman untuk melakukan filter, efek dll).

Hubert Lamontagne
sumber
0

Saya pikir kuncinya adalah, jika Anda memiliki nilai 16 bit dan menambahkan 2 nilai Anda bersama-sama yang berpotensi menjadi lebih dari nilai maksimum, maka Anda memiliki 2 opsi:

1) masukkan keduanya ke 32 bit tambah kemudian kembalikan nilai maksimum jika penambahan melebihi nilai itu. Kemudian masukkan kembali ke 16 bit. Misalnya jika nilai Anda adalah 32768 dan 34567 itu melebihi 65535 dan kuncinya adalah untuk mengembalikan 65535. Anda akan melakukan hal yang sama jika menggunakan nilai yang ditandatangani pada akhir nilai minimum.

2) kompres kedua nilai, lalu tambahkan bersama.

Yang pertama pada dasarnya kliping keras, yang kedua kliping lembut. Sistem analog semuanya kliping keras.

Wogster
sumber
0

Mereka hanya akan menjadi dua kali ruang jika frekuensi di kedua trek menggunakan frekuensi ruang yang sama. Gunakan persamaan dan kompresi untuk menyiasatinya dengan mengukir area spektrum frekuensi untuk setiap suara dan mengendalikan transien dan menopang suara sehingga semuanya menyembul di tempat yang seharusnya. Mungkin itu tidak menjawab pertanyaan. Anda dapat menunda sinyal frekuensi yang lebih rendah hingga 2 ms. Itu tidak akan membatalkan melalui fase karena panjang gelombang lebih panjang dari frekuensi yang lebih tinggi dan itu akan menambah ruang karena transien tidak sepenuhnya tepat waktu dengan sinyal bass haus daya. Sesuatu yang secara linear menambahkan lebih banyak penundaan, semakin rendah sinyalnya akan menarik untuk diuji.

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

Yaitu, jika A dan B berbagi tanda, terapkan offset pembatas. Besarnya offset adalah produk dari A dan B. Arah offset berlawanan dengan A dan B.

Jika A dan B tidak membagikan tanda, tidak ada batas yang diterapkan, karena tidak ada cara untuk meluap.

Remer Kaya
sumber
Perhatikan ini tidak komutatif. Jika Anda ingin mencampur lebih dari 2 suara, Anda harus mencampur semuanya sekaligus. Dalam hal ini, Anda harus "meratakan" segala sesuatu dalam satu arah (jika Anda terlalu tinggi, ratakan nilai positif dengan yang negatif; jika Anda terlalu rendah, ratakan nilai negatif ke bawah dengan yang positif). Setelah Anda memperhitungkan offset (diterapkan secara proporsional di seluruh nilai yang tersisa); menggunakan pendekatan biner, tetapi skala limiter berdasarkan jumlah nilai campuran.
Rich Remer
-1

Saran saya:

  1. Mengkonversi format audio trek dari titik tetap 16bit ke titik mengambang 32bit.
  2. Tambahkan nilai sampel saat ini dari semua trek yang akan dicampur.
  3. Jangan lakukan hal lain.

Pengguna mungkin ingin memproses aliran campuran ini dengan kompresi dan / atau membatasi sebelum dithering dan konversi ke format titik tetap 16bit (dengan asumsi konversi ini ... campuran untuk diserahkan kepada insinyur ahli biasanya dibiarkan pada format resolusi yang lebih tinggi)

aaron peacock
sumber
2
Halo, dan selamat datang di DSP.se. Kami berterima kasih telah mencoba berkontribusi, tetapi saya tidak merasa ini menjawab pertanyaan OP sama sekali. OP tidak menyebutkan "pengguna" sistemnya: ia mungkin bermain sendiri, atau menulis program dengan persyaratan tertentu. Saya minta maaf untuk mengundurkan diri: Saya akan dengan senang hati merevisi suara saya jika Anda membuat jawaban Anda lebih jelas. Selain itu, harap perhatikan pemformatan Anda: lihat FAQ untuk melihat cara menulis jawaban yang baik.
penelope