Saya ingin melakukan noise membentuk dalam aplikasi 100kHz, 16 bit, sehingga dapat mengubah semua kebisingan kuantisasi ke band 25khz-50kHz, dengan kebisingan minimal di band DC-25kHz.
Saya mengatur Mathematica untuk membuat 31-sampel kernel filter kesalahan melalui penguatan pembelajaran yang bekerja dengan baik: Setelah sedikit belajar, saya bisa mendapatkan ~ 16dB peningkatan noise frekuensi tinggi untuk jumlah pengurangan yang sama dalam pita frekuensi rendah (yang garis pusat adalah tingkat kebisingan gentar yang tidak berbentuk). Ini sejalan dengan teorema pembentukan suara "Gerzon-Craven".
Sekarang untuk masalah saya:
Saya tidak dapat mengatur untuk membentuk suara bahkan lebih setelah belajar yang luas, meskipun teorema Gerzon-Craven tidak melarangnya. Misalnya, harus dimungkinkan untuk mencapai pengurangan 40 dB pada pita rendah dan peningkatan 40 dB pada pita tinggi.
Jadi, apakah ada batasan mendasar lain yang saya temui?
Saya mencoba melihat ke teorema noise / sampling / informasi Shannon tetapi setelah mengutak-atik itu untuk sementara waktu, saya hanya berhasil mendapatkan batas tunggal darinya: teorema Gerzon-Craven, yang tampaknya merupakan hasil langsung dari teorema Shannon.
Bantuan apa pun dihargai.
Sunting: info lebih lanjut
Pertama, filter kernel yang menghasilkan noise noise di atas, Perhatikan bahwa sampel terbaru ada di sisi kanan . Nilai numerik dari BarChart dibulatkan menjadi 0,01: {-0,16, 0,51, -0,74, 0,52, -0,04, -0,25, 0,22, -0,11, -0,02, -0,02, 0,31, -0,56, 0,45, -0,13, 0,04, -0,14, 0.12, -0.06, 0.19, -0.22, -0.15, 0.4, 0.01, -0.41, -0.1, 0.84, -0.42, -0.81, 0.91, 0.75, -2.37, 2.29} (Tidak persis bar char tetapi menghasilkan kurva yang serupa )
Catatan lain tentang implementasi umpan balik kesalahan:
Saya mencoba dua implementasi berbeda dari umpan balik kesalahan. Pertama saya membandingkan sampel keluaran bulat dengan nilai yang diinginkan dan menggunakan penyimpangan ini sebagai kesalahan. Kedua saya membandingkan sampel output bulat dengan (input + umpan balik kesalahan) Meskipun kedua metode menghasilkan kernel yang sangat berbeda, keduanya tampaknya mendatar dengan intensitas pembentukan noise yang sama. Data yang diposting di sini menggunakan implementasi kedua.
Berikut adalah kode yang digunakan untuk menghitung sampel gelombang digital. Langkah adalah langkah untuk pembulatan. wave adalah bentuk gelombang yang tidak digigit (biasanya hanya nol ketika tidak ada sinyal yang diterapkan).
TestWave[kernel_?VectorQ] :=
Module[{k = kernel, nf, dith, signals, twave, deltas},
nf = Length@k;
dith = RandomVariate[TriangularDistribution[{-1, 1}*step], l];
signals = deltas = Table[0, {l}];
twave = wave;
Do[
twave[[i]] -= k.PadLeft[deltas[[;; i - 1]], nf];
signals[[i]] = Round[twave[[i]] + dith[[i]], step];
deltas[[i]] = signals[[i]] - twave[[i]];
, {i, l}];
signals
]
Metode penguatan:
"Skor" dihitung dengan melihat spektrum kekuatan noise. Tujuannya adalah untuk meminimalkan daya derau di pita DC-25kHz. Saya tidak menghukum noise pada pita frekuensi tinggi, jadi noise tinggi yang sewenang-wenang di sana tidak akan mengurangi skor. Saya memperkenalkan noise dalam bobot kernel untuk dipelajari. Mungkin, karena itu, saya berada di minimum lokal (sangat luas dan dalam), tapi saya menganggap ini sangat tidak mungkin.
Perbandingan dengan desain filter standar:
Mathematica memungkinkan untuk menghasilkan filter secara iteratif. Ini dapat memiliki kontras yang jauh lebih baik daripada 36 dB ketika respons frekuensi mereka diplot; hingga 80-100 dB. Nilai numerik: {0,024, -0.061, -0.048, 0.38, -0.386, -0.808, 2.09, -0.331, -4.796, 6.142, 3.918, -17.773, 11.245, 30.613, -87.072, 113.676, -87.072, 30.613, 11.245 , -17.773, 3.918, 6.142, -4.796, -0.331, 2.09, -0.808, -0.36, 0.38, -0.048, -0.061, 0.024}
Namun, ketika menerapkan mereka dalam pembentukan noise yang sebenarnya, mereka (a) dijepit dengan kontras ~ 40dB yang sama, (b) berkinerja lebih buruk daripada filter yang dipelajari dengan benar-benar tidak ada pelemahan noise.
Jawaban:
Dasar dithering tanpa noise
Kuantisasi dithered dasar tanpa noise membentuk karya seperti ini:
Gambar 1. Diagram sistem kuantisasi dithered dasar. Noise adalah zero-mean triangular dither dengan nilai absolut maksimum 1. Pembulatan adalah bilangan bulat terdekat. Kesalahan residual adalah perbedaan antara output dan input, dan dihitung hanya untuk analisis.
Dengan kesalahan residu aditif independen, kami akan memiliki model sistem yang lebih sederhana:
Gambar 2. Perkiraan kuantisasi dasar dithered. Kesalahan residual adalah white noise.
Dalam model perkiraan output hanyalah input plus kesalahan residual white noise independen.
Dithering dengan noise forming
Saya tidak bisa membaca Mathematica dengan baik sehingga alih-alih sistem Anda, saya akan menganalisis sistem dari Lipshitz et al. " Kebisingan suara minimum yang dapat didengar " J. Audio Eng. Soc., Vol.39, No.11, November 1991:
Gambar 3. Lipshitz et al. 1991 diagram sistem (diadaptasi dari Gambar 1). Filter (dicetak miring dalam teks) termasuk di dalamnya penundaan satu sampel sehingga dapat digunakan sebagai filter umpan balik kesalahan. Kebisingan adalah gentar segitiga.
Jika kesalahan residual independen dari nilai sinyal A dan saat ini, kami memiliki sistem yang lebih sederhana:
Gambar 4. Model perkiraan Lipshitz et al. Sistem 1991. Filter sama seperti pada Gambar. 3 dan termasuk di dalamnya penundaan satu sampel. Itu tidak lagi digunakan sebagai filter umpan balik. Kesalahan residual adalah white noise.
Dalam jawaban ini saya akan bekerja dengan model perkiraan yang lebih mudah dianalisis (Gbr. 4). Dalam Lipshitz et al. Sistem 1991, Filter memiliki bentuk filter generik infinite impulse response (IIR) yang mencakup filter IIR dan hingga respon impuls terbatas (FIR). Berikut ini kami akan menganggap bahwa Filter adalah filter FIR, karena saya percaya berdasarkan percobaan saya dengan koefisien Anda bahwa itulah yang Anda miliki di sistem Anda. Fungsi transfer Filter adalah:
horzcat
dalam skrip Oktaf di bawah), dan akhirnya daftar dibalikflip
:Script memplot respons frekuensi magnitudo dan lokasi nol dari filter pembentuk derau penuh:
Gambar 5. Respons frekuensi magnitudo dari filter pembentuk noise penuh.
Saya pikir masalah menemukan koefisien filter dapat dirumuskan ulang sebagai masalah merancang filter fase minimum dengan koefisien terkemuka 1. Jika ada keterbatasan yang melekat pada respons frekuensi filter tersebut, maka batasan ini ditransfer ke batasan yang setara dalam membentuk noise yang menggunakan filter tersebut.
Konversi dari desain semua kutub ke FIR fase minimum
Prosedur untuk desain yang berbeda tetapi dalam banyak hal filter yang setara dijelaskan dalam Stojanović et al. , "Desain Filter Digital Rekursif All-Pole Berdasarkan Polinomial Ultraspherical", Radioengineering, vol 23, no 3, September 2014. Mereka menghitung koefisien penyebut dari fungsi transfer filter low-pass semua kutub IIR. Mereka selalu memiliki koefisien penyebut terkemuka 1 dan memiliki semua kutub di dalam lingkaran unit, persyaratan filter IIR yang stabil. Jika koefisien tersebut digunakan sebagai koefisien filter pembentuk noise FIR fase minimum, mereka akan memberikan respons frekuensi high-pass terbalik dibandingkan dengan filter low-pass IIR (koefisien transfer fungsi penyebut menjadi koefisien pembilang). Dalam notasi Anda, satu set koefisien dari artikel tersebut adalah
{-0.0076120, 0.0960380, -0.5454670, 1.8298040, -3.9884220, 5.8308660, -5.6495140, 3.3816780}
, yang dapat diuji untuk aplikasi pembentukan suara meskipun tidak persis dengan spesifikasi:Gambar 7. Respon frekuensi magnitudo filter FIR menggunakan koefisien dari Stojanović et al. 2014
Gambar 8. Plot nol-nol dari filter FIR menggunakan koefisien dari Stojanović et al. 2014
Fungsi transfer semua kutub adalah:
Untuk mendesain filter semua tiang dan mengonversinya menjadi filter FIR fase minimum, Anda tidak akan dapat menggunakan metode desain filter IIR yang dimulai dari filter prototipe analog dan memetakan kutub dan nol ke dalam domain digital menggunakan transformasi bilinear . Itu termasuk
cheby1
,,cheby2
danellip
dalam SciPy Octave dan Python. Metode-metode ini akan memberikan nol dari asal-usul bidang-z sehingga filter tidak akan menjadi tipe all-pole yang diperlukan.Jawab pertanyaan teoretis
Jika Anda tidak peduli berapa banyak suara akan ada pada frekuensi di atas seperempat dari frekuensi pengambilan sampel, maka Lipshitz et al. 1991 menjawab pertanyaan Anda secara langsung:
Gambar 1. menunjukkan pembentuk noise dengan struktur filter IIR generik dengan kedua kutub dan nol, sangat berbeda dengan struktur FIR yang Anda miliki saat ini, tetapi apa yang mereka katakan berlaku juga untuk itu, karena respon impuls filter FIR dapat menjadi dibuat sewenang-wenang dekat dengan respons impuls dari setiap filter IIR stabil yang diberikan.
Skrip oktaf untuk desain filter
dip
Ini dimulai dengan jendela Dolph-Chebyshev sebagai koefisien, menggabungkannya dengan dirinya sendiri untuk menggandakan nol fungsi transfer, menambah ketukan tengah angka yang "mengangkat" respons frekuensi (menganggap keran tengah berada pada nol waktu) sehingga bahwa di mana-mana positif, menemukan nol, menghilangkan nol yang berada di luar lingkaran satuan, mengubah nol kembali menjadi koefisien (koefisien terkemuka dari
poly
selalu 1), dan membalik tanda koefisien setiap detik untuk membuat filter lulus tinggi . Hasil dari (versi yang lebih lama tetapi hampir setara) skrip terlihat menjanjikan:Gambar 9. Respons frekuensi magnitudo filter dari (versi yang lebih lama tetapi hampir setara) dari skrip di atas.
Gambar 10. Plot-nol plot filter dari (versi yang lebih tua tapi hampir setara) dari skrip di atas.
Koefisien dari (versi lama tapi hampir setara) script di atas dalam notasi Anda:
{0.357662, -2.588396, 9.931419, -26.205448, 52.450624, -83.531276, 108.508775, -116.272581, 102.875781, -74.473956, 43.140431, -19.131434, 5.923468}
. Angka-angkanya besar yang dapat menyebabkan masalah numerik.Implementasi oktaf pembentukan kebisingan
Akhirnya, saya melakukan implementasi saya sendiri dalam membentuk noise di Octave dan tidak mendapatkan masalah seperti Anda. Berdasarkan diskusi kami dalam komentar, saya pikir batasan dalam implementasi Anda adalah bahwa spektrum kebisingan dievaluasi menggunakan jendela persegi panjang alias "tidak ada jendela ", yang menumpahkan spektrum frekuensi tinggi ke frekuensi rendah.
Gambar 11. Analisis spektral noise kuantisasi dari implementasi Octave di atas untuk noise membentuk sinyal input nol konstan. Sumbu horizontal: Frekuensi yang dinormalisasi. Hitam: tidak ada noise membentuk (
c = [1];
), merah: filter asli Anda, biru: filter dari bagian "Skrip oktaf untuk desain filter".Gambar 12. Output domain waktu dari implementasi Octave di atas dari noise membentuk untuk sinyal input nol konstan. Sumbu horizontal: jumlah sampel, sumbu vertikal: nilai sampel. Merah: filter asli Anda, biru: filter dari bagian "Skrip oktaf untuk desain filter".
Filter pembentuk noise yang lebih ekstrim (biru) menghasilkan nilai sampel keluaran yang sangat besar, bahkan untuk input nol.
sumber