%% 练习一:指数序列的频谱分析 % 文件名: 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 % 学号:______ 姓名:______ 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
%% 练习三:实际信号频谱分析
% 文件名: exercise3_tone_analysis.m
% 学号:______ 姓名:______
clear; clc; close all;
%% 1. 加载数据
if exist('tones.mat', 'file')
load('tones.mat'); % 加载变量 y 和 Fs
else
error('未找到 tones.mat 文件,请确保文件在当前目录下');
end
%% 2. 频谱分析 (关键变量,请勿改名)
X_orig = []; % TODO 原始长度N的FFT结果
X_25 = []; % TODO N=25点的FFT结果 (用于批改点检测)
% 扩展分析 (可选变量名)
X_2x = []; % TODO 2倍长度补零FFT
X_4x = []; % TODO 4倍长度补零FFT
%% 3. 峰值检测
% TODO 打印主要频率分量 (findpeaks)
%% 4. 绘图
% TODO 绘制时域波形、不同分辨率的频谱对比图
figure('Name', 'Exercise 3: 音调信号分析');
% 在此处编写绘图代码...
%% ========================================
% 🔍 提交前自检 (请勿修改以下代码)
% =======================================
vars_chk = {'X_orig', 'X_25'};
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
function X = MyDFT(x, N)
%% MyDFT - 自定义DFT函数
% 输入:
% x - 输入序列
% N - DFT点数(可选,默认为序列长度)
% 输出:
% X - N点DFT结果 (必须赋值给此变量)
%% 1. 参数初始化
if nargin < 2
% TODO 如果未提供N,默认N为x的长度
N = length(x);
end
%% 2. 预处理 (补零或截断)
% TODO 根据N和x的长度关系,对x进行处理
x_processed = x; % 请修改此处逻辑
%% 3. DFT核心计算
X = zeros(N, 1); % 初始化输出
% TODO 实现DFT公式:X[k] = sum(x[n] * exp(-j*2*pi*k*n/N))
% 建议使用矩阵运算以提高效率,也可以使用双重循环
%% 4. 输出格式调整
% TODO 确保输出 X 的行列方向与输入 x 一致
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