Kita tahu bahwa secara umum fungsi transfer filter diberikan oleh:
H(z)=∑Mk=0bkz−k∑Nk=0akz−k
Sekarang gantikan z=ejω untuk mengevaluasi fungsi transfer pada lingkaran unit:
H(ejω)=∑Mk=0bke−jωk∑Nk=0ake−jωk
Jadi ini hanya menjadi masalah evaluasi polinomial pada . Berikut langkah-langkahnya:ω
- Buat vektor frekuensi sudut untuk paruh pertama spektrum (tidak perlu naik hingga ) dan simpan di .ω=[0,…,π]2π
w
- Pra-hitung eksponen di semuanya dan simpan dalam variabel .e−jω
ze
- Gunakan
polyval
fungsi ini untuk menghitung nilai pembilang dan penyebut dengan memanggil polyval(b, ze)
:, membaginya dan menyimpannya H
. Karena kami tertarik pada amplitudo, maka ambillah nilai absolut dari hasilnya.
- Konversikan ke skala dB dengan menggunakan: - dalam hal ini adalah nilai referensi.HdB=20log10H1
Masukkan semua itu dalam kode:
%% 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)
Output asli dari freqz
:
Dan output dari skrip saya:
Dan perbandingan cepat dalam skala linier - tampak hebat!
[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'})
Sekarang Anda dapat menulis ulang menjadi beberapa fungsi dan menambahkan beberapa kondisi agar lebih bermanfaat.
Cara lain (yang sebelumnya diusulkan lebih dapat diandalkan) adalah dengan menggunakan properti fundamental, bahwa respons frekuensi filter adalah Transformasi Fourier dari respons impulsnya:
H(ω)=F{h(t)}
Karena itu Anda harus memasukkan sinyal sistem , menghitung respons filter Anda dan mengambil FFT-nya:δ(t)
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));
Sebagai perbandingan ini akan menghasilkan yang berikut:
a = [1 -0.5 -0.25]; % Some filter with lot's of static gain
. Bisakah Anda menjelaskan kepada saya pemilihan parameter-parameter ini di sini? Saya membaca manual Matlab saya dan tertulis[h,w] = freqz(hfilt,n)
di salah satu bagian sinaps. Anda memberikan dua filter (a, b) kefreqz
. Apakah kedua filter tersebut adahfilt
? Atau satun
?ini hanyalah tambahan untuk jawaban jojek yang lebih umum dan sangat baik ketika matematika presisi ganda digunakan. ketika ada kurang presisi, ada "masalah kosinus" yang muncul ketika salah satu frekuensi dalam respons frekuensi sangat rendah (jauh lebih rendah dari Nyquist) dan juga ketika frekuensi resonansi filter sangat rendah.
ketika Anda menghitung besarnya (kuadrat) respons frekuensi eksponensial kompleks ini akan dikonversi menjadi sinus dan cosinus, tetapi ketika matematika dihidupkan, hanya cosinus yang akan bertahan. ini harus jelas karena besarnya adalah fungsi genapFrekuensi wrt dan hanya cosinus yang berfungsi.| H ( e - j ω ) | = | H ( e j ω ) ||H(ejω)|2 |H(e−jω)|=|H(ejω)|
pertimbangkan identitas trigonometri ini:
sekarang, melihat sisi kanan persamaan, semua informasi mengenai frekuensi berada dalam istilah yang dikurangi dari 1. dan istilah ini menjadi sangat kecil sebagai . sangat kecil sehingga istilah dan informasi frekuensi dalam istilah itu hilang ketika istilah (atau negatif) ditambahkan ke 1. ini adalah kasus bahkan dengan floating point, tetapi lebih sedikit masalah dengan mengapung presisi ganda. tetapi beberapa dari kita memasukkan fungsi respons frekuensi ini ke dalam gir mungkin tidak memiliki sumber daya titik mengambang presisi ganda, atau titik mengambang apa pun.sin2(ω2) ω→0
jadi, apa yang telah saya lakukan adalah menggunakan identitas trigonometri di atas dan menghilangkan semua istilah cosinus, pada dasarnya menggantinya dengan istilah yang tampak seperti dan beberapa konstanta yang digabungkan dengan konstanta lainnya. saya akan menunjukkan kepada Anda jawaban untuk kasus filter IIR orde 2 (alias "biquad"):sin2(ω2)
yang memiliki respons frekuensi yang kompleks
yang memiliki besaran kuadrat:
jadi, orang bisa melihat bahwa besarnya respons frekuensiadalah fungsi bahkan simetri dan hanya bergantung pada cosinus dan . untuk sangat rendah , nilai-nilai cosinus tersebut sangat dekat dengan sehingga, dengan titik tetap atau mengambang presisi tunggal , ada beberapa bit yang tersisa yang membedakan nilai-nilai tersebut dari . itu adalah "masalah kosinus" .|H(ejω)| cos(ω) cos(2ω) ω 1 1
menggunakan identitas trigonometri di atas, Anda mendapatkan besarnya kuadrat:
di manaϕ≜sin2(ω2)
jika gigi Anda berniat untuk merencanakan ini sebagai dB, maka akan keluar sebagai
jadi divisi Anda berubah menjadi pengurangan, tetapi Anda harus dapat menghitung logaritma ke beberapa basis atau yang lain. secara numerik, Anda akan memiliki lebih sedikit masalah dengan ini untuk frekuensi rendah daripada melakukannya dengan cara yang jelas.
sumber