%% 练习一:汉明窗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
% 学号:______ 姓名:______
%% 数据加载
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 % 学号:______ 姓名:______ %% 参数定义 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 % 学号:______ 姓名:______ %% 参数定义 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