📝 DSP Lab 3 - 学生实验模板

📌 编程规范说明:
📂 实验数据文件:
⚠️ 提交文件列表:
📄 exercise1_fir_design.m
%% 练习一:汉明窗FIR低通滤波器设计与信号滤波
% 文件名: exercise1_fir_design.m
% 学号:______  姓名:______

%% 设计参数
M = 31;                 % 滤波器阶数
N = M + 1;              % 滤波器长度
omega_c = pi / 4;       % 截止角频率
Wn = omega_c / pi;      % 归一化截止频率

n_signal = 0:127;       % 信号长度
omega1 = pi / 3;        % 阻带测试频率
omega2 = pi / 6;        % 通带测试频率

%% 任务一:设计滤波器
% TODO 使用fir1设计汉明窗FIR低通滤波器
h = [];

%% 任务二:频率响应分析
Nfft = 1024;
% TODO 计算频率响应
H = [];
w = [];

% TODO 绘制幅度响应(dB)和相位响应
figure('Name', '任务二: 频率响应');


%% 任务三:双音信号滤波
% TODO 生成测试信号 x[n] = cos(ω1*n) + cos(ω2*n)
x = [];

% TODO 使用conv滤波
y = [];

% TODO 计算FFT并绘制频谱对比
Nfft_sig = 1024;
X_fft = [];
Y_fft = [];

figure('Name', '任务三: 信号滤波');


%% ========================================
%  🔍 提交前自检 (请勿修改以下代码)
%  ========================================
vars_chk = {'h', 'H', 'y', 'X_fft', 'Y_fft'};
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_speech_filtering.m
%% 练习二:语音信号滤波综合实验
% 文件名: exercise2_speech_filtering.m
% 学号:______  姓名:______

%% 数据加载
load('phdist.mat');     % a1,b1,a2,b2,a3,b3,xnoise
load('orig.mat');       % x, Fs

% 如果数据文件中没有Fs,设置默认值;确保为double类型
if ~exist('Fs', 'var'), Fs = 8000; end
Fs = double(Fs);

fprintf('采样率: Fs = %d Hz\n', Fs);

%% 任务一:幅度响应对比
Nfft = 1024;
% TODO 计算三个滤波器的频率响应
H1 = [];
H2 = [];
H3 = [];
w = [];

% TODO 绘制幅度响应对比图(dB)
figure('Name', '任务一: 幅度响应');


%% 任务二:相位响应对比
% TODO 计算相位响应 (使用unwrap)
H1_phase = [];
H2_phase = [];
H3_phase = [];

% TODO 绘制相位响应对比图
figure('Name', '任务二: 相位响应');


%% 任务三:主观听觉测试
% TODO 对原始语音x滤波
y1 = [];
y2 = [];
y3 = [];

% 取消注释播放:
% soundsc(y1, Fs); pause(length(y1)/Fs+0.5);

%% 任务四:噪声分析与去噪
% TODO 对xnoise去噪
yn1 = [];
yn2 = [];
yn3 = [];

% TODO 绘制频谱对比
figure('Name', '任务四: 去噪效果');


%% ========================================
%  🔍 提交前自检 (请勿修改以下代码)
%  ========================================
vars_chk = {'H1', 'H2', 'H3', 'y1', 'y2', 'y3', 'yn1', 'yn2', 'yn3'};
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_window_length.m
%% 练习三:窗函数长度对滤波器性能的影响
% 文件名: exercise3_window_length.m
% 学号:______  姓名:______

%% 参数定义
N1 = 31;  N2 = 121;     % 窗长度
M1 = 30;  M2 = 120;     % 滤波器阶数
Wn = 0.4;               % 截止频率
Fs = 48000;             % 采样率
f_cpu = 100e6;          % CPU时钟

%% 任务一:矩形窗频谱分析
% TODO 生成矩形窗
w1 = [];
w2 = [];

% TODO 计算4096点FFT
Nfft = 4096;
W1 = [];
W2 = [];

% TODO 绘制频谱对比
figure('Name', '任务一: 矩形窗频谱');


%% 任务二:FIR滤波器性能对比
% TODO 设计汉明窗FIR滤波器
h1 = [];
h2 = [];

% TODO 计算频率响应
H1 = [];
H2 = [];
H1_dB = [];
H2_dB = [];

% TODO 绘制幅度响应对比
figure('Name', '任务二: FIR性能对比');


%% 任务三:计算复杂度分析
% TODO 计算MAC操作数和CPU利用率
mac1 = [];
mac2 = [];
util1 = [];
util2 = [];

fprintf('M=%d: %dMAC, %.2f%%利用率\n', M1, mac1, util1);
fprintf('M=%d: %dMAC, %.2f%%利用率\n', M2, mac2, util2);

%% ========================================
%  🔍 提交前自检
%  ========================================
vars_chk = {'W1', 'W2', 'h1', 'h2', 'H1_dB', 'H2_dB', 'mac1', 'mac2'};
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_window_comparison.m
%% 练习四:窗函数性能对比与优化设计
% 文件名: exercise4_window_comparison.m
% 学号:______  姓名:______

%% 参数定义
M = 31;  N = M + 1;
Wn = 0.4;
Nfft = 4096;

%% 任务一:四种窗函数对比
% TODO 设计四种窗函数的滤波器
h_rect = [];
h_hann = [];
h_hamm = [];
h_black = [];

% TODO 测量阻带衰减
atten_rect = [];
atten_hann = [];
atten_hamm = [];
atten_black = [];

% TODO 绘制对比图
figure('Name', '任务一: 窗函数对比');


%% 任务二:凯泽窗参数优化
% TODO β=3,5,7,9的凯泽窗对比
figure('Name', '任务二: 凯泽窗');


%% 任务三:阶数影响
% TODO M=15,31,63,127的汉明窗对比
figure('Name', '任务三: 阶数影响');


%% 任务四:设计挑战
% 规格: ωp=0.3π, ωs=0.5π, 阻带≥60dB
% TODO 设计满足规格的滤波器
M_design = [];
h_design = [];

% TODO 验证设计
figure('Name', '任务四: 设计验证');


%% ========================================
%  🔍 提交前自检
%  ========================================
vars_chk = {'h_rect', 'h_hann', 'h_hamm', 'h_black', 'h_design'};
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