FIR Filtre Tasarımı: Pencere, Parks McClellan ve En Küçük Kareler


21

Düşük geçişli bir filtrenin FIR filtre tasarımı için Parks-McClellan (burada PMcC olarak kısaltılır) veya Least Squares algoritmaları üzerinde pencere yaklaşımı kullanmanın avantajları var mı? Günümüzün hesaplama gücüyle birlikte algoritmaların karmaşıklığının bir faktör olmadığını varsayalım.

Bu soru PMcC'yi En Küçük Kareler ile karşılaştırmak değil, özellikle de bu algoritmalar yerine herhangi bir pencere FIR tasarım tekniğini kullanmak için herhangi bir neden varsa veya bu algoritmalar tarafından kullanılmayan ve didaktik amaçlarla sınırlandırılmış tasarımı filtrelemek için pencereleme teknikleri miydi?

Aşağıda Hamming penceresini Least Squared ile tercih ettiğim tasarım yaklaşımı ile aynı sayıdaki muslukları kullanarak karşılaştırdığım bir karşılaştırma var. En Küçük Kareler yaklaşımındaki geçiş bandını Hamming Penceresi ile yakından eşleştirecek şekilde genişlettim ve bu durumda En Küçük Kareliğin daha iyi performans göstereceği (çok daha fazla durma bandının reddedilmesi) açıkça belli oldu. Bunu tüm pencerelerde yapmadım, bu da PMcC'yi ve en küçük kareleri hiç gerçekleştiremediyseniz ya da bir pencereleme yaklaşımının tercih edileceği bir FIR düşük geçiş filtresi için başka uygulamalar olup olmadığı sorusuna götürür.

görüntü tanımını buraya girin


2
Kaiser -windowed sinc ile firpm()ve arasındaki karşılaştırmayı önerebilirim firls().
robert bristow-johnson,

Yanıtlar:


16

Pencereleme süzgeci tasarım yönteminin artık en önemli tasarım yöntemlerinden biri olmadığına katılıyorum ve gerçekten de geleneksel nedenlerle muhtemelen tarihsel nedenlerden ötürü temsil edildiğinden dolayı olabilir.

Ancak, kullanımının bazı durumlarda haklı olabileceğini düşünüyorum. Hesaplamalı karmaşıklığın artık bir sorun olmadığı konusunda hemfikir değilim. Bu platforma bağlıdır. Masaüstü bilgisayarımızda otururken ve bir filtre tasarlarken, gerçekten de karmaşıklık için endişelenmemize gerek yok. Bununla birlikte, belirli platformlarda ve tasarımın yarı gerçek zamanlı olarak yapılması gereken durumlarda, hesaplama karmaşıklığı bir sorundur ve çok daha karmaşık olan optimal bir tekniğe göre basit bir suboptimal tasarım tekniği tercih edilecektir. Örnek olarak, bir keresinde filtrenin (kiriş oluşturucu) anında yeniden tasarlanmasının gerektiği kiriş biçimleme sistemi üzerinde çalıştım ve bu yüzden hesaplama karmaşıklığı gerçekten önemli bir konuydu.

Ayrıca, pek çok pratik durumda, en iyi ve en iyi tasarım arasındaki fark konusunda endişelenmemize gerek olmadığına ikna oldum. Kantitatif katsayılar ve kantitatif aritmetik işlemlerin kantitatif sonuçları ile sabit noktalı aritmetik kullanmamız gerekirse, bu daha da gerçek olur.

Diğer bir konu, optimum filtre tasarım yöntemlerinin ve uygulamalarının sayısal kararlılığıdır. Parks-McClellan algoritmasının (söylemeliyim, kullandığım uygulamayı ) bir araya gelmediği birkaç durumla karşılaştım. Bu, şartnamenin pek bir anlam ifade etmemesi durumunda gerçekleşecek, ancak aynı zamanda tamamen makul şartlarla da olabilir. Aynısı, doğrusal olmayan bir denklem sisteminin çözülmesi gereken en kötü kareler tasarım yöntemi için de geçerlidir, ki bu da şartsız bir problem haline gelebilir. Bu şartlar altında, pencereleme yöntemi sizi asla yarı yolda bırakmaz.

Pencere yöntemi ile en küçük kareler tasarımı arasındaki karşılaştırmanız hakkında bir açıklama: Bu karşılaştırmanın, pencere yöntemi üzerine en küçük kareler yönteminin genel üstünlüğünü gösterdiğini sanmıyorum. Öncelikle, bu iki yöntemden herhangi biri için tasarım amacı olmayan durma bandı zayıflamasına bakarsınız. Pencereleme yöntemi hiçbir şekilde optimal değildir ve en küçük kareler tasarımı, durdurma bandı enerjisini en aza indirir ve durdurma bandı dalgalanma boyutuna hiç aldırış etmez. Görülebilecek olan şey, pencere tasarımının geçiş bandı kenarının en küçük kareler tasarımından daha büyük olmasına rağmen, durdurma bandı kenarının daha küçük olmasıdır. Sonuç olarak, pencereleme ile tasarlanan filtrenin geçiş bandı genişliği daha küçüktür ve bu da daha yüksek durma bandı dalgalanmalarına neden olur. Geçiş bandı genişliğindeki fark küçük olabilir, ancak filtre özellikleri bu parametreye karşı çok hassastır. Hiç şüphe yok ki, en küçük kareler filtresinin bant enerjisini durdurmak söz konusu olduğunda diğer filtreden daha iyi performans gösterdiğini, ancak bu dalgalanma boyutu kadar kolay olmadığını gösteriyor. Ve eğer bu fark pratikte bir uygulamada gerçekten bir fark yaratabiliyorsa sorun devam eder.

Bakalım, bu gibi karşılaştırmalar genellikle onların görünmesini istediğiniz şekilde görünmek için yapılabilir. Aşağıdaki şekilde, Matlab / Octave işleviyle firls.m(mavi) tasarlanan en küçük kareleri optimal bir düşük geçiş filtresi ile Kaiser penceresi (kırmızı) kullanarak pencere yöntemiyle tasarlanmış bir düşük geçiş filtresiyle karşılaştırıyorum.

görüntü tanımını buraya girin

Şekilden, pencere ile tasarlanan filtrenin en küçük kareler optimal filtresinden biraz daha iyi olduğu söylenebilir. Bu elbette anlamsızdır, çünkü "daha iyi" bile tanımlamadık ve en küçük kareler filtresinin daha küçük bir ortalama kare yaklaşım hatası olması gerekir . Ancak, bunu doğrudan şekilde görmüyorsunuz. Her neyse, bu sadece benim böyle bir karşılaştırma yaparken çok dikkatli ve net olması gerektiği iddiamı desteklemektir.

Özetle, DSP öğrencileri için tamamen didaktik nedenlerle öğrenmenin faydalı olmasının yanı sıra, 1970'lerden bu yana teknolojik ilerlemelere rağmen pencereleme yönteminin kullanılmasının bazı pratik senaryolarda haklı çıkabileceğini düşünüyorum. çok yakında değiş.


İyi cevap Matt- Couple açıklamaları / soruları: Karmaşıklık konusunda, gerçek bir örnek bulabilir misiniz? Bunun uygulama ile ilgili bir sorun olduğunu görebiliyorum, ancak katsayılar ortaya çıkarken tasarımını aşağı platformda yapmamın bir nedeni olduğunu düşünemiyorum (bu yüzden sorumu). Karşılaştırma ile ilgili olarak, en küçük kareler açıkça daha iyidir; Aynı dalgalanma ve geçiş için daha iyi bir durdurma bandı zayıflaması elde edersiniz. İkisini eşleştirmek için geçiş bandı genişliğini artırdım; kenar, eşleştirmeyi bıraktığım yerden biraz daha büyük, ancak sonuçlandırmak için daha yakın olabilir.
Dan Boschen

2
@DanBoschen: Elbette, çoğu durumda tasarım çevrimdışı yapılır ve karmaşıklık bir sorun değildir. Ancak, filtrelerin yarı gerçek zamanlı olarak yeniden tasarlanması gereken uygulamalar (bir ışın oluşturma uygulamasıydı) ile karşılaştım, bu yüzden burada karmaşıklık sorunu var.
Matt L.

1
Ve vitrin dizaynına göre optimum tasarımdaki musluk sayısındaki gerçek tasarruf için, gördüğüm sonuçlar genellikle hayal kırıklığı yaratıyor. Genellikle sadece birçok uygulama için pek bir fark yaratmayacak olan 1 veya 2 kademe.
Matt L.

1
Tamam, çevrimdışı tasarımlar için ve sayısal kararlılığın bir sorun olmadığı ortaya çıkarsa (bu özel tasarım için; genel olarak bir sorun olarak kalır), pencereleme yararlı olmaz. Ancak genel olarak, çevrimdışı tasarımlara her zaman güvenemeyiz ve daha da önemlisi, her zaman sayısal sorunlardan kaçınamayız. Bu yüzden 'eski' kelimesinin hala biraz fazla güçlü olduğunu düşünüyorum.
Matt L.

3
Çok güzel söyledi. Hatırlanması gereken şey, mühendisliğin tamamen gereksinimlerinizi karşılayacak kadar iyi bir uygulama bulma ile ilgili olmasıdır. Pencere yönteminin uygulanması basittir ve daima çalışır. Diğer yöntemlerin daha karmaşık uygulamaları vardır ve çalışmak için zor oldukları durumlarda olabilir. Anında filtreler tasarlaması gereken birkaç sistemle çalıştım ve pencere yöntemi bu durumlar için uygun.
Jason R

7

Pencereli Sinc filtreler, ilgili FIR filtresini çalıştırmak için yeterince güçlü işlemcilerde anında uyarlanabilir şekilde üretilebilir. Pencereli Sinc filtreler sınırlı sınırlı bir sürede üretilebilir.

Bazı basit pencereli Sinc filtrelerin üretilmesi, bazı opak araç kutusunun kör kullanımına karşı, birkaç kod satırında tamamen tanımlanabilir (ve kötü amaçlı yazılımlar vb. İçin incelenebilir) .

Bir PMcC filtre üreticisini sıfırdan kodlamak için gerekli olana kıyasla pencereli bir Sinc filtresini açıklamak için daha az ön koşullu matematik arka planı gereklidir.

Bir PMcC filtresinin frekans cevabındaki eşit dalgalanmalar, zaman alanı içinde basit pencereli bir filtre tarafından üretilen yapay nesnelerden farklı (ve belki de daha az arzu edilen) yapay nesnelere neden olabilir.


1
Evet, iyi nokta @ hotpaw2'de, geçiş bandı dalgalanması semboller arası girişime neden olur (takip eden ve öndeki yankılar). Teşekkürler
Dan Boschen

2
2003'te comp.dsp'da echo öncesi ve sonrası Parks-McClellan hakkında konuştuk . : Alexey Lukin minimal MATLAB örneği yayınlanmıştır f=[0 0.49 0.51 1]; a=[1 1 0 0]; b=remez(300,f,a), ayrıca Octave çalışır. Bir açıklama, çok dik filtrelerle, dalgaların bir kosinine benzeyecek kadar düzenli olabileceğidir. Frekans bölgesi kosinüsünün zaman bölgesi eşdeğeri, iki itici eko olacaktır.
Olli Niemitalo

6

Burada pencereli bir tasarımın bir faydasını ve Parks-McClellan'dan aynı faydayı elde etmek için bir numara göstereceğim.

Yarım bant, çeyrek bant vb. Filtreler için pencereleme, prototipik ideal düşük geçişli filtre olan ölçeklenmiş sinc fonksiyonunun zaman alanı sıfırlarını korur. Sıfırlar katsayılarla sonuçlanır ve filtrelerin hesaplama maliyetini düşürür. Yarım bantlı bir filtre için, pencereli tasarım, orta katsayısı (hatta aynı zamanda düşünülen) hariç, her eşit katsayısı 0 olan bir filtre verir:

sinc
Şekil 1. 2 faktörü ile yatay olarak gerilmiş Sinc fonksiyonu, 2 faktörü ile örneklemeye uygun 2 değerinde bir prototipik yarı bant düşük geçiş filtresidir.

Bununla birlikte, Parks-McClellan / Remez, yalnızca bir birlik kazanç geçiş bandı tanımlanmış çift musluklu bir filtre kullanarak tasarlayarak aynı faydaları elde etmek için kandırılabilir. Elde edilen katsayılar, daha uzun bir filtrenin tek katsayıları olarak kullanılır. Daha uzun olan filtrenin orta katsayısı 1'e, diğeri ise eşit katsayılar 0'a ayarlanmıştır. Bu filtrenin geçiş bandında 2 kazancı ve geçiş ve durdurma bantlarında simetrik dalgalanması vardır. Python'da:

import numpy as np
from scipy import signal
import matplotlib.pyplot as plt
c0 = signal.remez(14, [0, 3500.0/8000], [1])
c = np.zeros(c0.size*2-1)
c[0::2] = c0
c[c0.size-1] = 1
freq, response = signal.freqz(c)
plt.semilogy(freq/(2*np.pi), np.abs(response))
plt.show()
plt.plot(range(-c0.size+1, c0.size, 1), c, 'x')
plt.grid(True)
plt.show()

Şekil 2.
Şekil 2. Python's kullanarak dolaylı olarak tasarlanmış yarım bant filtresinin katsayıları scipy.signal.remez.

Figür 3.
Şekil 3. Dolaylı olarak tasarlanmış yarı bant filtresinin büyüklük frekans tepkisi grafiği scipy.signal.remez.

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.