function hd = ideal_lp(wc, N) % 点0到N-1之间的理想脉冲响应
% Hd = ideal_lp(wc2,N) - ideal_lp(wc1,N)
% Hd = ideal_lp(pi,N) - ( ideal_lp(wc2,N) - ideal_lp(wc1,N) )
m = n - tao + eps; % 加一个小数以避免0作除数
hd = sin(wc * m) ./ (pi * m);
function [N, wc, Rp, As] = FIR(wp, ws, ap, as, use_fir1)
% N0 = ceil(6.6 * pi / deltaw); % hamming
% N0 = ceil(11 * pi / deltaw); % blackman
N0 = ceil(11 * pi / deltaw); % 修改1
N = N0 + mod(N0 + 1, 2); % 为实现FIR类型1偶对称滤波器,应确保N为奇数
% windows = hamming(N)'; % hamming
% windows = blackman(N)'; % blackman
windows = blackman(N)'; % 修改2
wc = (ws + wp) / 2; % 截止频率取归一化通阻带频率的平均值
hd = ideal_lp(wc, N); % 不用 fir1 函数
% windows = hamming(N); % hamming
% windows = blackman(N); % blackman
windows = blackman(N); % 修改3
wc = (ws + wp) / 2 / pi; % 截止频率取归一化通阻带频率的平均值
b = fir1(N - 1, wc, windows); % 用 fir1 函数求系统函数系数,windows可省略
[H, w] = freqz(b, 1, 1000, 'whole');
db = 20 * log10((mag + eps) / max(mag));
Rp = -(min(db(1:floor(wp / dw) + 1))); % 检验通带波动
As = -round(max(db(floor(wp / dw) + 1:501))); % 检验最小阻带衰减
axis([0, N, 1.1 * min(b), 1.1 * max(b)]);
ylabel('H(e^{j\omega})');
set(gca, 'XTickMode', 'manual', 'XTick', [0, wp / pi, ws / pi, 1]);
set(gca, 'YTickMode', 'manual', 'YTick', [-80, -as, -ap, 0]); grid;
set(gca, 'XTickMode', 'manual', 'XTick', [0, wp / pi, ws / pi, 1]);
set(gca, 'YTickMode', 'manual', 'XTick', [-3.1416, 0, 3.1416, 4]); grid;
saveas(h, '第2问-FIR数字低通滤波器-频率响应曲线', 'svg');
function [N, wc, Rp, As] = LPF(wp, ws, ap, as, use_win)
N0 = ceil(6.1 * pi / deltaw); % 修改1
N = N0 + mod(N0 + 1, 2); % 为实现FIR类型1偶对称滤波器,应确保N为奇数
wc = (ws + wp) / 2 / pi; % 截止频率取归一化通阻带频率的平均值
b = fir1(N - 1, wc, 'low'); % 用fir1 函数求系统函数系数
windows = triang(N); % 修改2
b = fir1(N - 1, wc, windows); % 用fir1 函数求系统函数系数
[H, w] = freqz(b, 1, 1000, 'whole');
db = 20 * log10((mag + eps) / max(mag));
Rp = -(min(db(1:wp / dw + 1))); % 检验通带波动
As = -round(max(db(ws / dw + 1:501))); % 检验最小阻带衰减
axis([0, N, 1.1 * min(b), 1.1 * max(b)]);
set(gca, 'XTickMode', 'manual', 'XTick', [0, wp / pi, ws / pi, 1]);
set(gca, 'YTickMode', 'manual', 'YTick', [-as-10, -as, -ap, 0]); grid;
ylabel('H(e^{j\omega})');
set(gca, 'XTickMode', 'manual', 'XTick', [0, wp / pi, ws / pi, 1]);
set(gca, 'YTickMode', 'manual', 'YTick', [-as-10, -as, -ap, 0]); grid;
set(gca, 'XTickMode', 'manual', 'XTick', [0, wp / pi, ws / pi, 1]);
set(gca, 'YTickMode', 'manual', 'YTick', [-3.1416, 0, 3.1416, 4]); grid;
saveas(h, 'FIR-LPF-频率响应曲线', 'svg');
function [N, wc, Rp, As] = HPF(wp, ws, ap, as, use_win)
N0 = ceil(6.2 * pi / deltaw); % 修改1
N = N0 + mod(N0 + 1, 2); % 为实现FIR类型1偶对称滤波器,应确保N为奇数
wc = (ws + wp) / 2 / pi; % 截止频率取归一化通阻带频率的平均值
b = fir1(N - 1, wc, 'high'); % 用fir1 函数求系统函数系数
windows = hanning(N); % 修改2
b = fir1(N - 1, wc, windows); % 用fir1 函数求系统函数系数
[H, w] = freqz(b, 1, 1000, 'whole');
db = 20 * log10((mag + eps) / max(mag));
Rp = -(min(db(1:wp / dw + 1))); % 检验通带波动
As = -round(max(db(ws / dw + 1:501))); % 检验最小阻带衰减
axis([0, N, 1.1 * min(b), 1.1 * max(b)]);
set(gca, 'XTickMode', 'manual', 'XTick', [0, wp / pi, ws / pi, 1]);
set(gca, 'YTickMode', 'manual', 'YTick', [-as-10, -as, -ap, 0]); grid;
ylabel('H(e^{j\omega})');
set(gca, 'XTickMode', 'manual', 'XTick', [0, wp / pi, ws / pi, 1]);
set(gca, 'YTickMode', 'manual', 'YTick', [-as-10, -as, -ap, 0]); grid;
set(gca, 'XTickMode', 'manual', 'XTick', [0, wp / pi, ws / pi, 1]);
set(gca, 'YTickMode', 'manual', 'YTick', [-3.1416, 0, 3.1416, 4]); grid;
saveas(h, 'FIR-HPF-频率响应曲线', 'svg');
function [N, wcl, wch, Rp, As] = BPF(wp, ws, ap, as)
deltaw = min(abs(wp - ws));
N0 = ceil(6.6 * pi / deltaw); % 修改1
N = N0 + mod(N0 + 1, 2); % 为实现FIR类型1偶对称滤波器,应确保N为奇数
wcl = (ws(1) + wp(1)) / 2; % 截止频率取归一化通阻带频率的平均值
wch = (ws(2) + wp(2)) / 2; % 截止频率取归一化通阻带频率的平均值
hd = ideal_lp(wch, N) - ideal_lp(wcl, N);
[H, w] = freqz(h, 1, 1000, 'whole');
db = 20 * log10((mag + eps) / max(mag));
Rp = -(min(db(1:wp / dw + 1))); % 检验通带波动
As = -round(max(db(ws / dw + 1:501))); % 检验最小阻带衰减
axis([0, N, 1.1 * min(b), 1.1 * max(b)]);
set(gca, 'XTickMode', 'manual', 'XTick', [0, sort([wp, ws]) / pi, 1]);
set(gca, 'YTickMode', 'manual', 'YTick', [-as-10, -as, -ap, 0]); grid;
ylabel('H(e^{j\omega})');
set(gca, 'XTickMode', 'manual', 'XTick', [0, sort([wp, ws]) / pi, 1]);
set(gca, 'YTickMode', 'manual', 'YTick', [-as-10, -as, -ap, 0]); grid;
set(gca, 'XTickMode', 'manual', 'XTick', [0, sort([wp, ws]) / pi, 1]);
set(gca, 'YTickMode', 'manual', 'YTick', [-3.1416, 0, 3.1416, 4]); grid;
saveas(h, 'FIR-BPF-频率响应曲线', 'svg');
function [N, wcl, wch, Rp, As] = BSF(wp, ws, ap, as)
deltaw = min(abs(wp - ws));
N0 = ceil(6.6 * pi / deltaw); % 修改1
N = N0 + mod(N0 + 1, 2); % 为实现FIR类型1偶对称滤波器,应确保N为奇数
wcl = (ws(1) + wp(1)) / 2; % 截止频率取归一化通阻带频率的平均值
wch = (ws(2) + wp(2)) / 2; % 截止频率取归一化通阻带频率的平均值
hd = ideal_lp(pi, N) - ideal_lp(wch, N) + ideal_lp(wcl, N);
[H, w] = freqz(h, 1, 1000, 'whole');
db = 20 * log10((mag + eps) / max(mag));
Rp = -(min(db(1:wp / dw + 1))); % 检验通带波动
As = -round(max(db(ws / dw + 1:501))); % 检验最小阻带衰减
axis([0, N, 1.1 * min(b), 1.1 * max(b)]);
set(gca, 'XTickMode', 'manual', 'XTick', [0, sort([wp, ws]) / pi, 1]);
set(gca, 'YTickMode', 'manual', 'YTick', [-as-10, -as, -ap, 0]); grid;
ylabel('H(e^{j\omega})');
set(gca, 'XTickMode', 'manual', 'XTick', [0, sort([wp, ws]) / pi, 1]);
set(gca, 'YTickMode', 'manual', 'YTick', [-as-10, -as, -ap, 0]); grid;
set(gca, 'XTickMode', 'manual', 'XTick', [0, sort([wp, ws]) / pi, 1]);
set(gca, 'YTickMode', 'manual', 'YTick', [-3.1416, 0, 3.1416, 4]); grid;
saveas(h, 'FIR-BSF-频率响应曲线', 'svg');