Bir bant geçiren Butterworth filtresinin frekans cevabını Frekans fonksiyonu olmadan MATLAB içinde nasıl manuel olarak çizebilirim?


15

Aşağıdaki gibi bir sinyale bir bant geçiren filtre uygulayan kodu var. Ben DSP'de bir çaylağım ve devam etmeden önce perde arkasında neler olduğunu anlamak istiyorum.

Bunu yapmak için, filtrenin frekans yanıtını kullanmadan nasıl çizeceğinizi bilmek istiyorum freqz.

[b, a] = butter(order, [flo fhi]);
filtered_signal = filter(b, a, unfiltered_signal)

Çıktılar göz önüne alındığında, [b, a]bunu nasıl yaparım? Bu basit bir görev gibi görünüyor, ama belgelerde veya çevrimiçi olarak neye ihtiyacım olduğunu bulmakta zorlanıyorum.

Ayrıca bunu mümkün olduğunca çabuk nasıl yapacağınızı, örneğin bir fftveya başka bir hızlı algoritma kullanarak anlamak istiyorum .

Yanıtlar:


25

Bir filtrenin genel transfer fonksiyonunun aşağıdakiler tarafından verildiğini biliyoruz:

H(z)=k=0Mbkzkk=0Nakzk

Şimdi birim çemberdeki transfer işlevini değerlendirmek için z=ejω geçin:

H(ejω)=k=0Mbkejωkk=0Nakejωk

Böylece bu sadece belirli bir ω polinom değerlendirmesi sorunu haline gelir . İşte adımlar:

  • Bir açısal frekansları vektörü oluşturma ω=[0,,π] spektrumun ilk yarısında (kadar gitmeye gerek için 2π olarak) ve ona tasarrufu w.
  • ejω üslerini önceden hesaplayın ve değişkente saklayın ze.
  • polyval: Tuşunu kullanarak pay ve payda değerlerini hesaplamak için fonksiyonu kullanın : polyval(b, ze)bölün ve saklayın H. Genlikle ilgilendiğimizden, sonucun mutlak değerini alın.
  • Kullanarak dB ölçeğine dönüştürün: HdB=20log10H - bu durumda 1 referans değerdir.

Tüm bunları koda koymak:

%% Filter definition
a = [1 -0.5 -0.25]; % Some filter with lot's of static gain
b = [1 3 2];

%% My freqz calculation
N = 1024; % Number of points to evaluate at
upp = pi; % Evaluate only up to fs/2
% Create the vector of angular frequencies at one more point.
% After that remove the last element (Nyquist frequency)
w = linspace(0, pi, N+1); 
w(end) = [];
ze = exp(-1j*w); % Pre-compute exponent
H = polyval(b, ze)./polyval(a, ze); % Evaluate transfer function and take the amplitude
Ha = abs(H);
Hdb  = 20*log10(Ha); % Convert to dB scale
wn   = w/pi;
% Plot and set axis limits
xlim = ([0 1]);
plot(wn, Hdb)
grid on

%% MATLAB freqz
figure
freqz(b,a)

Orijinal çıktı freqz:

enter image description here

Ve senaryomun çıktısı:

enter image description here

Ve lineer ölçekte hızlı karşılaştırma - harika görünüyor!

[h_f, w_f] = freqz(b,a);
figure
xlim = ([0 1]);
plot(w, Ha) % mine
grid on
hold on
plot(w_f, abs(h_f), '--r') % MATLAB
legend({'my freqz','MATLAB freqz'})

enter image description here

Artık bir işlevi yeniden yazabilir ve daha kullanışlı hale getirmek için birkaç koşul ekleyebilirsiniz.


Başka bir yol (daha önce önerilen daha güvenilirdir) temel özelliği kullanmaktır, bir filtrenin frekans cevabı, dürtü yanıtının Fourier Dönüşümüdür:

H(ω)=F{h(t)}

Bu nedenle sisteminize beslemelisiniz δ(t) sinyalini, filtrenizin yanıtını hesaplamalı ve FFT'sini:

d = [zeros(1,length(w_f)) 1 zeros(1,length(w_f)-1)];
h = filter(b, a, d);
HH = abs(fft(h));
HH = HH(1:length(w_f));

Buna karşılık, bu aşağıdakileri üretecektir:

enter image description here


1
Ayrıntılı açıklama
partida

Bu çizgiyi düşünüyorum a = [1 -0.5 -0.25]; % Some filter with lot's of static gain. Bu parametrelerin seçimini burada açıklayabilir misiniz, lütfen. Matlab'ımın el kitabını okuyorum ve [h,w] = freqz(hfilt,n)sinapsın bir bölümünde yazıyor . İçine iki filtre (a, b) veriyorsunuz freqz. Her iki filtre de var hfiltmı? Yoksa bir tane nmi?
Léo Léopold Hertz 준영

Sadece diğerleri için açıklığa kavuşturmak için: "2 pi'ye kadar çıkmaya gerek yok" katsayıların gerçek olduğu zamandır. Karmaşık katsayılı filtreler için uygulamalar vardır ve bu durumda spektrum artık simetrik olmayacak ve bu durumda frekansı 2 pi'ye genişletmek isteyecektir.
Dan Boschen

14

bu sadece çift kesinlikli matematik kullanıldığında daha genel ve mükemmel derecede iyi olan jojek'in cevabına bir zekadır. daha az hassasiyet olduğunda, ya frekans yanıtındaki frekans çok düşük (Nyquist'ten çok daha düşük) olduğunda ve ayrıca filtrenin rezonans frekansları çok düşük olduğunda ortaya çıkan bir "kosinüs problemi" vardır.

|H(ejω)|2|H(ejω)|=|H(ejω)|wrt frekansı ve sadece kosinüsler eşit işlevlerdir.

bu trig kimliğini düşünün:

cos(ω) = 12sin2(ω2)

sin2(ω2)ω0

sin2(ω2) ve diğer sabitlerle birleştirilen bazı sabitler. 2. dereceden IIR filtresi (aka "biquad") için cevap göstereceğim:

H(z)=b0+b1z1+b2z2a0+a1z1+a2z2

karmaşık frekans cevabı olan

H(ejω)=b0+b1ejω+b2ej2ωa0+a1ejω+a2ej2ω

büyüklüğü kare olan:

|H(ejω)|2=|b0+b1ejω+b2ej2ω|2|a0+a1ejω+a2ej2ω|2=(b0+b1cos(ω)+b2cos(2ω))2+(b1sin(ω)+b2sin(2ω))2(a0+a1cos(ω)+a2cos(2ω))2+(a1sin(ω)+a2sin(2ω))2=b02+b12+b22+2b1(b0+b2)cos(ω)+2b0b2cos(2ω)a02+a12+a22+2a1(a0+a2)cos(ω)+2a0a2cos(2ω)

|H(ejω)|cos(ω)cos(2ω)ω11

yukarıdaki trig kimliğini kullanarak, kare büyüklüğü elde edersiniz:

|H(ejω)|2=b02+b12+b22+2b1(b0+b2)cos(ω)+2b0b2cos(2ω)a02+a12+a22+2a1(a0+a2)cos(ω)+2a0a2cos(2ω)=b02+b12+b22+2b1(b0+b2)(12sin2(ω2))+2b0b2(12sin2(ω))a02+a12+a22+2a1(a0+a2)(12sin2(ω2))+2a0a2(12sin2(ω))=b02+b12+b22+2b1(b0+b2)(12sin2(ω2))+2b0b2(2cos2(ω)1)a02+a12+a22+2a1(a0+a2)(12sin2(ω2))+2a0a2(2cos2(ω)1)=b02+b12+b22+2b1(b0+b2)(12sin2(ω2))+2b0b2(2(12sin2(ω2))21)a02+a12+a22+2a1(a0+a2)(12sin2(ω2))+2a0a2(2(12sin2(ω2))21)=b02+b12+b22+2b1(b0+b2)(12ϕ)+2b0b2(2(12ϕ)21)a02+a12+a22+2a1(a0+a2)(12ϕ)+2a0a2(2(12ϕ)21)=b02+b12+b22+2b1(b0+b2)(12ϕ)+2b0b2(18ϕ+8ϕ2)a02+a12+a22+2a1(a0+a2)(12ϕ)+2a0a2(18ϕ+8ϕ2)=b02+b12+b22+2b1b0+2b1b24(b1b0+b1b2)ϕ+2b0b216b0b2ϕ+16b0b2ϕ2a02+a12+a22+2a1a0+2a1a24(a1a0+a1a2)ϕ+2a0a216a0a2ϕ+16a0a2ϕ2=(b02+b12+b22+2b1b0+2b1b2+2b0b2)4(b1b0+b1b24b0b2)ϕ+16b0b2ϕ2(a02+a12+a22+2a1a0+2a1a2+2a0a2)4(a1a0+a1a24a0a2)ϕ+16a0a2ϕ2=14(b02+b12+b22+2b1b0+2b1b2+2b0b2)(b1b0+b1b24b0b2)ϕ+4b0b2ϕ214(a02+a12+a22+2a1a0+2a1a2+2a0a2)(a1a0+a1a24a0a2)ϕ+4a0a2ϕ2=(b0+b1+b22)2ϕ(4b0b2(1ϕ)+b1(b0+b2))(a0+a1+a22)2ϕ(4a0a2(1ϕ)+a1(a0+a2))

where ϕsin2(ω2)

if your gear is intending to plot this as dB, it comes out as

20log10|H(ejω)| = 10log10((b0+b1+b22)2ϕ(4b0b2(1ϕ)+b1(b0+b2)))10log10((a0+a1+a22)2ϕ(4a0a2(1ϕ)+a1(a0+a2)))

so your division turns into subtraction, but you have to be able to compute logarithms to some base or another. numerically, you will have much less trouble with this for low frequencies than doing it the apparent way.


2
That's really cool, thank you Robert! +1
jojek

@Robert I "believe" similar to my comment for Jojek above that this only applies as well when the coefficients are real (and therefore the spectrum is symmetric and thus the magnitude converts to cosines as you show)... Am I correct?
Dan Boschen

yes. that commitment is made when you go from the first line of |H(ejω)|2=... to the second line. no going back after that.
robert bristow-johnson
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.