function [n, Omgc, bd, ad] = Impulse_response_invariant_method(wp, Rp, ws, As, Fs)
% wp = 0.25 * pi; % 滤波器的通带截止频率
% ws = 0.4 * pi; % 滤波器的阻带截止频率
% Rp = 1; As = 15; % 滤波器的通阻带衰减指标
ripple = 10^(-Rp / 20); % 滤波器的通带衰减对应的幅度值
Attn = 10^(-As / 20); % 滤波器的阻带衰减对应的幅度值
Omgs = ws * Fs; % 模拟原型滤波器计算
[n, Omgc] = buttord(Omgp, Omgs, Rp, As, 's'); % 计算阶数n和截止频率
[z0, p0, k0] = buttap(n); % 设计归一化的巴特沃思模逆滤波器原型,零点,极点和增益
ba1 = k0 * real(poly(z0)); % 求原型滤波器的系数b
aa1 = real(poly(p0)); % 求原型滤波器的系数a
[ba, aa] = lp2lp(ba1, aa1, Omgc); % 变换为模拟低通滤波器
[bd, ad] = impinvar(ba, aa, Fs); % 求数字系统的频率特性
[H, w] = freqz(bd, ad); % 求数字系统的频率特性
dbH = 20 * log10((abs(H) + eps) / max(abs(H)));
subplot(2, 2, 1); plot(w / pi, abs(H));
ylabel('|H|'); title('幅度响应'); axis([0, 1, 0, 1.1]);
set(gca, 'XTickMode', 'manual', 'XTick', [0, wp / pi, ws / pi, 1]);
set(gca, 'YTickMode', 'manual', 'YTick', [0, Attn, ripple, 1]); grid;
subplot(2, 2, 2); plot(w / pi, angle(H) / pi);
ylabel('\phi'); title('相位响应'); axis([0, 1, -1, 1]);
set(gca, 'XTickMode', 'manual', 'XTick', [0, wp / pi, ws / pi, 1]);
set(gca, 'YTickMode', 'manual', 'YTick', [-1, 0, 1]); grid;
subplot(2, 2, 3); plot(w / pi, dbH); title('幅度响应(dB)');
ylabel('dB'); xlabel('频率(\pi)'); axis([0, 1, -40, 5]);
set(gca, 'XTickMode', 'manual', 'XTick', [0, wp / pi, ws / pi, 1]);
set(gca, 'YTickMode', 'manual', 'YTick', [-50, -As, -Rp, 0]); grid;
subplot(2, 2, 4); zplane(bd, ad); axis([-1.1, 1.1, -1.1, 1.1]); title('零极点图');
saveas(h, '脉冲响应不变法', 'svg');
function [n, Omgc, bd, ad] = Bilinear_transformation(wp, Rp, ws, As, Fs)
% wp = 0.25 * pi; % 滤波器的通带截止频率
% ws = 0.4 * pi; % 滤波器的阻带截止频率
% Rp = 1; As = 15; % 滤波器的通阻带衰减指标
ripple = 10^(-Rp / 20); % 滤波器的通带衰减对应的幅度值
Attn = 10^(-As / 20); % 滤波器的阻带衰减对应的幅度值
Omgp = (2 / T) * tan(wp / 2); % 原型通带频率的预修正
Omgs = (2 / T) * tan(ws / 2); % 原型阻带频率的预修正
[n, Omgc] = buttord(Omgp, Omgs, Rp, As, 's'); % 计算阶数 n和截止频率
[z0, p0, k0] = buttap(n); % 设计归一化的巴特沃思模拟滤波器原型
bal = k0 * real(poly(z0)); % 求原型滤波器的系数b
aal = real(poly(p0)); % 求原型滤波器的系数a
[ba, aa] = lp2lp(bal, aal, Omgc); % 变换为模拟低通滤波器
%也可将以上4行替换为[ba,aa]=butter(n,Omgc,');直接求模拟滤波器系数
[bd, ad] = bilinear(ba, aa, Fs); % 求数字系统的频率特性
dbH = 20 * log10((abs(H) + eps) / max(abs(H)));
subplot(2, 2, 1); plot(w / pi, abs(H));
ylabel('|H|'); title('幅度响应'); axis([0, 1, 0, 1.1]);
set(gca, 'XTickMode', 'manual', 'XTick', [0, wp / pi, ws / pi, 1]);
set(gca, 'YTickMode', 'manual', 'YTick', [0, Attn, ripple, 1]); grid;
subplot(2, 2, 2); plot(w / pi, angle(H) / pi);
ylabel('\phi'); title('相位响应'); axis([0, 1, -1, 1]);
set(gca, 'XTickMode', 'manual', 'XTick', [0, wp / pi, ws / pi, 1]);
set(gca, 'YTickMode', 'manual', 'YTick', [-1, 0, 1]); grid;
subplot(2, 2, 3); plot(w / pi, dbH); title('幅度响应(dB)');
ylabel('dB'); xlabel('频率(pi)'); axis([0, 1, -40, 5]);
set(gca, 'XTickMode', 'manual', 'XTick', [0, wp / pi, ws / pi, 1]);
set(gca, 'YTickMode', 'manual', 'YTick', [-50, -As, -Rp, 0]); grid;
subplot(2, 2, 4); zplane(bd, ad);
axis([-1.1, 1.1, -1.1, 1.1]); title('零极点图');
saveas(h, '双线性变换法', 'svg');
function [n, Omgc, bd, ad] = LPF(wp, Rp, ws, As, Fs)
% wp = 0.25 * pi; % 滤波器的通带截止频率
% ws = 0.4 * pi; % 滤波器的阻带截止频率
% Rp = 1; As = 15; % 滤波器的通阻带衰减指标
ripple = 10^(-Rp / 20); % 滤波器的通带衰减对应的幅度值
Attn = 10^(-As / 20); % 滤波器的阻带衰减对应的幅度值
Omgp = (2 / T) * tan(wp / 2); % 原型通带频率的预修正
Omgs = (2 / T) * tan(ws / 2); % 原型阻带频率的预修正
[n, Omgc] = buttord(Omgp, Omgs, Rp, As, 's'); % 计算阶数 n和截止频率
[z0, p0, k0] = buttap(n); % 设计归一化的巴特沃思模拟滤波器原型
bal = k0 * real(poly(z0)); % 求原型滤波器的系数b
aal = real(poly(p0)); % 求原型滤波器的系数a
[ba, aa] = lp2lp(bal, aal, Omgc); % 变换为模拟低通滤波器
%也可将以上4行替换为[ba,aa]=butter(n,Omgc,');直接求模拟滤波器系数
[bd, ad] = bilinear(ba, aa, Fs); % 求数字系统的频率特性
dbH = 20 * log10((abs(H) + eps) / max(abs(H)));
subplot(2, 2, 1); plot(w / pi, abs(H));
ylabel('|H|'); title('幅度响应'); axis([0, 1, 0, 1.1]);
set(gca, 'XTickMode', 'manual', 'XTick', [0, wp / pi, ws / pi, 1]);
set(gca, 'YTickMode', 'manual', 'YTick', [0, Attn, ripple, 1]); grid;
subplot(2, 2, 2); plot(w / pi, angle(H) / pi);
ylabel('\phi'); title('相位响应'); axis([0, 1, -1, 1]);
set(gca, 'XTickMode', 'manual', 'XTick', [0, wp / pi, ws / pi, 1]);
set(gca, 'YTickMode', 'manual', 'YTick', [-1, 0, 1]); grid;
subplot(2, 2, 3); plot(w / pi, dbH); title('幅度响应(dB)');
% p = find(abs(w - wp / pi) < eps);
% plot(w(p), dbH(p), 'o', 'color', 'g');
% text(w(p), dbH(p), ['(',num2str(w(p)),',',num2str(dbH(p)),')'],'color','b');
% p = find(abs(w - ws / pi) < eps);
% plot(w(p), dbH(p), 'o', 'color', 'g');
% text(w(p), dbH(p), ['(',num2str(w(p)),',',num2str(dbH(p)),')'],'color','b');
ylabel('dB'); xlabel('频率(pi)'); axis([0, 1, -50, 5]);
set(gca, 'XTickMode', 'manual', 'XTick', [0, wp / pi, ws / pi, 1]);
set(gca, 'YTickMode', 'manual', 'YTick', [-50, -As, -Rp, 0]); grid;
subplot(2, 2, 4); zplane(bd, ad);
axis([-1.1, 1.1, -1.1, 1.1]); title('零极点图');
function [n, Omgc, bd, ad] = HPF(wp, Rp, ws, As, Fs)
% wp = 0.25 * pi; % 滤波器的通带截止频率
% ws = 0.4 * pi; % 滤波器的阻带截止频率
% Rp = 1; As = 15; % 滤波器的通阻带衰减指标
ripple = 10^(-Rp / 20); % 滤波器的通带衰减对应的幅度值
Attn = 10^(-As / 20); % 滤波器的阻带衰减对应的幅度值
Omgp = (2 / T) * tan(wp / 2); % 原型通带频率的预修正
Omgs = (2 / T) * tan(ws / 2); % 原型阻带频率的预修正
[n, Omgc] = buttord(Omgp, Omgs, Rp, As, 's'); % 计算阶数 n和截止频率
[z0, p0, k0] = buttap(n); % 设计归一化的巴特沃思模拟滤波器原型
bal = k0 * real(poly(z0)); % 求原型滤波器的系数b
aal = real(poly(p0)); % 求原型滤波器的系数a
[ba, aa] = lp2hp(bal, aal, Omgc); % 变换为模拟低通滤波器
%也可将以上4行替换为[ba,aa]=butter(n,Omgc,');直接求模拟滤波器系数
[bd, ad] = bilinear(ba, aa, Fs); % 求数字系统的频率特性
dbH = 20 * log10((abs(H) + eps) / max(abs(H)));
subplot(2, 2, 1); plot(w / pi, abs(H));
ylabel('|H|'); title('幅度响应'); axis([0, 1, 0, 1.1]);
set(gca, 'XTickMode', 'manual', 'XTick', [0, ws / pi, wp / pi, 1]);
set(gca, 'YTickMode', 'manual', 'YTick', [0, Attn, ripple, 1]); grid;
subplot(2, 2, 2); plot(w / pi, angle(H) / pi);
ylabel('\phi'); title('相位响应'); axis([0, 1, -1, 1]);
set(gca, 'XTickMode', 'manual', 'XTick', [0, ws / pi, wp / pi, 1]);
set(gca, 'YTickMode', 'manual', 'YTick', [-1, 0, 1]); grid;
subplot(2, 2, 3); plot(w / pi, dbH); title('幅度响应(dB)');
ylabel('dB'); xlabel('频率(pi)'); axis([0, 1, -50, 5]);
set(gca, 'XTickMode', 'manual', 'XTick', [0, ws / pi, wp / pi, 1]);
set(gca, 'YTickMode', 'manual', 'YTick', [-50, -As, -Rp, 0]); grid;
subplot(2, 2, 4); zplane(bd, ad);
axis([-1.1, 1.1, -1.1, 1.1]); title('零极点图');
function [N, Wc, bd, ad] = BPF(wp, Rp, ws, As, Fs)
ripple = 10^(-Rp / 20); % 滤波器的通带衰减对应的幅度值
Attn = 10^(-As / 20); % 滤波器的阻带衰减对应的幅度值
% WP = (2 / T) * tan(wp / 2); % 原型通带频率的预修正
% WS = (2 / T) * tan(ws / 2); % 原型阻带频率的预修正
[N, Wc] = buttord(WP, WS, Rp, As); % 求阶数和边缘频率
[bd, ad] = butter(N, Wc); % 求极点、零点和增益
% [N, Wc] = cheb2ord(WP, WS, Rp, As); % 求阶数和边缘频率
% [bd, ad] = cheby2(N, Rp, Wc); % 求极点、零点和增益
% [N, Wc] = cheb1ord(WP, WS, Rp, As); % 求阶数和边缘频率
% [bd, ad] = cheby1(N, Rp, Wc); % 求极点、零点和增益
dbH = 20 * log10((m + eps) / max(m));
subplot(2, 2, 1); plot(w / pi, m);
ylabel('|H|'); title('幅度响应'); axis([0, 1, 0, 1.1]);
set(gca, 'XTickMode', 'manual', 'XTick', [0, sort([WP, WS]), 1]); % [0, 0.15, 0.2, 0.6, 0.65, 1]
set(gca, 'YTickMode', 'manual', 'YTick', [0, Attn, ripple, 1]); grid;
subplot(2, 2, 2); plot(w / pi, p / pi);
ylabel('\phi'); title('相位响应'); axis([0, 1, -1, 1]);
set(gca, 'XTickMode', 'manual', 'XTick', [0, sort([WP, WS]), 1]); % [0, 0.15, 0.2, 0.6, 0.65, 1]
set(gca, 'YTickMode', 'manual', 'YTick', [-1, 0, 1]); grid;
subplot(2, 2, 3); plot(w / pi, dbH); title('幅度响应(dB)');
ylabel('dB'); xlabel('频率(pi)'); axis([0, 1, -50, 5]);
set(gca, 'XTickMode', 'manual', 'XTick', [0, sort([WP, WS]), 1]); % [0, 0.15, 0.2, 0.6, 0.65, 1]
set(gca, 'YTickMode', 'manual', 'YTick', [-50, -As, -Rp, 0]); grid;
subplot(2, 2, 4); zplane(bd, ad);
axis([-1.1, 1.1, -1.1, 1.1]); title('零极点图');
function [N, Wc, bd, ad] = BSF(wp, Rp, ws, As, Fs)
ripple = 10^(-Rp / 20); % 滤波器的通带衰减对应的幅度值
Attn = 10^(-As / 20); % 滤波器的阻带衰减对应的幅度值
% WP = (2 / T) * tan(wp / 2); % 原型通带频率的预修正
% WS = (2 / T) * tan(ws / 2); % 原型阻带频率的预修正
[N, Wc] = buttord(WP, WS, Rp, As); % 求阶数和边缘频率
[bd, ad] = butter(N, Wc, 'stop'); % 求极点、零点和增益
% [N, Wc] = ellipord(WP, WS, Rp, As); % 求阶数和边缘频率
% [bd, ad] = butter(N, Rp, Wc, 'stop'); % 求极点、零点和增益
% [N, Wc] = cheb2ord(WP, WS, Rp, As); % 求阶数和边缘频率
% [bd, ad] = cheby2(N, Rp, Wc, 'stop'); % 求极点、零点和增益
% [N, Wc] = cheb1ord(WP, WS, Rp, As); % 求阶数和边缘频率
% [bd, ad] = cheby1(N, Rp, Wc, 'stop'); % 求极点、零点和增益
dbH = 20 * log10((m + eps) / max(m));
subplot(2, 2, 1); plot(w / pi, m);
ylabel('|H|'); title('幅度响应'); axis([0, 1, 0, 1.1]);
set(gca, 'XTickMode', 'manual', 'XTick', [0, sort([WP, WS]), 1]); % [0, 0.15, 0.2, 0.6, 0.65, 1]
set(gca, 'YTickMode', 'manual', 'YTick', [0, Attn, ripple, 1]); grid;
subplot(2, 2, 2); plot(w / pi, p / pi);
ylabel('\phi'); title('相位响应'); axis([0, 1, -1, 1]);
set(gca, 'XTickMode', 'manual', 'XTick', [0, sort([WP, WS]), 1]); % [0, 0.15, 0.2, 0.6, 0.65, 1]
set(gca, 'YTickMode', 'manual', 'YTick', [-1, 0, 1]); grid;
subplot(2, 2, 3); plot(w / pi, dbH); title('幅度响应(dB)');
ylabel('dB'); xlabel('频率(pi)'); axis([0, 1, -50, 5]);
set(gca, 'XTickMode', 'manual', 'XTick', [0, sort([WP, WS]), 1]); % [0, 0.15, 0.2, 0.6, 0.65, 1]
set(gca, 'YTickMode', 'manual', 'YTick', [-50, -As, -Rp, 0]); grid;
subplot(2, 2, 4); zplane(bd, ad);
axis([-1.1, 1.1, -1.1, 1.1]); title('零极点图');