olası gürültü şekillendirme sınırı?


9

DC-25kHz bandında minimum gürültü ile tüm kuantizasyon gürültüsünü 25khz-50kHz bandına kaydırmak için 100kHz, 16 bitlik bir uygulamada gürültü şekillendirme yapmak istiyorum.

Ben iyi çalışır takviye öğrenme yoluyla 31 örnek hata filtresi çekirdeği oluşturmak için mathematica kurdum: Biraz öğrendikten sonra, düşük frekans bandında yaklaşık aynı miktarda azalma için yaklaşık ~ 16dB yüksek frekanslı gürültü artışı elde edebilirim ( orta hat, şekilsiz renk taklidi gürültü seviyesidir). Bu, "Gerzon-Craven" gürültü şekillendirme teoremi ile uyumludur.

bazı öğrenme sonrasında ortaya çıkan gürültü spektrumu

Şimdi benim sorunuma:

Gerzon-Craven teoremi onu yasaklamasa da, gürültüyü kapsamlı öğrenimden sonra bile daha fazla şekillendiremiyorum. Örneğin , düşük bantta 40 dB azalma ve yüksek bantta 40 dB artış elde etmek mümkün olmalıdır .

Peki, karşılaştığım başka bir temel sınır var mı?

Shannon gürültü / örnekleme / bilgi teoremlerine bakmaya çalıştım, ancak bir süre uğraştıktan sonra, sadece tek bir limit elde etmeyi başardım: Shannon teoreminin doğrudan bir sonucu gibi görünen Gerzon-Craven teoremi.

Herhangi bir yardım takdir.

EDIT: daha fazla bilgi

İlk önce, yukarıdaki gürültü şekillendirmesini üreten filtre çekirdeği, En son örneğin sağ tarafta olduğunu unutmayın. BarChart'ın .01'e yuvarlanan sayısal değerleri: {-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} (Tam olarak çubuk karakter değil, benzer eğri üretir )

Filtre çekirdeği, SAĞ'daki en son örnek.

Hata geri bildirimi uygulaması hakkında başka bir not:

Hata geri bildiriminin iki farklı uygulamasını denedim. Önce yuvarlak çıktı örneğini istenen değerle karşılaştırdım ve bu sapmayı hata olarak kullandım. İkincisi, yuvarlatılmış çıktı örneğini (giriş + hata geri bildirimi) ile karşılaştırdım. Her iki yöntem de oldukça farklı çekirdekler üretmesine rağmen, her ikisi de yaklaşık aynı gürültü şekillendirme yoğunluğunda dengeleniyor gibi görünüyor. Burada yayınlanan veriler ikinci uygulamayı kullanır.

Sayısallaştırılmış dalga örneklerini hesaplamak için kullanılan kod. adım yuvarlama için adımdır. dalga, belirsizleştirilmiş dalga formudur (genellikle sinyal uygulanmadığında sıfırdır).

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
  ]

Takviye yöntemi:

"Skor" gürültü güç spektrumuna bakarak hesaplanır. Amaç DC-25kHz bandındaki gürültü gücünü en aza indirmektir. Ben am değil bu yüzden keyfi olarak yüksek gürültü giderek zay skor olmaz, yüksek frekans bandında gürültü cezalandırmak. Öğrenmek için çekirdek ağırlıklarına ses katıyorum. Belki de, bu nedenle, (çok geniş ve derin) bir yerel minimumdayım, ancak bunu son derece olası görmüyorum.

Standart filtre tasarımıyla karşılaştırma:

Mathematica, yinelemeli olarak filtreler oluşturmanıza izin verir. Frekans tepkileri çizildiğinde bunlar 36 dB'den çok daha iyi kontrastlara sahip olabilir; 80-100 dB'ye kadar. Sayısal değerler: {0.024, -0.061, -0.048, 0.38, -0.36, -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}

resim açıklamasını buraya girin

Bununla birlikte, gerçek gürültü şekillendirmedekileri uygularken, (a) aynı ~ 40dB kontrastına kenetlenirler, (b) gerçekte hiçbir gürültü zayıflaması yapmadan öğrenilen filtreden daha kötü performans gösterirler.

mavi: öğrenilen filtre, sarı: kutudan çıktığı eşzamanlı filtre, kaydırılmamış ... gerçekten daha kötü


2
+1, çok ilginç bir soru. Filtrenin sırasını 31 dokunmanın üzerine çıkarmayı denediniz mi? 40dB bastırma 31 kademe FIR için biraz yüksek geliyor.
A_A

1
@Olli, tamamen anladığımı sanmıyorum. İlgilendiğiniz şey ise filtre çekirdeğini gönderebilirim. Künt kelimelerde, hatayı alternatife zorlayan salınım ağırlıkları vardır -> onu yüksek frekanslara kaydırır.
tobalt

2
"Klasik" filtre tasarımından @tobalt, daha uzun filtrelerin daha dik ve / veya durdurma bandında daha fazla zayıflamaya ve / veya geçiş bandında daha az dalgalanmaya sahip olması beklenen bir sonuçtur. Şimdi, benim tahminim, takviye yönteminizin dikliği bir noktadan sonra zayıflatmadan daha fazla ödüllendirmesidir; Güçlendirmek için kullandığınız yöntem nedir?
Marcus Müller

1
Mathematica'nın Filtre Tasarımı bölümüne göz atmak isteyebilirsiniz . Belki de filtrenizin özelliklerini tanımlayabilir ve bunları karşılayan bir filtre döndürmek için mevcut tekniklerden birini kullanabilirsiniz.
A_A

1
Bu kesinlikle (isteğe bağlı olarak yinelemeli) filtre tasarımıdır. Filtre özelliklerinizi alın (tam olarak burada yayınladığınız gibi) ve bu işlev (türünün en basiti) ile bir filtre oluşturmaya çalışın ve ne ile geldiğini görün. Yeniden bilgilendirme öğreniminin geri döndüğü değerlere karşı işlevin katsayılarını görmek güzel olurdu. Ayrıca, bir tür filtre siparişi geliyor, 31'den yüksek olacağını tahmin ediyorum. Bu arada sinyale "uyarlanabilir" olması gerekir mi?
A_A

Yanıtlar:


12

Gürültü şekillendirme olmadan temel renk taklidi

Gürültü şekillendirme olmadan temel renk taklidi ölçümü şu şekilde çalışır:


Şekil 1. Temel renklendirilmiş nicemleme sistemi diyagramı. Gürültü, maksimum mutlak değeri 1 olan sıfır ortalama üçgen renk taklididir. Yuvarlama en yakın tam sayıdır. Kalan hata çıktı ve girdi arasındaki farktır ve sadece analiz için hesaplanır.

Üçgen renk taklidi, ortaya çıkan artık hatanın varyansını 3 kat arttırır ( 112 için 14) ancak net nicemleme hatasının ortalamasını ve varyansını giriş sinyalinin değerinden ayırır. Bu, net hata sinyalinin girişle ilişkisiz olduğu, ancak daha yüksek anların ayrıştırılmadığı anlamına gelir, bu yüzden tamamen bağımsız rastgele bir hata değildir, ancak hiç kimse insanların net hata sinyalindeki daha yüksek anlara herhangi bir bağımlılığı duyabileceğini belirlemedi. bir ses uygulamasında giriş sinyali.

Bağımsız katkı maddesi kalıntı hatası ile sistemin daha basit bir modeli olurdu:


Şekil 2. Temel renk taklidi miktarının yaklaştırılması. Kalan hata beyaz gürültüdür.

Yaklaşık modelde, çıktı basitçe giriş artı bağımsız beyaz gürültü kalıntı hatasıdır.

Gürültü şekillendirme ile titreme

Mathematica'yı çok iyi okuyamıyorum, bu yüzden sisteminiz yerine sistemi Lipshitz ve ark. "En az duyulabilir gürültü şekillendirme " J. Audio Eng. Soc., Cilt 39, Sayı 11, Kasım 1991:

Lipshitz ve arkadaşları 1991 sistemi
Şekil 3. Lipshitz ve diğ. 1991 sistem şeması (Şekil 1'den uyarlanmıştır). Filtre (metinde italik olarak yazılmıştır), içinde bir hata geri besleme filtresi olarak kullanılabilmesi için bir örnek gecikme içerir. Gürültü üçgen renk taklididir.

Kalan hata A sinyalinin mevcut ve geçmiş değerlerinden bağımsızsa, daha basit bir sistemimiz var:


Şekil 4. Lipshitz ve ark. 1991 sistemi. Filtre, Şekil 3'tekiyle aynıdır ve içine bir örnek gecikme içerir. Artık geri bildirim filtresi olarak kullanılmamaktadır. Kalan hata beyaz gürültüdür.

Bu cevapta daha kolay analiz edilen yaklaşık model ile çalışacağım (Şekil 4). Orijinal Lipshitz ve ark. 1991 sistemi, Filter , hem IIR hem de sonlu dürtü yanıtı (FIR) filtrelerini kapsayan genel bir sonsuz dürtü yanıtı (IIR) filtre formuna sahiptir. Biz varsayar aşağıdaki Filtre O sisteminizde ne var o senin katsayıları ile benim deneylere dayanarak inanmak gibi bir FIR filtresi. Filtrenin transfer fonksiyonu :

'HFbenlter(z)=-b1z-1-b2z-2-b3z-3-...

Faktör z-1bir örnek gecikmeyi temsil eder. Yaklaşık modelde, artık hatadan çıkış için doğrudan bir toplama yolu vardır. Bu, filtrenin reddedilen çıktısı ile toplanır ve tam gürültü şekillendirme filtresi transfer işlevini oluşturur:

'H(z)=1-'HFbenlter(z)=1+b1z-1+b2z-2+b3z-3+....

Sırayla listelediğiniz Filtre katsayılarınızdan gitmek için...,-b3,-b2,-b1, tam gürültü şekillendirme filtresi transfer fonksiyonu polinom katsayılarına 1,b1,b2,b3,..., katsayıların işareti , sistem diyagramında Filtre çıktısının olumsuzlanmasını ve katsayıyı hesaba katacak şekilde değiştirilir.b0=1sonuna eklenir ( horzcataşağıdaki Oktav komut dosyasında) ve son olarak liste tersine çevrilir (tarafından 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)

Komut dosyası, tam gürültü şekillendirme filtresinin büyüklük frekans yanıtını ve sıfır konumlarını çizer:

Freqz grafiği
Şekil 5. Tam gürültü şekillendirme filtresinin büyüklük frekans yanıtı.

Zplane arsa
Şekil 6. Kutupların Z-düzlemi çizimi (x) ve sıfırlar () seçin. Tüm sıfırlar birim çemberin içindedir, bu nedenle tam gürültü şekillendirme filtresi minimum fazdır.

Filtre katsayılarını bulma probleminin, önde gelen katsayısı 1 olan minimum fazlı bir filtre tasarlama problemi olarak yeniden biçimlendirilebileceğini düşünüyorum. Bu tür filtrelerin frekans tepkisinde doğal sınırlamalar varsa, bu sınırlamalar eşdeğer sınırlamalara aktarılır bu tür filtreleri kullanan gürültü şekillendirme.

Tüm kutuplu tasarımdan minimum faz FIR'ya dönüşüm

Farklı fakat birçok yönden eşdeğer filtrelerin tasarım prosedürü Stojanović et al. , "Ultrasonik Polinomlara Dayalı All-Pole Özyinelemeli Dijital Filtreler Tasarımı", Radioengineering, cilt 23, no 3, Eylül 2014. Bir IIR tüm kutuplu alçak geçiren filtrenin transfer fonksiyonunun payda katsayılarını hesaplarlar. Bunlar her zaman önde gelen payda katsayısına 1 sahiptir ve birim dairenin içindeki tüm kutuplara sahiptir, bu da kararlı IIR filtreleri gerektirir. Bu katsayılar minimum faz FIR gürültü şekillendirme filtresinin katsayıları olarak kullanılırsa, düşük geçişli IIR filtresine (aktarım fonksiyonu payda katsayıları pay katsayıları haline gelir) kıyasla ters yüksek geçiş frekansı yanıtı verecektir. Gösteriminizde {-0.0076120, 0.0960380, -0.5454670, 1.8298040, -3.9884220, 5.8308660, -5.6495140, 3.3816780}, tam olarak şartnameye uygun olmasa da, gürültü şekillendirme uygulaması için test edilebilen bu makaleden bir katsayı seti :

Frekans tepkisi
Şekil 7. Stojanović ve ark.'nın katsayıları kullanılarak FIR filtresinin büyüklük frekans yanıtı. 2014.

Pole-zero grafiği
Şekil 8. Stojanović ve ark.nın katsayıları kullanılarak FIR filtresinin kutup sıfır grafiği. 2014.

Tüm kutuplu transfer fonksiyonu:

'H(z)=11+bir1z-1+bir2z-2+bir3z-3+...

Böylece, kararlı bir tüm kutuplu IIR alçak geçiren filtre tasarlayabilir ve bir katsayıları b önde gelen katsayısı 1 olan minimum faz yüksek geçişli FIR filtresi elde etmek için katsayılar.

Tüm kutuplu bir filtre tasarlamak ve bunu minimum fazlı FIR filtresine dönüştürmek için, analog prototip filtreden başlayan IIR filtre tasarım yöntemlerini kullanamayacak ve bilinear dönüşümü kullanarak kutupları ve sıfırları dijital etki alanına eşleyemeyeceksiniz. . Yani içerir cheby1, cheby2ve ellipOctave ve Python'un SciPy içinde. Bu yöntemler sıfırları z-düzlemi orijininden uzaklaştıracak, böylece filtre gerekli tüm kutuplu tipte olmayacaktır.

Teorik sorunun cevabı

Örnekleme frekansının dörtte birinden daha yüksek frekanslarda ne kadar gürültü olacağını umursamıyorsanız, Lipshitz ve ark. 1991 sorunuzu doğrudan ele alıyor:

Bandın bir kısmı üzerinde sıfıra giden bu ağırlıklandırma fonksiyonları için, Şekil 1'in devresinden elde edilebilen ağırlıklı gürültü gücü azaltımında teorik bir sınır yoktur. kulak, örneğin 20 kHz ve Nyquist Frekansı arasında sıfır hassasiyete sahiptir ve bu gerçeği yansıtmak için ağırlıklandırma fonksiyonunu seçer.

Şekil 1, şu anda sahip olduğunuz FIR yapısından çok farklı olan, hem kutuplara hem de sıfırlara sahip genel bir IIR filtre yapısına sahip bir gürültü şekillendiriciyi gösterir, ancak söyledikleri de bunun için geçerlidir, çünkü bir FIR filtresi dürtü yanıtı olabilir herhangi bir kararlı IIR filtresinin dürtü tepkisine keyfi olarak yakın bir şekilde yapılır.

Filtre tasarımı için oktav komut dosyası

İşte Stojanovici ve ark.na eşdeğer olduğunu düşündüğüm başka bir yöntemle katsayı hesabı için bir Octave betiği. 2014 yöntemi olarak parametrelendirildiν=0dipparametremin doğru seçimi ile .

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

Katsayılar olarak Dolph-Chebyshev penceresi ile başlar, transfer fonksiyonu sıfırlarını iki katına çıkarmak için onu kendiliğinden döndürür, orta musluğa frekans cevabını "kaldıran" bir sayı ekler (orta musluğu sıfır zamanında dikkate alarak) her yerde pozitif olduğunu, sıfırları bulur, birim çemberin dışındaki sıfırları kaldırır, sıfırları katsayılara (en önde gelen katsayı polyher zaman 1'dir) dönüştürür ve filtreyi yüksek geçiş yapmak için her ikinci katsayının işaretini döndürür . Komut dosyasının görünümünün (eski ama neredeyse eşdeğer bir sürümü) sonuçları ümit verici:

Büyüklük frekans yanıtı
Şekil 9. Yukarıdaki komut dosyasından filtrenin (daha eski fakat neredeyse eşdeğer bir sürümü) büyüklük frekans yanıtı.

Pole-zero grafiği
Şekil 10. Yukarıdaki komut dosyasından filtrenin kutup sıfır grafiği (eski ama neredeyse eşdeğer bir sürümü).

Dan katsayıları (eski ama neredeyse eşdeğer bir sürüm) gösterimde yukarıdaki komut dosyası: {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}. Sayılar büyüktür ve bu da sayısal sorunlara yol açabilir.

Gürültü şekillendirmenin oktav uygulaması

Sonunda, Octave'de kendi gürültü şekillendirme uygulamamı yaptım ve sizin gibi sorunlara kapılmadım. Yorumlardaki tartışmamıza dayanarak, uygulamanızdaki sınırlamanın, gürültü spektrumunun, yüksek frekans spektrumunu düşük frekanslara döktüğü "pencere yok" olarak adlandırılan dikdörtgen bir pencere kullanılarak değerlendirildiğini düşünüyorum .

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');

resim açıklamasını buraya girin
Şekil 11. Sabit sıfır giriş sinyali için gürültü şekillendirmenin yukarıdaki Octave uygulamasından nicemleme gürültü spektral analizi. Yatay eksen: Normalleştirilmiş frekans. Siyah: gürültü şekillendirme yok ( c = [1];), kırmızı: orijinal filtreniz, mavi: "Filtre tasarımı için oktav komut dosyası" bölümündeki filtre.

Alternatif test süresi alanı
Şekil 12. Sabit sıfır giriş sinyali için gürültü şekillendirmenin yukarıdaki Octave uygulamasından zaman alanı çıkışı. Yatay eksen: örnek sayısı, dikey eksen: örnek değeri. Kırmızı: orijinal filtreniz, mavi: "Filtre tasarımı için oktav komut dosyası" bölümündeki filtre.

Daha aşırı gürültü şekillendirme filtresi (mavi), sıfır giriş için bile çok büyük miktarlarda çıktı örnek değerleri ile sonuçlanır.


1
@MattL. İlk başta yanlış olduğunu düşündüm, tobalt'ın tüm kutuplu bir filtresi var. İlk katsayısı 1 olan bir FIR filtresi olduğunu fark ettiğimde cevabımı yeniden yazdım. Ayrıca Gerzon-Craven, filtrenin optimum olması için minimum faz olması gerektiğini ve tobalt'ın optimize edilmiş katsayılarının da minimum faz filtresi verdiğini bildirdi. Bu gereksinimler, IIR tüm kutuplu filtrelerin katsayılarına eşittir, bu nedenle oradan tasarım yöntemleri ödünç almanızı öneririm. Standart bir IIR de bir seçenek olacaktır.
Olli Niemitalo

1
Hatayı izole ettim: Uygulamam sizinkiyle aynı dalga biçimini (zamanla) üretir. Bununla birlikte, Abs [Fourier [dalga]] işlevi, bir iç taşma / alt taşma şeklinde çalışıyor gibi görünüyor, çünkü döndürülen spektrum farklı görünüyor (daha yüksek zemin)
42'de tobalt

1
@Olli Niemitalo Tamam oktav FFT muhtemelen otomatik pencere kullanıyor gibi görünüyor? Dalga formuna bir Hann penceresi uyguladıktan sonra "doğru" FFT'ler alabilirim. Bu yaklaşımın bütünlüğünü kısaca test edeceğim ve sonunda öğrenmeye devam edeceğim ve sonucu yayınlayacağım. Tüm çabalarınız için teşekkürler. Yayınınızı yanıt olarak işaretledim.
tobalt

1
@ robertbristow-johnson Bence her şey olduğu gibi tutarlı. H (z) 'nin pay olarak 1 olan bir özyinelemeli filtre için olduğu bir denklemi kaldırdım. Ama tobalt'ın durumunda FIR filtresi. Bir geri besleme döngüsü olduğundan, tekrarlayan bir filtre haline geldiğini düşünebilirsiniz. Ancak titrek niceleme, filtre çıktısından tortuya giden yolu kesen işini yapıyor.
Olli Niemitalo

1
Ayrıca Lipshitz ve ark. 1991 kullanımıbir ve bzıt anlamlarla, standart dışı olduğu için dsp.stackexchange.com'da buradan okuduğum bir uygulama .
Olli Niemitalo
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.