📝 DSP Lab 1 - 学生实验模板

📌 编程规范说明:
⚠️ 提交检查:
📄 exercise1_exponential_spectrum.m
%% 练习一:指数序列的频谱分析
% 文件名: exercise1_exponential_spectrum.m
% 学号:______  姓名:______

clear; clc; close all;

%% 1. 参数定义
a = 0.9;
N_signal = 8;

%% 2. 序列生成
x = [];          % TODO 生成指数序列 x[n] = a^n, n=0..N_signal-1

%% 3. DTFT计算
omega = linspace(0, 2*pi, 512);
X_dtft = [];     % TODO 计算DTFT (在omega上采样)

%% 4. DFT计算 (关键变量,请勿改名)
X_dft_8   = [];  % TODO 计算 8点 DFT
X_dft_16  = [];  % TODO 计算 16点 DFT
X_dft_128 = [];  % TODO 计算 128点 DFT

%% 5. 绘图
% TODO 绘图要求:2行3列子图
% 1. 原始序列 x[n]
% 2. DTFT幅度谱 |X|
% 3. DTFT相位谱 Angle
% 4. 8点DFT (stem) vs DTFT (plot)
% 5. 16点DFT (stem) vs DTFT (plot)
% 6. 128点DFT (stem) vs DTFT (plot)

figure('Name', 'Exercise 1: 指数序列频谱分析');
% 在此处编写绘图代码...


%% ========================================
%  🔍 提交前自检 (请勿修改以下代码)
%  =======================================
vars_chk = {'x', 'X_dft_8', 'X_dft_16', 'X_dft_128'};
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, '❌ 错误:以下变量未赋值或为空,无法通过批改:\n   -> %s\n', miss{:});
else
    fprintf('✅ 练习一变量检查通过。\n');
end
📄 exercise2_convolution_theorem.m
%% 练习二:卷积定理验证
% 文件名: exercise2_convolution_theorem.m
% 学号:______  姓名:______

clear; clc; close all;

%% 1. 序列定义
x = [];          % TODO 定义序列 x (如 [1,1,1,1])
h = [];          % TODO 定义序列 h (如 [1,1,1,1])

%% 2. 线性卷积
z_linear = [];   % TODO 计算线性卷积 (使用conv)

%% 3. 循环卷积 (关键变量,请勿改名)
% 方法:DFT -> 点乘 -> IDFT
z_circ = [];     % TODO 计算4点循环卷积结果

%% 4. FFT快速计算线性卷积
% 提示:需要补零到 L >= Nx + Nh - 1
z_fast_conv = []; % TODO 使用FFT计算线性卷积

%% 5. 绘图
% TODO 绘图要求:2行3列
% 展示 x[n], h[n], 线性卷积, 循环卷积, 快速卷积结果

figure('Name', 'Exercise 2: 卷积定理验证');
% 在此处编写绘图代码...


%% ========================================
%  🔍 提交前自检 (请勿修改以下代码)
%  =======================================
vars_chk = {'x', 'h', 'z_linear', 'z_circ', 'z_fast_conv'};
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, '❌ 错误:以下变量未赋值或为空,无法通过批改:\n   -> %s\n', miss{:});
else
    fprintf('✅ 练习二变量检查通过。\n');
end

💡 本地验证建议

建议在编写完代码后,在命令行窗口运行以下测试,确保你的 MyDFT 结果正确:

x = [1, 2, 3, 4];

% 测试1:基本功能
X1 = MyDFT(x, 4);
err1 = norm(X1 - fft(x, 4));
fprintf('Test 1 Error: %e\n', err1); % 应该非常接近 0

% 测试2:补零测试 (N=8)
X2 = MyDFT(x, 8);
err2 = norm(X2 - fft(x, 8));
fprintf('Test 2 Error: %e\n', err2); % 应该非常接近 0