Cara Kerja Generator Noise Digital

Fondasi: Pembuatan Bilangan Pseudoacak

Dalam pekerjaan saya membangun mesin noise di WhiteNoise.top, saya telah menghabiskan ratusan jam mengoptimalkan pipeline yang mengubah keacakan matematis menjadi audio yang meyakinkan. Setiap generator noise digital dimulai dengan komponen fundamental yang sama: generator bilangan pseudoacak, atau PRNG. PRNG adalah algoritma yang menghasilkan urutan angka deterministik yang tampak acak menurut uji statistik. Keacakan sejati dari sumber entropi perangkat keras terlalu lambat dan tidak dapat diprediksi untuk audio real-time, sehingga PRNG menyediakan fondasi praktis untuk semua pembuatan noise digital.

PRNG paling dasar yang cocok untuk pekerjaan audio adalah linear congruential generator (LCG), yang menghitung setiap nilai sebagai fungsi linear dari nilai sebelumnya, modulo konstanta besar. Meskipun cepat, LCG memiliki kelemahan yang diketahui: mereka menunjukkan korelasi antara sampel berturut-turut yang dapat menghasilkan artefak yang terdengar dalam sinyal noise. Dalam prototipe awal saya, saya menggunakan LCG sederhana dan dapat mendengar pola periodik samar dalam output saat mendengarkan melalui headphone berkualitas tinggi. Pola-pola ini muncul sebagai puncak spektral sempit dalam analisis FFT, mengonfirmasi bahwa kelemahan statistik PRNG bocor ke domain audio.

Untuk noise berkualitas produksi, saya beralih ke algoritma xorshift128+, yang merupakan PRNG yang digunakan secara internal oleh sebagian besar mesin JavaScript untuk Math.random(). Ia memiliki periode 2 pangkat 128 minus 1, sifat statistik yang sangat baik, dan biaya komputasi yang dapat diabaikan. Ketika saya menjalankan rangkaian uji keacakan TestU01 pada outputnya, ia lulus semua suite SmallCrush dan Crush. Hasilnya adalah sinyal noise yang bebas dari artefak yang terdengar, dengan spektrum rata yang terverifikasi dalam 0,3 dB di seluruh rentang yang dapat didengar.

Dari Bilangan Acak ke Sampel Audio

PRNG menghasilkan angka, tetapi sistem audio memerlukan sampel bentuk gelombang pada amplitudo dan laju sampling tertentu. Proses konversi melibatkan penskalaan, pembentukan distribusi, dan manajemen buffer. Dalam implementasi saya, PRNG menghasilkan bilangan bulat 32-bit tak bertanda, yang kemudian saya normalisasi ke nilai floating-point dalam rentang negatif satu hingga positif satu. Ini adalah rentang amplitudo standar untuk audio digital di Web Audio API dan sebagian besar framework audio lainnya.

Distribusi nilai acak penting untuk karakter noise. Distribusi seragam, di mana semua nilai dalam rentang sama kemungkinannya, menghasilkan noise dengan distribusi amplitudo yang sedikit berbeda dari distribusi Gaussian yang mencirikan noise termal di sirkuit analog. Dalam praktiknya, perbedaannya halus: white noise seragam memiliki crest factor sekitar 4,8 dB, sementara white noise Gaussian memiliki crest factor yang secara teoritis tak terbatas, meskipun dalam praktiknya sekitar 12 dB untuk panjang buffer tipikal. Untuk sebagian besar aplikasi, distribusi seragam sangat dapat diterima dan secara komputasi lebih sederhana.

Ketika saya memerlukan noise berdistribusi Gaussian untuk aplikasi yang menuntutnya, saya menggunakan transformasi Box-Muller, yang mengonversi pasangan bilangan acak berdistribusi seragam menjadi pasangan nilai berdistribusi Gaussian. Overhead komputasinya sedang, kira-kira menggandakan biaya per sampel, tetapi hasilnya adalah sinyal noise yang lebih cocok dengan statistik amplitudo sumber noise analog. Dalam tes pendengaran, perbedaan antara white noise seragam dan Gaussian hampir tidak terdengar, tetapi varian Gaussian berkinerja lebih baik dalam aplikasi pemrosesan sinyal tertentu di mana statistik amplitudo penting.

Pembentukan Spektral: Mengubah White Menjadi Warna

White noise adalah bahan mentah dari mana semua warna noise lainnya dibuat. Transformasi dicapai melalui pemfilteran digital, menerapkan kurva penguatan yang bergantung pada frekuensi ke spektrum white noise. Dalam mesin noise saya, saya mengimplementasikan pembentukan spektral menggunakan filter IIR (infinite impulse response) dan FIR (finite impulse response), masing-masing dengan keunggulan yang berbeda.

Untuk pink noise (kemiringan minus tiga desibel per oktaf), saya menggunakan algoritma Voss-McCartney sebagai metode utama saya. Algoritma ini memelihara beberapa generator bilangan acak independen yang diperbarui pada laju yang berbeda: satu diperbarui setiap sampel, satu setiap dua sampel, satu setiap empat sampel, dan seterusnya. Output dijumlahkan untuk menghasilkan sinyal yang spektrumnya mendekati kemiringan pink noise ideal. Dalam implementasi saya, saya menggunakan 16 lapisan oktaf, yang memberikan pembentukan spektral yang akurat dari di bawah 1 Hz hingga di atas 20 kHz. Kesalahan relatif terhadap kemiringan ideal kurang dari 0,5 dB di seluruh rentang yang dapat didengar.

Untuk brown noise (kemiringan minus enam desibel per oktaf), saya menggunakan integrasi sederhana: setiap sampel output adalah jumlah dari output sebelumnya dan sampel white noise baru, diskalakan oleh koefisien kecil. Secara matematis, ini adalah filter low-pass IIR orde pertama dengan pole yang sangat dekat dengan satu pada lingkaran satuan. Tantangan dengan pendekatan ini adalah drift DC: jumlah yang berjalan dapat mengembara jauh dari nol seiring waktu, akhirnya melebihi ambang kliping. Saya menyelesaikan ini dengan menambahkan filter high-pass orde pertama yang sangat lembut pada 5 Hz, yang membatasi drift tanpa secara terdengar memengaruhi spektrum di atas 20 Hz.

Untuk bentuk spektral kustom yang diminta oleh pengguna tingkat lanjut, saya menggunakan equalizer parametrik yang dibangun dari bagian filter biquad orde kedua yang bertingkat. Setiap bagian mengimplementasikan jenis filter standar (peak, low shelf, high shelf, atau notch) dengan parameter frekuensi, penguatan, dan bandwidth yang dapat disesuaikan pengguna. Dengan merantai empat hingga enam bagian, saya dapat mendekati hampir semua bentuk spektral halus yang mungkin diinginkan pengguna, dari kemiringan lembut hingga kontur multi-pita yang kompleks.

Pembuatan Real-Time dengan Web Audio API

Web Audio API, tersedia di semua browser modern, menyediakan infrastruktur untuk menghasilkan dan memutar noise secara real time tanpa pemrosesan sisi server apa pun. Dalam implementasi saya di WhiteNoise.top, saya menggunakan tiga komponen Web Audio API utama: AudioContext, ScriptProcessorNode (atau penggantinya yang modern, AudioWorkletNode), dan BiquadFilterNode.

AudioWorkletNode adalah tempat pembuatan inti terjadi. Saya mendaftarkan AudioWorkletProcessor kustom yang berjalan di thread terpisah dari thread utama browser, memastikan bahwa interaksi UI tidak menyebabkan gangguan audio. Metode process() prosesor dipanggil berulang kali dengan buffer output, biasanya 128 sampel per panggilan pada 44,1 kHz. Di dalam metode ini, saya menghasilkan sampel white noise menggunakan PRNG, menerapkan pembentukan spektral apa pun, dan menulis hasilnya ke buffer output. Seluruh pipeline berjalan dalam sekitar 0,01 milidetik per buffer pada perangkat keras modern, jauh dalam batas waktu sekitar tiga milidetik untuk pemutaran bebas gangguan.

Manajemen buffer sangat penting untuk menghindari artefak yang terdengar. Jika prosesor memerlukan terlalu lama untuk mengisi buffer, output audio mengalami underrun, menghasilkan klik atau pop. Dalam uji stres saya, saya mendorong sistem dengan menambahkan beban komputasi ke thread utama (seperti manipulasi DOM berat atau parsing JSON besar) dan memverifikasi bahwa thread audio worklet terus mengirimkan buffer tepat waktu. Isolasi thread yang disediakan oleh AudioWorklet API sangat penting untuk ketahanan ini; ScriptProcessorNode yang lebih lama berjalan di thread utama dan rentan terhadap gangguan selama eksekusi JavaScript yang berat.

Saya juga menggunakan BiquadFilterNode bawaan Web Audio API untuk pembentukan spektral ketika filter yang diinginkan adalah tipe standar. Node-node ini diimplementasikan dalam kode native yang dioptimalkan, membuatnya secara signifikan lebih cepat daripada implementasi JavaScript yang setara. Untuk pembuatan pink noise dalam konfigurasi yang lebih sederhana, saya merantai beberapa BiquadFilterNode yang dikonfigurasi sebagai filter low-pass dengan frekuensi dan faktor Q yang dipilih dengan cermat untuk mendekati kemiringan ideal minus tiga desibel per oktaf.

Optimalisasi dan Pertimbangan Praktis

Optimalisasi kinerja adalah perhatian berkelanjutan dalam pembuatan audio real-time. Dalam proses pengembangan saya, saya telah mengimplementasikan beberapa teknik untuk memaksimalkan efisiensi tanpa mengorbankan kualitas. Yang pertama adalah prakomputasi: untuk warna noise yang tidak berubah secara dinamis, saya menghasilkan buffer noise besar (biasanya 10 detik pada 44,1 kHz, atau 441.000 sampel) selama inisialisasi dan memutar ulangnya selama pemutaran. Untuk mencegah loop terdengar, saya menggunakan crossfade pada batas loop, memadukan 4.096 sampel terakhir buffer dengan 4.096 sampel pertama menggunakan window raised-cosine. Loop yang dihasilkan secara perseptual tidak terasa.

Optimalisasi kedua adalah pemrosesan gaya SIMD dalam JavaScript. Meskipun JavaScript tidak menyediakan instruksi SIMD eksplisit dalam konteks AudioWorklet, saya menyusun loop dalam saya untuk memproses sampel dalam kelompok empat, memungkinkan kompiler JIT mesin JavaScript menerapkan auto-vektorisasi. Dalam benchmark saya, pendekatan ini menghasilkan percepatan 15 hingga 25 persen dibandingkan dengan memproses satu sampel pada satu waktu, tergantung pada mesin browser.

Pertimbangan ketiga adalah manajemen memori. Mengalokasikan dan mendealokasikan memori selama pemrosesan audio dapat memicu jeda garbage collection, yang menyebabkan gangguan yang terdengar. Saya mengalokasikan semua buffer terlebih dahulu selama inisialisasi dan menggunakannya kembali sepanjang sesi. Tidak ada objek yang dibuat di dalam metode process(), dan semua nilai perantara disimpan dalam typed array yang telah dialokasikan sebelumnya. Disiplin ini menghilangkan artefak audio terkait GC sepenuhnya.

Konsumsi daya adalah pertimbangan praktis lainnya, terutama untuk perangkat mobile. Dalam pengujian saya pada smartphone, saya menemukan bahwa beban CPU dari generator noise sederhana dapat diabaikan, biasanya kurang dari satu persen. Namun, menjaga output audio tetap aktif mencegah perangkat memasuki mode tidur dalam, yang dapat menguras baterai selama sesi yang diperpanjang. Saya mengatasi ini dengan menawarkan fitur timer yang menghentikan generator setelah durasi yang ditentukan pengguna, dan dengan menggunakan Page Visibility API untuk menjeda pembuatan ketika tab browser tidak berada di latar depan.

Memvalidasi Kualitas Output Generator

Generator noise hanya sebaik kualitas outputnya, dan kualitas harus diverifikasi melalui pengukuran objektif. Dalam proses jaminan kualitas saya, saya menjalankan setiap konfigurasi generator melalui serangkaian tes otomatis sebelum merilisnya ke pengguna. Tes pertama adalah kerataan spektral: saya menangkap sampel white noise 60 detik, menghitung magnitudo FFT rata-rata, dan memverifikasi bahwa tidak ada bin frekuensi yang menyimpang lebih dari 1 dB dari rata-rata. Untuk noise berbentuk, saya membandingkan spektrum yang diukur dengan kurva target dan memverifikasi penyimpangannya kurang dari 0,5 dB.

Tes kedua adalah distribusi amplitudo. Saya menghitung histogram nilai sampel dan membandingkannya dengan distribusi yang diharapkan, baik seragam maupun Gaussian, menggunakan uji Kolmogorov-Smirnov. Nilai p di atas 0,05 menunjukkan bahwa distribusi cocok dengan bentuk yang diharapkan pada tingkat kepercayaan 95 persen.

Tes ketiga adalah deteksi periodisitas. Saya menghitung fungsi autokorelasi dari sampel 10 detik dan memeriksa bahwa tidak ada lag non-nol yang memiliki koefisien korelasi melebihi maksimum teoritis untuk proses acak dengan panjang tersebut. Pola periodik dalam PRNG akan muncul sebagai puncak dalam fungsi autokorelasi, bahkan jika tidak terdengar, dan menunjukkan cacat dalam generator yang dapat menyebabkan masalah dalam aplikasi pemrosesan sinyal.

Terakhir, saya melakukan tes pendengaran subjektif dengan headphone, memeriksa klik, pop, artefak tonal, dan variasi dalam level atau timbre selama periode pemutaran yang diperpanjang. Tes otomatis menangkap sebagian besar masalah, tetapi telinga manusia tetap menjadi penilai akhir kualitas audio, dan saya memastikan untuk mendengarkan setiap varian generator secara pribadi sebelum ditayangkan di platform.

Referensi

Pertanyaan yang Sering Diajukan

Bisakah generator noise digital menghasilkan output yang benar-benar acak?

Tidak. Generator noise digital menggunakan generator bilangan pseudoacak (PRNG) yang menghasilkan urutan deterministik. Namun, PRNG yang dirancang dengan baik menghasilkan output yang tidak dapat dibedakan secara statistik dari keacakan sejati untuk semua aplikasi audio praktis.

Mengapa Web Audio API menggunakan AudioWorklet alih-alih ScriptProcessorNode?

AudioWorklet berjalan di thread terpisah dari thread utama browser, mencegah operasi UI menyebabkan gangguan audio. ScriptProcessorNode berjalan di thread utama dan rentan terhadap putus selama eksekusi JavaScript yang berat. ScriptProcessorNode sekarang sudah tidak digunakan lagi.

Apa yang menyebabkan klik atau pop di generator noise?

Klik dan pop biasanya disebabkan oleh buffer underrun, di mana generator tidak dapat mengisi buffer output tepat waktu, atau oleh jeda garbage collection di JavaScript. Manajemen buffer yang tepat dan pra-alokasi memori menghilangkan artefak ini.

Berapa banyak CPU yang digunakan generator noise?

Generator noise sederhana biasanya menggunakan kurang dari satu persen CPU pada perangkat keras modern. Kekhawatiran kinerja utama adalah menjaga waktu yang konsisten untuk mencegah gangguan audio, bukan beban CPU keseluruhan.

Bisakah saya memutar ulang sampel noise alih-alih menghasilkannya secara real time?

Ya, tetapi Anda perlu menerapkan crossfade pada batas loop untuk mencegah klik yang terdengar. Crossfade raised-cosine sekitar 4.096 sampel pada 44,1 kHz menciptakan loop yang secara perseptual mulus.

Leo Chen

Leo Chen adalah pengembang alat dan penggemar audio, yang berfokus pada pembuatan alat suara dan produktivitas online yang praktis.