Bagaimana cara saya memetakan respons frekuensi dari bandpass Butterworth filter di MATLAB tanpa fungsi freqz?

15

Saya memiliki kode seperti di bawah ini yang menerapkan filter bandpass ke sinyal. Saya seorang noob di DSP dan saya ingin memahami apa yang terjadi di balik layar sebelum saya melanjutkan.

Untuk melakukan ini, saya ingin tahu bagaimana merencanakan respons frekuensi filter tanpa menggunakan freqz.

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

Dengan hasil [b, a]bagaimana saya akan melakukan ini? Sepertinya ini akan menjadi tugas yang sederhana, tetapi saya kesulitan menemukan apa yang saya butuhkan dalam dokumentasi atau online.

Saya juga ingin memahami bagaimana melakukan ini secepat mungkin, misalnya menggunakan fftalgoritma cepat atau lainnya.

William
sumber

Jawaban:

25

Kita tahu bahwa secara umum fungsi transfer filter diberikan oleh:

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

Sekarang gantikan z=ejω untuk mengevaluasi fungsi transfer pada lingkaran unit:

H(ejω)=k=0Mbkejωkk=0Nakejω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 .ejωze
  • Gunakan polyvalfungsi 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:

masukkan deskripsi gambar di sini

Dan output dari skrip saya:

masukkan deskripsi gambar di sini

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'})

masukkan deskripsi gambar di sini

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:

masukkan deskripsi gambar di sini

jojek
sumber
1
Penjelasan terperinci
partida
Saya sedang memikirkan kalimat ini 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) ke freqz. Apakah kedua filter tersebut ada hfilt? Atau satu n?
Léo Léopold Hertz 준영
Hanya untuk mengklarifikasi untuk orang lain: "Tidak perlu naik hingga 2 pi" adalah ketika koefisien nyata. Ada aplikasi untuk filter dengan koefisien kompleks dan dalam hal ini spektrum tidak akan lagi menjadi simetris dan dalam hal itu ingin memperluas frekuensi hingga 2 pi.
Dan Boschen
14

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(ejω)|=|H(ejω)|

pertimbangkan identitas trigonometri ini:

cos(ω) = 12sin2(ω2)

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)

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

yang memiliki respons frekuensi yang kompleks

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

yang memiliki besaran kuadrat:

|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ω)

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ω)ω11

menggunakan identitas trigonometri di atas, Anda mendapatkan besarnya kuadrat:

|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))

di manaϕsin2(ω2)

jika gigi Anda berniat untuk merencanakan ini sebagai dB, maka akan keluar sebagai

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

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.

robert bristow-johnson
sumber
2
Itu sangat keren, terima kasih Robert! +1
jojek
@ Robert Saya "percaya" mirip dengan komentar saya untuk Jojek di atas bahwa ini hanya berlaku juga ketika koefisien nyata (dan karena itu spektrumnya simetris dan dengan demikian besarnya berubah menjadi cosinus seperti yang Anda tunjukkan) ... Apakah saya benar?
Dan Boschen
Iya. komitmen itu dibuat ketika Anda beralih dari baris pertama ke baris kedua. tidak akan kembali setelah itu. |H(ejω)|2=...
robert bristow-johnson