Daha yüksek dereceli filtreler için basamaklı biquad bölümleri nasıl çalışır?


20

Ben bir 8. sipariş IIR filtre uygulamaya çalışıyorum ve okuduğum her uygulama notu ve ders kitabı ikinci sipariş bölümleri olarak 2'den fazla sipariş herhangi bir filtre uygulamak en iyi olduğunu söylüyor. tf2sosMATLAB'da beklediğim gibi bana 4 saniyelik bölümler için 6x4 katsayı veren ikinci dereceden bölümlerin katsayılarını almak için kullandım . SOS olarak uygulamadan önce, 8. dereceden filtre, önceki 7 örnek değerinin saklanmasını (ve çıktı değerlerini) gerektiriyordu. Şimdi ikinci dereceden bölümler olarak uygularken, akış girdiden çıktıya nasıl çalışır, yalnızca önceki 2 örnek değerini saklamam gerekir mi? Yoksa ilk filtrenin çıkışı x_inikinci filtreye olduğu gibi mi besleniyor ?


u belirtilen aşamada filtre sırasına bağlı olarak, her aşama için önceki devletleri depolamak gerekir, böylece u sadece belirtildiği gibi 2 olmaz

Yanıtlar:


13

En son söylediğiniz şey ("Ya da ilk filtre çıkışı ikinci filtreye x_in olarak giriyor mu?"). Fikir basittir: Biquad'lere basamaklı ayrı ikinci dereceden filtreler gibi davranırsınız. İlk filtreden gelen çıkış ikinciye girer ve böylece gecikme hatları filtreler arasında yayılır. Belleği kısıtlanmış bir ortamda yapıyı optimize etmeniz gerekiyorsa, bitişik iki dördün yedekli gecikme belleğine sahip olduğunu (yani 1. aşamadaki son birkaç çıkış örneğinin 2. aşamadaki son birkaç giriş örneğiyle aynı olduğunu fark edebilirsiniz. filtreleri ayrı ayrı uygularsanız onları ayrı ayrı saklamanız gerekmez).


Teşekkürler! MATLAB'de hızlı bir şekilde yapmayı başardım. Daha önceki karışıklığın nedeni, kazancı (ugh!)
Çarpmayı unuttuğum

Eğer kazanımı tf2sos'tan çıkış argümanı olarak sormaya zahmet etmiyorsanız (yayınlanan örnek kodumda olduğu gibi), tekrar tekrar çoğaltmak zorunda kalmazsınız.
learnvst

9

Aslında ikinci derece bölümleri uygulamanın iki yolu vardır: paralel ve seri. Seri versiyonda, N bölümünün çıkışları N + 1 bölümünün girişleridir. Paralel versiyonda tüm bölümler aynı girişe sahiptir (ve bir eşlenik kompleks sıfır çifti yerine sadece bir gerçek sıfır) ve her bölüm çıkışı basitçe toplanır. İki yöntem, Z-alanı transfer fonksiyonunun kısmi-fraksiyon genişlemesi ile ilişkilidir. UYARI: Bu sayısal olarak zor bir sorundur ve standart Matlab uygulaması "residuez" birim çemberine yakın kutuplara sahip tipik ses filtreleri için çok büyük sayısal hatalara sahip olabilir.


6

İşte 2. sıra bölümlerden neden daha iyi olduğunuzu göstermek için biraz demo kodu.

clc

sr = 44100;
order = 13;

[b,a] = butter(order,1000/(sr/2),'low');
[sos] = tf2sos(b,a);

x = [1; zeros(299,1)]; %impulse


% all in one
Y = filter(b,a,x);

% cascaded biquads
Z = x;
for nn = 1:size(sos,1);
    Z = filter(sos(nn,1:3),sos(nn,4:6), Z );
end


cla; plot(Y, 'k'); hold on; plot(Z,':r'); hold off

Yukarıdaki örnekte verilen alçakgeçiren filtre için, yaklaşık 12 ila 13'lük siparişlerle, sayısal hatalar, basamaklı çift kişilikler kullanmayan uygulama için gözle görülür şekilde farklı bir dürtü yanıtı vermek üzere oluşur. Filtreye bağlı olarak, kilometreniz değişecektir.

SİPARİŞ = 10

resim açıklamasını buraya girin

SİPARİŞ = 13

resim açıklamasını buraya girin


@learvst Yanlışsam beni düzeltin ama kodunuz kazançları kaçırıyor. Olmamalı:[sos gain] = tf2sos(b,a); // Rest of code for nn = 1:size(sos,1); Z = filter(sos(nn,1:3),sos(nn,4:6), Z ); end Z = filter(gain,1,Z);
user915783
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.