ポイント
- プリワーピングによって、求めたいディジタルフィルタの遮断周波数fdをリファレンスとなるバタワースフィルタの遮断周波数faにあらかじめ変換しておく
- 伝達関数G(s)を求めたあと、s->zの双一次Z変換を行い、H(z)を求める
clear; close all; T = 1e-4; %ディジタルフィルタのサンプリング周期 fs = 1/T; %ディジタルフィルタのサンプリング周波数 fd = 2500; %ディジタルフィルタの遮断周波数[Hz] wd = 2*pi*fd; %ディジタルフィルタの遮断各周波数 wa = tan(wd*T/2)*2/T;%アナログフィルタの遮断角周波数 fa = wa/(2*pi); %hz: アナログフィルタの遮断周波数 disp('***プリワーピング処理***'); disp(sprintf('IIRディジタルフィルタの設計遮断周波数fd: %g[Hz]',fd)); disp(sprintf('等価アナログフィルタの要求遮断周波数fa: %g[Hz]',fa)); Ns = [15 20 40]; syms s; Has = []; figure(1); lab = sprintf('バタワースフィルタの振幅特性: 遮断周波数%g[Hz]',fa); title(lab); xlabel('f[Hz]'); hold on; figure(2); title('バタワースフィルタの位相特性'); xlabel('f[Hz]'); hold on; Hs = s*zeros(size(Ns)); for idx=1:length(Ns) N = Ns(idx); omega = linspace(0,wa*1.9,100); Ha = sqrt(1./(1+(omega/wa).^(2*N))); figure(1); subplot(211); hold on; lab1 = sprintf('(N=%d)',N); plot(omega/(2*pi), Ha, 'DisplayName',lab1); D = 1; phi = 0; for k=1:N sigma_k = -sin((2*k-1)/(2*N)*pi); omega_k = cos((2*k-1)/(2*N)*pi); phi = phi - atan((omega_k-(omega/wa))/sigma_k); sk = sigma_k + j*omega_k; D = D * (s-sk); end H = 1/D; Hs(idx) = H; figure(2); subplot(211) hold on; lab2 = sprintf('(N=%d)',N); plot(omega/(2*pi), rad2deg(phi), 'DisplayName',lab2); end figure(1); subplot(211); lab = sprintf('バタワースフィルタの振幅特性: 遮断周波数%g[Hz]',fa); title(lab); xlabel('f[Hz]'); legend(); figure(2); subplot(211); title('バタワースフィルタの位相特性'); xlabel('f[Hz]'); legend(); for idx=1:length(Ns) N = Ns(idx); H1 = Hs(idx); syms z; s_by_z = 2/T*(1-z^(-1))/(1+z^(-1)); Hz1 = subs(H1, s, s_by_z); Hz1 = vpa(simplify(Hz1)); %ディジタルフィルタのwdでωを規格化 z_exp_jwt = exp(j*(omega/wd)*T); Hz1_w = subs(Hz1, z, z_exp_jwt); Hz1_w_abs = abs(Hz1_w); figure(1); subplot(212); hold on; plot(omega/(2*pi), Hz1_w_abs,'DisplayName',sprintf('N=%d',N)); title(sprintf('等価IIRディジタルフィルタの振幅特性: 遮断周波数%g[Hz]',fd)); xlabel('f[Hz'); legend(); figure(2); subplot(212); hold on; %以下の計算はN=50において終了しない angle_Hz1_z_exp_jwt = subs(angle(Hz1),z,z_exp_jwt); unwrap_angle = smoother(angle_Hz1_z_exp_jwt); plot(omega/(2*pi), rad2deg(unwrap_angle),'DisplayName',sprintf('N=%d',N)); title('等価IIRディジタルフィルタの位相特性'); xlabel('f[Hz]'); legend(); end legend(); big; function ys=smoother(xs) ys = xs; for idx = 2:length(xs) if (xs(idx) - xs(idx-1)) > 0 disp('curernt value increased!'); ys(idx:end) = ys(idx:end) - abs(xs(idx)-xs(idx-1)); end end end