Bir filtrenin genel transfer fonksiyonunun aşağıdakiler tarafından verildiğini biliyoruz:
H(z)=∑Mk=0bkz−k∑Nk=0akz−k
Şimdi birim çemberdeki transfer işlevini değerlendirmek için z=ejω geçin:
H(ejω)=∑Mk=0bke−jωk∑Nk=0ake−jω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
.
- e−jω ü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
:
Ve senaryomun çıktısı:
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'})
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: