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:
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)=−b1z−1−b2z−2−b3z−3−…
z−1
H(z)=1−HFilter(z)=1+b1z−1+b2z−2+b3z−3+….
…,−b3,−b2,−b11,b1,b2,b3,…b0=1horzcat
dalam 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:
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:
H(z)=11+a1z−1+a2z−2+a3z−3+…
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
,, cheby2
dan ellip
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:
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 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.
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');
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.