membatasi kemungkinan pembentukan noise?

9

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

menghasilkan spektrum noise setelah beberapa pembelajaran

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 )

Filter kernel, contoh terbaru tentang KANAN.

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}

masukkan deskripsi gambar di sini

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.

biru: filter yang dipelajari, kuning: filter equiripple out-of-box, TIDAK bergeser ... itu benar-benar lebih buruk

tobalt
sumber
2
+1, pertanyaan yang sangat menarik. Sudahkah Anda mencoba meningkatkan urutan filter di atas 31 ketukan? Penindasan 40dB terdengar agak tinggi untuk FIR 31 ketuk.
A_A
1
@ Olli, saya tidak percaya saya mengerti sepenuhnya. Saya dapat memposting kernel filter jika itu yang Anda tertarik. Dengan kata-kata tumpul, ada bobot osilasi yang memaksa kesalahan ke alternatif -> menggesernya ke frekuensi tinggi.
tobalt
2
@tobalt dari desain filter "klasik", ini adalah hasil yang diharapkan bahwa filter yang lebih lama lebih curam dan / atau memiliki lebih banyak pelemahan dalam stop band dan / atau memiliki lebih sedikit riak pada band pass. Sekarang, tebakan saya adalah bahwa metode penguatan Anda lebih menghargai kecuraman daripada redaman setelah beberapa titik; apa metode yang Anda gunakan untuk memperkuat?
Marcus Müller
1
Anda mungkin ingin melihat bagian Desain Filter dari Mathematica. Mungkin Anda dapat dengan mudah menentukan spesifikasi filter Anda dan menggunakan salah satu teknik yang ada untuk mengembalikan filter yang memuaskan mereka.
A_A
1
Maka itu jelas (opsional opsional) desain filter. Dapatkan spesifikasi filter Anda (persis seperti yang Anda pasang di sini) dan cobalah untuk membuat filter melalui fungsi ini (yang paling sederhana dari jenisnya) dan lihat apa yang muncul. Akan menyenangkan untuk melihat koefisien yang muncul dengan fungsi versus yang pembelajaran pembelajaran kembali datang dengan. Juga, perhatikan jenis urutan filter yang muncul, saya kira itu akan lebih tinggi dari 31. Apakah harus "adaptif" terhadap sinyal?
A_A

Jawaban:

12

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.

11214

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:

Sistem Lipshitz et al 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:

HFilter(z)=b1z1b2z2b3z3

z1

H(z)=1HFilter(z)=1+b1z1+b2z2+b3z3+.

,b3,b2,b11,b1,b2,b3,b0=1horzcatdalam skrip Oktaf di bawah), dan akhirnya daftar dibalik flip:

pkg load signal
b = [-0.16, 0.51, -0.74, 0.52, -0.04, -0.25, 0.22, -0.11, -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];
c = flip(horzcat(-b, 1));
freqz(c)
zplane(c)

Script memplot respons frekuensi magnitudo dan lokasi nol dari filter pembentuk derau penuh:

Plot freqz
Gambar 5. Respons frekuensi magnitudo dari filter pembentuk noise penuh.

Plot zplane
×

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:

Respon frekuensi
Gambar 7. Respon frekuensi magnitudo filter FIR menggunakan koefisien dari Stojanović et al. 2014

Plot-nol plot
Gambar 8. Plot nol-nol dari filter FIR menggunakan koefisien dari Stojanović et al. 2014

Fungsi transfer semua kutub adalah:

H(z)=11+a1z1+a2z2+a3z3+

ab

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,, cheby2dan ellipdalam 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:

Untuk fungsi pembobotan seperti itu, yang pergi ke nol di atas bagian pita, tidak ada batas teoretis untuk reduksi daya derau yang diperoleh dari rangkaian Gambar. 1. Ini akan menjadi kasus jika, misalnya, seseorang mengasumsikan bahwa telinga memiliki sensitivitas nol antara, katakanlah, 20 kHz dan Frekuensi Nyquist, dan memilih fungsi pembobotan untuk mencerminkan fakta ini.

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

ν=0dip

pkg load signal
N = 14; #number of taps including leading tap with coefficient 1
att = 97.5; #dB attenuation of Dolph-Chebyshev window, must be positive
dip = 2; #spectrum lift-up multiplier, must be above 1
c = chebwin(N, att);
c = conv(c, c);
c /= sum(c);
c(N) += dip*10^(-att/10);
r = roots(c);
j = (abs(r(:)) <= 1);
r = r(j);
c = real(poly(r));
c .*= (-1).^(0:(N-1)); #if this complains, then root finding has probably failed
freqz(c)
zplane(c)
printf('%f, ', flip(-c(2:end))), printf('\n'); #tobalt's format

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 polyselalu 1), dan membalik tanda koefisien setiap detik untuk membuat filter lulus tinggi . Hasil dari (versi yang lebih lama tetapi hampir setara) skrip terlihat menjanjikan:

Respons frekuensi sangat besar
Gambar 9. Respons frekuensi magnitudo filter dari (versi yang lebih lama tetapi hampir setara) dari skrip di atas.

Plot-nol plot
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.

pkg load signal
N = length(c);
M = 16384; #signal length
input = zeros(M, 1);#sin(0.01*(1:M))*127;
er = zeros(M, 1);
output = zeros(M, 1);
for i = 1:M
  A = input(i) + er(i);
  output(i) = round(A + rand() - rand());
  for j = 2:N
    if (i + j - 1 <= M)
      er(i + j - 1) += (output(i) - A)*c(j);
    endif
  endfor
endfor
pwelch(output, max(nuttallwin(1024), 0), 'semilogy');

masukkan deskripsi gambar di sini
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".

Domain waktu pengujian alternatif
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.

Olli Niemitalo
sumber
1
@MattL. Awalnya saya berpikir salah bahwa tobalt memiliki filter semua tiang. Saya menulis ulang jawaban saya ketika saya menyadari itu adalah filter FIR dengan koefisien pertama 1. Juga Gerzon-Craven dilaporkan mengatakan bahwa filter perlu fase minimum agar menjadi optimal, dan koefisien optimal tobalt juga memberikan filter fase minimum. Persyaratan tersebut setara dengan apa yang dimiliki koefisien semua-tiang filter IIR jadi saya sarankan meminjam metode desain dari sana. IIR standar akan menjadi opsi juga.
Olli Niemitalo
1
Saya telah mengisolasi kesalahan: Implementasi saya menghasilkan bentuk gelombang yang sama (dalam waktu) seperti milik Anda. Namun fungsi Abs [Fourier [wave]] tampaknya mengalami beberapa internal overflow / underflow, karena spektrum yang dikembalikan terlihat berbeda (lantai lebih tinggi)
tobalt
1
@ Olli Niemitalo Ok sepertinya FFT dalam oktaf menggunakan jendela otomatis mungkin? Setelah menerapkan jendela Hann ke bentuk gelombang saya bisa mendapatkan FFT "benar". Saya akan secara singkat menguji integritas dari pendekatan ini dan pada akhirnya terus belajar dan memposting hasilnya. Terima kasih atas semua upaya Anda. Saya telah menandai posting Anda sebagai jawaban.
tobalt
1
@ robertbristow-johnson Saya pikir semuanya konsisten seperti apa adanya. Saya menghapus persamaan di mana H (z) adalah untuk filter rekursif dengan 1 sebagai pembilangnya. Tapi ini filter FIR dalam kasus tobalt. Saya menduga Anda mungkin berpikir bahwa itu menjadi filter rekursif karena ada loop umpan balik. Tetapi kuantisasi ragu-ragu adalah dalam lingkaran melakukan hal memotong jalur dari output filter ke residual.
Olli Niemitalo
1
ab