📝 DSP Lab 4 - 学生实验模板

📌 编程规范说明:
⚠️ 提交文件列表:
📄 exercise1_butterworth.m
%% 练习一:Butterworth 数字低通滤波器设计
% 文件名: exercise1_butterworth.m
% 学号:______  姓名:______

%% 设计指标
Fs = 80000;     % 采样频率 80 kHz
Fp = 4000;      % 通带边界 4 kHz
Fst = 20000;    % 阻带边界 20 kHz
Rp = 0.5;       % 通带最大衰减 0.5 dB
Rs = 45;        % 阻带最小衰减 45 dB

%% Step 1: 频率归一化
% TODO 归一化到Nyquist频率
Wp = [];
Ws = [];

%% Step 2: 确定滤波器阶次
% TODO 使用 buttord 函数
N_butt = [];
Wn_butt = [];

fprintf('Butterworth滤波器: N = %d, Wn = %.6f\n', N_butt, Wn_butt);

%% Step 3: 设计数字滤波器
% TODO 使用 butter 函数
num_d = [];
den_d = [];

%% Step 4: 计算频率响应
% TODO 使用 freqz 函数
H_butt = [];
f = [];

%% Step 5: 绘图
figure('Name', 'Butterworth滤波器');
% TODO 绘制幅度响应和相位响应


%% ========================================
%  🔍 提交前自检 (请勿修改以下代码)
%  ========================================
vars_chk = {'N_butt', 'Wn_butt', 'num_d', 'den_d', 'H_butt'};
miss = {};
for i = 1:length(vars_chk)
    if ~exist(vars_chk{i}, 'var') || isempty(eval(vars_chk{i}))
        miss{end+1} = vars_chk{i};
    end
end
if ~isempty(miss)
    fprintf(2, '❌ 错误:以下变量未赋值或为空:%s\n', strjoin(miss, ', '));
else
    fprintf('✅ 练习一变量检查通过。\n');
end
📄 exercise2_chebyshev.m
%% 练习二:Chebyshev I 型数字低通滤波器设计
% 文件名: exercise2_chebyshev.m
% 学号:______  姓名:______

%% 设计指标 (与练习一相同)
Fs = 80000; Fp = 4000; Fst = 20000; Rp = 0.5; Rs = 45;

%% Step 1: 频率归一化
% TODO 归一化到Nyquist频率
Wp = [];
Ws = [];

%% Step 2: 确定滤波器阶次
% TODO 使用 cheb1ord 函数
N_cheb = [];
Wn_cheb = [];

fprintf('Chebyshev I 滤波器: N = %d, Wn = %.6f\n', N_cheb, Wn_cheb);

%% Step 3: 设计数字滤波器
% TODO 使用 cheby1 函数
num_d_cheb = [];
den_d_cheb = [];

%% Step 4: 计算频率响应
% TODO 使用 freqz 函数
H_cheb = [];
f = [];

%% Step 5: 绘图
figure('Name', 'Chebyshev I 滤波器');
% TODO 绘制幅度响应和相位响应


%% Step 6: 与Butterworth对比
% TODO 绘制对比图,比较阶数差异


%% ========================================
%  🔍 提交前自检 (请勿修改以下代码)
%  ========================================
vars_chk = {'N_cheb', 'Wn_cheb', 'num_d_cheb', 'den_d_cheb', 'H_cheb'};
miss = {};
for i = 1:length(vars_chk)
    if ~exist(vars_chk{i}, 'var') || isempty(eval(vars_chk{i}))
        miss{end+1} = vars_chk{i};
    end
end
if ~isempty(miss)
    fprintf(2, '❌ 错误:以下变量未赋值或为空:%s\n', strjoin(miss, ', '));
else
    fprintf('✅ 练习二变量检查通过。\n');
end
📄 exercise3_elliptic.m
%% 练习三:Elliptic (Cauer) 数字低通滤波器设计
% 文件名: exercise3_elliptic.m
% 学号:______  姓名:______

%% 设计指标 (与练习一、二相同)
Fs = 80000; Fp = 4000; Fst = 20000; Rp = 0.5; Rs = 45;

%% Step 1: 频率归一化
% TODO 归一化到Nyquist频率
Wp = [];
Ws = [];

%% Step 2: 确定滤波器阶次
% TODO 使用 ellipord 函数
N_ellip = [];
Wn_ellip = [];

fprintf('Elliptic 滤波器: N = %d, Wn = %.6f\n', N_ellip, Wn_ellip);

%% Step 3: 设计数字滤波器
% TODO 使用 ellip 函数
num_d_ellip = [];
den_d_ellip = [];

%% Step 4: 计算频率响应
% TODO 使用 freqz 函数
H_ellip = [];
f = [];

%% Step 5: 绘图
figure('Name', 'Elliptic 滤波器');
% TODO 绘制幅度响应和相位响应


%% Step 6: 三种滤波器综合对比
% TODO 绘制三种滤波器对比图,输出阶数对比


%% ========================================
%  🔍 提交前自检 (请勿修改以下代码)
%  ========================================
vars_chk = {'N_ellip', 'Wn_ellip', 'num_d_ellip', 'den_d_ellip', 'H_ellip'};
miss = {};
for i = 1:length(vars_chk)
    if ~exist(vars_chk{i}, 'var') || isempty(eval(vars_chk{i}))
        miss{end+1} = vars_chk{i};
    end
end
if ~isempty(miss)
    fprintf(2, '❌ 错误:以下变量未赋值或为空:%s\n', strjoin(miss, ', '));
else
    fprintf('✅ 练习三变量检查通过。\n');
end
📄 exercise4_analysis.m
%% 练习四:分析与思考题
% 文件名: exercise4_analysis.m
% 学号:______  姓名:______

%% 思考题 A1: 音频处理系统中的滤波器选择
fprintf('========== A1: 音频处理系统 ==========\n\n');

fprintf('场景: 设计一个音频均衡器的低通滤波器\n\n');

% TODO 填写推荐的滤波器类型及理由
fprintf('推荐选择: ______ 滤波器\n\n');
fprintf('理由:\n');
fprintf('1. ______\n');
fprintf('2. ______\n');
fprintf('3. ______\n\n');

%% 思考题 A2: 通信系统中的滤波器选择
fprintf('========== A2: 通信系统 ==========\n\n');

fprintf('场景: 设计一个多路复用系统的信道选择滤波器\n\n');

% TODO 填写推荐的滤波器类型及理由
fprintf('推荐选择: ______ 滤波器\n\n');
fprintf('理由:\n');
fprintf('1. ______\n');
fprintf('2. ______\n');
fprintf('3. ______\n\n');

%% 思考题 A3: 实时系统的滤波器设计考量
fprintf('========== A3: 实时系统 ==========\n\n');

fprintf('场景: 嵌入式系统实时信号处理\n\n');

% TODO 分析关键考量因素
fprintf('关键考量因素:\n\n');
fprintf('1. ______\n');
fprintf('2. ______\n');
fprintf('3. ______\n');
fprintf('4. ______\n\n');

fprintf('实际建议:\n');
fprintf('______\n\n');