Pendahuluan
Pada bagian pertama dari
seri artikel ini, kita akan mempertimbangkan sisi teoritis dari dithering, sedikit sejarah dan penerapannya pada sinyal 1D dan pengambilan sampel. Saya akan mencoba melakukan analisis frekuensi kesalahan diskritisasi dan berbicara tentang bagaimana dithering membantu untuk memperbaikinya. Pada dasarnya ini akan menjadi artikel teoretis, jadi jika Anda tertarik pada aplikasi yang lebih praktis, maka tunggu bagian selanjutnya.
Buku catatan Mathematica untuk mereproduksi hasilnya dapat ditemukan di
sini , dan versi pdf ada di
sini .
Apa itu dithering?
Dithering dapat digambarkan sebagai pengenalan kebisingan yang disengaja / disengaja ke dalam sinyal untuk mencegah kesalahan skala besar / resolusi rendah yang dihasilkan dari pengambilan sampel atau sub-pengambilan sampel.
Jika Anda pernah bekerja dengan:
- Sinyal audio
- Format gambar palet 90-an
mereka seharusnya telah memenuhi opsi dithering yang, berkat penambahan noise dan artefak resolusi rendah, "secara ajaib" meningkatkan kualitas suara atau gambar.
Namun, saya menemukan di Wikipedia fakta yang agak mengejutkan tentang bagaimana dithering pertama kali didefinisikan dan digunakan:
... Salah satu aplikasi dithering pertama muncul selama Perang Dunia Kedua. Pesawat pembom menggunakan komputer mekanik untuk menavigasi dan menghitung lintasan bom. Sangat mengherankan bahwa komputer-komputer ini (kotak-kotak berisi ratusan roda gigi dan roda gigi) bekerja lebih akurat ketika terbang di atas pesawat daripada di tanah. Insinyur menyadari bahwa getaran yang disebabkan oleh pesawat mengurangi kesalahan yang disebabkan oleh bagian bergerak yang lengket. Di bumi, mereka bergerak dengan gerakan tersentak-sentak, dan di udara gerakan mereka lebih berkelanjutan. Motor getaran kecil dibangun ke dalam komputer, dan getarannya disebut "dither", dari kata bahasa Inggris Tengah "didderen" yang berarti "gemetar". Hari ini, ketika Anda mengetuk meteran mekanik untuk meningkatkan akurasinya, Anda menerapkan gentar. Ketika digunakan dalam jumlah kecil, dither berhasil mengubah sistem digitalisasi menjadi analog, dalam arti kata yang baik.
- Ken Polmann, Prinsip Audio Digital
Ini adalah fakta sejarah yang menginspirasi dan menarik, dan saya mengerti mengapa ini memungkinkan kita untuk menghindari penyimpangan dalam perhitungan dan resonansi dengan secara acak memutus siklus umpan balik dari getaran mekanis.
Tapi cukup cerita, pertama mari kita lihat proses dithering dalam sinyal 1D, misalnya, dalam audio.
Pengambilan sampel dengan dithering sinyal konstan
Kita akan mulai dengan menganalisis sinyal paling membosankan di dunia - sinyal konstan. Jika Anda tahu sedikit tentang pemrosesan digital dari sinyal yang berkaitan dengan suara, Anda dapat mengatakan: tetapi Anda berjanji untuk mempertimbangkan audio, dan menurut definisi tidak ada komponen konstan dalam suara! (Selain itu, dalam perangkat lunak dan peralatan pemrosesan suara, yang disebut
offset DC sengaja dihilangkan.)
Ini benar, dan segera kita akan melihat fungsi yang lebih kompleks, tetapi kita akan mulai lagi.
Bayangkan kita melakukan pengambilan sampel 1-bit dari sinyal titik-mengambang yang dinormalisasi. Ini berarti bahwa kita hanya berurusan dengan nilai biner terbatas, 0 atau 1.
Jika sinyalnya
0,3 , maka pembulatan sederhana tanpa dithering akan menjadi fungsi yang paling membosankan - hanya
nol !
Kesalahan juga konstan dan sama dengan
0,3 , oleh karena itu, kesalahan rata-rata sama dengan
0,3 . Ini berarti bahwa kami memperkenalkan penyimpangan yang agak besar ke dalam sinyal dan benar-benar kehilangan informasi dari sinyal asli.
Kita dapat mencoba menggoyangkan sinyal ini dan melihat hasilnya.
Dalam hal ini, dithering (saat menggunakan fungsi pembulatan) hanya menerapkan white noise biasa (nilai acak untuk setiap elemen, yang menciptakan spektrum noise seragam) dan menambahkan interval acak (-0,5, 0,5) pada sinyal sebelum pengambilan sampel.
quantizedDitheredSignal =
Round [constantSignalValue + RandomReal [] - 0,5] & / @ Range [sampleCount];
Sulit untuk melihat sesuatu di sini, sekarang hasil diskritisasi hanyalah serangkaian acak dan nol. Dengan (diharapkan) banyak nol. Dalam dirinya sendiri, sinyal ini tidak terlalu menarik, tetapi
jadwal kesalahan dan kesalahan rata-rata cukup menarik.
Jadi, seperti yang kami harapkan, kesalahannya juga bervariasi, tetapi menakutkan bahwa kesalahannya kadang-kadang menjadi lebih besar (nilai absolut 0,7)! Yaitu, kesalahan maksimum sayangnya menjadi lebih buruk, tetapi masalah kebisingan rata-rata:
Mean [ditheredSignalError]
0,013
Jauh lebih baik daripada kesalahan awal 0,3. Dengan jumlah sampel yang sangat besar, kesalahan ini akan cenderung ke nol (hingga batas). Jadi, kesalahan komponen konstan menjadi jauh lebih sedikit, tetapi mari kita lihat grafik frekuensi semua kesalahan.
Grafik merah / burst = spektrum frekuensi kesalahan dengan tidak adanya dithering (sinyal konstan tanpa frekuensi). Hitam - dengan dithering menggunakan white noise.Semuanya menjadi lebih menarik! Ini menunjukkan kesimpulan pertama dari post-
dithering ini mendistribusikan kesalahan sampling / penyimpangan di antara beberapa frekuensi .
Di bagian selanjutnya, kita akan mengetahui bagaimana ini akan membantu kita.
Sensitivitas frekuensi dan penyaringan lulus rendah
Di atas, kami mengamati dithering dari sinyal konstan sampel:
- Dia meningkatkan kesalahan maksimum.
- Hampir memusatkan kesalahan rata-rata.
- Menambahkan white noise konstan (dengan cakupan spektrum penuh) ke spektrum frekuensi kesalahan, mengurangi kesalahan frekuensi rendah.
Dalam dirinya sendiri, itu tidak terlalu berguna bagi kita ... Namun, kami tidak mempertimbangkan diskritisasi dari fungsi / sinyal matematika sewenang-wenang. Kami mempertimbangkan sinyal yang akan dirasakan oleh manusia. Jelas, persepsi manusia terbatas. Berikut ini beberapa contohnya:
- Visi kami memiliki batas ketajaman. Banyak orang memiliki miopia dan tanpa kacamata mereka melihat gambar buram objek yang jauh.
- Kami menganggap skala rata-rata detail jauh lebih baik daripada frekuensi yang sangat tinggi atau sangat rendah (detail kecil dari gradien yang sangat halus bisa tidak terlihat).
- Pendengaran kami bekerja dalam rentang frekuensi tertentu (20 Hz - 20 kHz, tetapi memburuk dari waktu ke waktu) dan kami paling sensitif terhadap rentang menengah - 2 kHz - 5 kHz.
Oleh karena itu, kesalahan apa pun dalam frekuensi yang lebih dekat dengan rentang frekuensi yang dirasakan akan menjadi kurang terlihat.
Selain itu, perangkat media kami menjadi lebih baik dan lebih baik, memberikan
oversampling yang lebih besar. Sebagai contoh, dalam kasus TV dan monitor, kami memiliki teknologi "retina" dan layar 4K (yang tidak memungkinkan untuk melihat satu piksel), di bidang suara kami menggunakan format file dengan laju sampling setidaknya 44 kHz bahkan untuk speaker murah yang sering tidak dapat memutar lebih dari 5-10 kHz.
Ini berarti bahwa kami dapat memperkirakan tampilan sinyal yang dirasakan dengan melakukan penyaringan low-pass. Pada grafik, saya melakukan penyaringan low-pass (mengisi dengan nol di sebelah kiri adalah "naik"):
Merah - Sinyal non-sampel yang diinginkan. Hijau - sinyal diskrit dengan dithering. Biru adalah filter low-pass dari sinyal ini.Sinyal mulai terlihat lebih dekat dengan fungsi asli, non-sampel!
Sayangnya, kami mulai melihat frekuensi rendah yang sangat nyata dan tidak ada pada sinyal aslinya. Pada bagian ketiga dari seri, kami akan mencoba memperbaikinya dengan bantuan noise biru. Sementara itu, berikut ini tampilan grafik dengan fungsi pseudo noise yang memiliki konten pada frekuensi yang jauh lebih rendah:
Ini dimungkinkan karena urutan pseudo-acak kami memiliki spektrum frekuensi berikut:
Tapi mari kita selesaikan melihat fungsi sederhana dan konstan. Lihatlah gelombang sinus (jika Anda terbiasa dengan teorema Fourier, Anda tahu itu adalah blok penyusun sinyal periodik apa pun!).
Pengambilan Sampel Gelombang Sinus
Jika kita mengambil sampel sinusoid dengan sampling 1-bit, kita mendapatkan sinyal persegi panjang sederhana.
Sinyal persegi panjang cukup menarik karena mencakup frekuensi dasar dan
harmonik aneh .
Ini adalah properti menarik yang secara aktif digunakan dalam synthesizer subtraktif analog untuk membuat suara instrumen berongga / tembaga. Sintesis subtraktif membutuhkan suara yang rumit, kaya secara harmonis, dan menyaringnya, menghilangkan beberapa frekuensi (parameter filter bervariasi dari waktu ke waktu) untuk memberikan suara tersebut bentuk yang diinginkan.
Spektrum frekuensi gelombang persegi:
Namun dalam posting ini kami lebih tertarik pada kesalahan pengambilan sampel! Mari kita buat grafik kesalahan, serta spektrum frekuensi kesalahan:
Dalam hal ini, situasinya jauh lebih baik - kesalahan rata-rata mendekati nol! Sayangnya, kami masih memiliki banyak frekuensi rendah yang tidak diinginkan yang sangat dekat dengan frekuensi utama kami (pengganda ganjil dengan besarnya menurun). Fenomena ini disebut aliasing atau dithering noise - frekuensi muncul yang tidak ada dalam sinyal asli, dan mereka cukup besar.
Bahkan penyaringan low-pass tidak akan dapat secara signifikan membantu sinyal. Kesalahan memiliki banyak frekuensi rendah:
Discretized Sine Wave Low Pass FilteringAkurasi Gelombang Sinus SampelMari kita lihat bagaimana situasi berubah ketika dithering ditambahkan. Sekilas, hampir tidak ada peningkatan:
Namun, jika kita menganggap ini sebagai gambar, maka itu mulai terlihat lebih baik:
Perhatikan bahwa kesalahan pengambilan sampel sekali lagi didistribusikan di antara frekuensi yang berbeda:
Itu terlihat sangat menjanjikan! Terutama mengingat bahwa sekarang kita dapat mencoba memfilter:
Ini adalah gelombang sinus yang agak terdistorsi, tetapi terlihat jauh lebih dekat dengan aslinya daripada versi tanpa dithering, dengan pengecualian pergeseran fasa yang diperkenalkan oleh filter asimetris (saya tidak akan menjelaskan ini di sini; saya hanya bisa mengatakan bahwa masalahnya dapat diperbaiki dengan menerapkan filter simetris):
Merah adalah gelombang sinus asli. Hijau - sinyal low-pass filtered tanpa dithering. Biru - sinyal low-pass filtered dengan dithering.Grafik kedua kesalahan secara numerik mengkonfirmasi bahwa kesalahannya jauh lebih kecil:
Merah - kesalahan dari sinyal low-pass filtered tanpa dithering. Biru - kesalahan dari sinyal low-pass filter dengan dithering.Terakhir, mari kita lihat sebentar sinyal dengan fungsi dithering yang lebih baik yang hanya berisi frekuensi tinggi:
Gambar atas adalah fungsi white noise. Gambar bawah adalah fungsi yang mengandung frekuensi lebih tinggi.Sebuah versi dengan penyaringan low-pass, dithering dan fungsi yang ditingkatkan - hasil yang hampir sempurna, jika Anda tidak memperhitungkan pergeseran fase yang disebabkan oleh filter!Dan akhirnya, perbandingan ketiga spektrum kesalahan:
Spektrum kesalahan sampling merah tanpa dithering. Hitam - spektrum kesalahan pengambilan sampel dengan derau white noise. Biru - spektrum kesalahan pengambilan sampel dengan dithering dengan frekuensi lebih tinggi.Ringkasan
Ini adalah bagian pertama dari seri berakhir. Temuan kunci:
- Dithering mendistribusikan kesalahan sampling / penyimpangan di antara sejumlah frekuensi, dan ini tergantung pada fungsi dithering; mereka tidak fokus pada frekuensi rendah.
- Persepsi seseorang terhadap sinyal (suara, penglihatan) bekerja paling baik dalam rentang frekuensi yang sangat spesifik. Sinyal sering dilampiri pada batas-batas spektrum perseptual, di mana persepsi tidak sensitif. Misalnya, kecepatan pengambilan sampel audio standar memungkinkan Anda mereproduksi sinyal yang tidak dapat didengar oleh kebanyakan orang dewasa sama sekali. Karena paragraf sebelumnya, ini membuat gagasan menggunakan dithering dan menggeser kesalahan ke dalam rentang frekuensi ini sangat menarik.
- Fungsi noise yang berbeda menciptakan spektrum kesalahan yang berbeda yang dapat digunakan, mengetahui spektrum kesalahan mana yang paling diinginkan.
Pada bagian selanjutnya, kita akan melihat berbagai fungsi dithering - yang saya gunakan dalam artikel ini (seri rasio emas) dan noise biru.