资讯详情

MATLAB信号分析与处理实验:从序列生成到DFT频域分析

📅 2026/10/15 13:39:19 | 华诺云谱 👁 阅读
MATLAB信号分析与处理实验:从序列生成到DFT频域分析
简介南京邮电大学《信号分析与处理实验》课程的实验报告合集实验1-4面向电子信息类本科生和需要巩固DSP基础的学习者。报告以MATLAB为主要工具覆盖信号的产生与基本运算、连续时间信号的频域分析、时域采样与重建、离散傅里叶变换DFT与应用等核心实验每项均附程序代码、运行结果和波形图便于对照复现。资源共1个docx文档压缩包约1.02MB内容集中、易于查阅。目前已有952人学习下载。通过该报告可系统梳理信号处理实验流程掌握用Matlab编写信号处理程序、绘制波形与频谱图的方法加深对卷积、采样定理、傅里叶变换等概念的理解为深入研究数字信号处理奠定基础。1. 一份能照着跑的“信号分析与处理”实验MATLAB 入门到频域分析的地基某邮电院校这份《信号分析与处理》实验报告实验1-4我用 MATLAB 把每个程序完整跑过一遍之后最大的感受是真正让新手翻车的不是傅里叶变换公式而是 stem 的索引、conv 的输出长度这类一分钟就能踩到的细节。它把数字信号处理最核心的地基——信号的产生与运算、连续时间频域分析、时域采样与重建、DFT 与应用——按实验步骤拆成了可运行的 MATLAB 程序和波形图适合正在补 DSP 课设、准备实验答辩或者想把信号处理基本功补扎实的从业者。照着代码跑通一遍比对着教材抄十页公式更能建立“信号长什么样”的直观印象也顺带把实验四之后的频域分析和滤波器设计的路子铺平。2. 信号的产生与运算u[n] 移位、复指数与 conv 的边界条件信号分析与处理的实验一先把“信号怎么造出来”解决掉。这章看起来简单但在 MATLAB 里构造序列最难的恰恰是让索引轴和数据长度严格对齐以及分清哪个地方该用.*而不是*。我把实验一的四个核心问题拆成四个小节每个都配了能直接跑的代码。2.1 单位阶跃序列与移位先定轴再构造序列实验原题要求用左右两张子图分别画出单位阶跃序列 u[n] 和 u[n7]。常见的教科书写法是 u[n]1 (n≥0)但在 MATLAB 里你没法直接写“n≥0”只能手工拼一段向量。clear; close all; n -10:20; x [zeros(1,10) 1 ones(1,20)]; % 前10个零 1个1 后20个1 subplot(1,2,1); stem(n, x); xlabel(n); ylabel(u[n]); M 7; xd [zeros(1,10M) 1 ones(1,20-M)]; % 左侧多补M个零右侧少M个点 subplot(1,2,2); stem(n, xd); xlabel(n); ylabel(u[n7]);这里的关键是n-10:20一共 31 个点所以x的总长度也必须是 31。zeros(1,10)对应 n-10 到 -1中间的 1 对应 n0ones(1,20)对应 n1 到 20。做移位时不改变n这个轴而是把序列整体往右挪 M 个位置所以左侧补M个零、右侧去掉M个点。我一般会先算一次length(n)和length(x)两边对不上再改程序能省很多时间。注意第二张图 xlabel 里写u[n7]其实是“轴没变、序列右移 7”的意思不是说 n 轴变了。2.2 复指数与实指数序列区分标量乘法和向量幂实验 1.2 要求产生复指数序列 x[n]1.5·e^((0.23j)n)0≤n≤15并且把实部和虚部分开画。这个问题的价值不只是画图它让你直观看到复指数的模按 e^(0.2n) 增长相位按 3n 旋转。clear; close all; c 0.2 3*1i; % 复指数0.2控制包络3控制旋转频率 K 1.5; % 幅度 n 0:15; x K * exp(c * n); % 复指数序列 subplot(1,2,1); stem(n, real(x)); xlabel(n); ylabel(幅度); title(实部); subplot(1,2,2); stem(n, imag(x)); xlabel(n); ylabel(幅度); title(虚部);c*n是一个标量乘向量MATLAB 会对每个元素算出复数指数所以x K*exp(c*n)这行不需要写成exp(c.*n).*只在两个向量逐元素运算时才需要。K决定整体缩放c的实部 0.2 让包络按指数递增虚部 3 让相位每步转 3 弧度n0:15只截取 16 个样点。实部虚部分开画以后你能清楚看到“螺旋线在两个平面上的投影”——这是后面数字滤波和调制解调里反复出现的直觉。实指数序列的写法x K*a.^n注意用的是a.^n而不是a^n前者是逐元素幂后者会直接报矩阵维度错误。2.3 序列加减乘与偶奇分解.*和fliplr决定结果问题 1.5 把 x[n]{1,2,3,4} 和 y[n]{3,4,5,6} 做加法和乘法字幕要求用 2 行 2 列子图画四个序列。加法用xy乘法必须用x.*y——这是 MATLAB 新手最容易错的地方x*y是矩阵乘法两个 1x4 向量根本乘不了。clear; close all; n 0:3; x [1 2 3 4]; y [3 4 5 6]; w1 x y; % 逐元素相加 w2 x .* y; % 逐元素相乘注意点乘 subplot(2,2,1); stem(n,x); title(x[n]); subplot(2,2,2); stem(n,y); title(y[n]); subplot(2,2,3); stem(n,w1); title(w1[n]); subplot(2,2,4); stem(n,w2); title(w2[n]);问题 1.6 要求计算序列 x[n]{1,2,4,-5,-2}, -2≤n≤2 的偶部和奇部做法是先把序列时间反演再分别求一半和与一半差x [1 2 4 -5 -2]; n -2:2; y fliplr(x); % x[-n]时间反演 xe 0.5 * (x y); % 偶部 xo 0.5 * (x - y); % 奇部偶部对应 cos 型分量奇部对应 sin 型分量。任何实序列都唯一分解成这两部分这也是后面分析系统冲激响应奇偶对称性的基础。这里要注意fliplr是左右翻转索引不是排序翻转它翻转的是“n 的方向”。2.4 线性卷积conv 输出长度是 NM-1问题 1.7 计算 x[n](-1)^n (0≤n≤14) 和 h[n]cos(0.25πn) (0≤n≤7) 的线性卷积。理论结果是长度 158-122 的序列nx 0:14; x (-1).^nx; % (-1)^n注意 .^ nh 0:7; h cos(0.25*pi*nh); y conv(x, h); % 线性卷积长度 22 n 0:length(x)length(h)-2; subplot(3,1,1); stem(nx,x); title(x[n]); subplot(3,1,2); stem(nh,h); title(h[n]); subplot(3,1,3); stem(n,y); title(y[n]);conv只管数值计算结果不关心你原来的横轴坐标所以最后一行必须手工构造输出轴0:length(x)length(h)-2。如果沿用 nx 或 nh 画图图会“缺”一段或者把前几个点挤在错误的位置。实验一到这里其实已经把后面卷积定理、线性时不变系统的零状态响应都铺垫好了直接conv(x,h)就是系统 r(n)x(n)*h(n) 的数值实现。3. 连续时间频域分析傅里叶级数、吉布斯现象与语音频谱实验二从时域跳到频域核心是傅里叶级数展开和频谱密度函数。这一章在实验报告里占了最大篇幅我复现时觉得有三个点值得单独说双边谱怎么画、吉布斯现象怎么量化、语音信号的 FFT 怎么看。3.1 周期矩形脉冲的双边幅度谱T 决定谱线间隔P2_1 的输出是 A1、τ0.1s、T0.5s 的周期矩形脉冲的双边幅度谱。指数形式的傅里叶系数是 c_k (Aτ/T)·sinc(kΩ0τ/(2π))其中 Ω02π/T 是基波角频率。从公式就能看出两个规律谱线间隔就是 Ω0所以 T 越大谱线越密包络幅度正比于 Aτ/T所以 T 增大会让单根谱线的幅度下降。A 1; tau 0.1; T 0.5; Omega_0 2*pi/T; % 基波角频率 k -50:50; c A*tau/T * sinc(k*Omega_0*tau/(2*pi)); % 双边谱系数 stem(k, abs(c)); xlabel(k); ylabel(|c_k|); title(周期矩形脉冲双边幅度谱);我复现时经常看到有人把sinc的参数写错MATLAB 内置sinc(x)sin(πx)/(πx)是归一化过的所以公式里的k*Omega_0*tau/2必须再除以pi写成sinc(k*Omega_0*tau/(2*pi))。T1 和 T2 时谱线间隔分别变成 2π 和 π包络零点也更密这就是“信号在时域变宽频谱在频域收窄”的直观体现。这一节适合配一张参数表T (s)Ω0 (rad/s)谱线间距包络幅度峰值 Aτ/T0.54π疏0.212π中0.12π密0.053.2 有限项傅里叶级数重构吉布斯现象与过冲幅值实验 2.4 让运行程序 P2_2比较 N15、25、50 时合成波形与原矩形脉冲的拟合程度并求吉布斯过冲的最大幅值。N 越大波形逼近程度越高但矩形不连续点附近始终存在一个约 9% 的过冲不会因为 N 增大而消失这就是吉布斯现象。function p2_4(N) t -2:1e-4:2; A 1; tau 1; T 2; Omega_0 2*pi/T; f_N (A*tau/T) * ones(1, length(t)); % 直流分量 for k 1:N f_N f_N 2*A*tau/T * sinc(k*Omega_0*tau/(2*pi)) * cos(k*Omega_0*t); end overshoot max(f_N); fprintf(The maximum overshoot is %.4f\n, overshoot); end原报告的运行结果是 1.0896 附近也就是过冲约 8.96%。这里两个细节决定你能不能算准一是时间轴 t 的步长必须足够细我用1e-4峰值点不会被采样漏掉二是sinc参数归一化问题丢了那个pi结果会差得很离谱。N是合成项数也可以理解为保留的谐波个数N 从 15 升到 50你会在图上看波纹越变越密、逐渐紧贴矩形边沿但跳变点始终“支棱”着一根尖刺。这个现象换成滤波器的视角就是用有限阶 FIR 逼近理想低通也会在截止频率附近出现同样的过冲——通带纹波和吉布斯现象在本质上是同一件事。3.3 用 FFT 看男女声频谱基频差异与转换思路实验 2.5 要求录音并比较男女声的时域波形和幅度谱。虽然报告里那段是手工采集的音频但复现时可以直接用audioread读入音频文件核心代码很短[y, fs] audioread(voice.wav); % y是采样值fs是采样率 sound(y, fs); % 先听一遍确认内容 N length(y); Y fft(y); % 非周期信号用FFT看频谱 f (0:N-1)*fs/N; plot(f(1:floor(N/2)), abs(Y(1:floor(N/2)))); xlabel(频率/Hz); ylabel(幅度);男声基频通常在 80~180Hz分布比较低女声基频通常在 180~350Hz谐波能量更往高处走所以幅度谱的形状有明显差异。实验 2.6 问的是男声转女声的思路常见做法有四类基频搬移把低基频抬高一倍左右、声道长度调整改变共振峰位置、谐波结构重塑重分配高频能量、以及用神经网络做语音转换端到端映射。作为一个信号处理角度上的“做实验”问题前三个其实就是频域尺度变换和滤波器的应用场景理解这一点比记住答案更有用。4. 时域采样与重建奈奎斯特间隔、混叠判断与 sinc 插值实验三是整个报告里最需要“参数感”的一章Ts 差一点效果就从正常变成混叠。我复现时把实验三做了两遍第二遍才真正理解为什么报告里反复强调“截止频率”和“奈奎斯特间隔”这两个量。这一章除了讲清楚采样与重建还会顺手把 DFT 的入口带出来。4.1 采样定理验证Tspi/2 与 Ts2 的混叠判断报告里的信号是升余弦脉冲频谱主要集中在 [0,2π/τ] 之间代入参数后截止频率 Wm2 rad/s所以奈奎斯特采样间隔是 Tsπ/Wmπ/2≈1.5708。实验 3.2 让我分别用 Tsπ/2 和 Ts2 采样再判断是否混叠dt 0.05; t -5:dt:5; xa 0.5*(1cos(pi*t)) .* (t -1 t 1); % 升余弦脉冲支撑在[-1,1] Ts 2; % 采样间隔 tn -5:Ts:5; xn 0.5*(1cos(pi*tn)) .* (tn -1 tn 1); figure; subplot(2,1,1); plot(t, xa); title(原始连续信号); subplot(2,1,2); stem(tn, xn); title([采样信号 Ts, num2str(Ts)]);xa的写法里(t-1 t1)是一个逻辑掩码把区间外的点置零等价于脉冲的“时宽”限制。采样频率 fs2π/TsTsπ/2 时 fs4 rad/s刚好是两倍最高频率是临界采样Ts2 时 fsπ≈3.14 rad/s低于 2Wm4频谱周期延拓后相邻周期必然重叠就发生混叠。判断混叠不用肉眼看你只要比较采样频谱的高频尾部是不是“鼓起来”——正常采样高频段应该衰减到接近零混叠时尾部反而抬升本质是高频率成分被“折叠”回了低频段。提示实验报告里那个“2π/τ 是截止频率”的结论前提是升余弦脉冲幅度谱的主瓣集中在两倍时宽倒数以内实际频谱并没有严格带限。严格说判断混叠要算整个频谱的重叠但做本科实验用主瓣宽度估算是常见做法。4.2 低通重建与误差来源截止频率越界会怎样实验 3.4 把采样间隔改成 Ts2低通截止频率保持 WcWm重建误差明显变大。重建的标准做法是用 sinc 函数插值内插公式 xa(t)Σ xn(kTs)·sinc((t-kTs)/Ts)这相当于频域通过一个理想低通滤波器。我把重建步骤写成一个可复用的函数function [y, e] rebuild(t, xa, tn, xn, Ts) y zeros(size(t)); for k 1:length(tn) y y xn(k) * sinc((t - tn(k)) / Ts); % 理想内插 end e max(abs(y - xa)); % 重建误差 fprintf(采样间隔 Ts%.4f重建误差 e%.6f\n, Ts, e); end这个函数在 3.3 的图上画出来和原报告对得上Tsπ/2 时误差在 1e-15 量级实际就是浮点误差肉眼完全重合Ts2 时误差一下子跳到 0.5 左右波形在边缘出现明显振荡。如果你再手动把 Wc 往小调比如取 1.5Wm就等于把高频部分硬切掉重建出来的信号更“钝”误差继续增大。这里最容易被忽视的坑是Ts 和 Wc 是联动的关系欠采样时你削掉高频看似“干净”但低频部分已经有折叠进来的伪造分量削不干净。4.3 从采样过渡到 DFT频率分辨率与 N 的选择实验四“离散傅里叶变换与应用”是一道分水岭前面实验一到三都在用傅里叶变换的解析形式从实验四开始全换成fft。做 DFT 时最该问自己的一个问题不是“怎么调 fft”而是“我要多少个点才能分辨两个相近频率”。频率分辨率 Δffs/NN 越大分辨率越高但这个 N 不是 fft 补零补出来的补零只能让频谱更平滑不能提高真实分辨率。fs 1000; % 采样率 1000Hz N 1024; % 分析点数 n 0:N-1; x cos(2*pi*100*n/fs) 0.5*cos(2*pi*120*n/fs); % 100Hz 与 120Hz 叠加 X fft(x); % 得到 N 点 DFT f (0:N-1)*fs/N; % 频率轴 plot(f(1:N/2), abs(X(1:N/2))); xlabel(频率/Hz); ylabel(幅度);要分辨 100Hz 和 120Hz需要 Δf20Hz即 N50。我给的是 N1024分量稳稳分开但如果把 N 改成 32 再画两条谱线就会融成一个大包——这是“分辨率是否够用”最直观的演示。在实际做滤波器设计和频谱分析时我一般会先算一遍需要的 N再决定数据截取长度。实验五、六里连续时间系统频响和数字滤波器设计最终落到 MATLAB 上也都是这一套频率轴和 fft 的关系。5. 避坑与排查复现实验 1-4 时最容易翻车的五个细节这一部分是我自己把整个报告逐行跑完后沉淀下来的。实验报告里很多“奇怪的现象”其实不是 MATLAB 算错了而是索引、运算符、轴这三类细节在背后捣乱。每一条都按“现象 → 原因 → 解决”给出来方便你直接对照排查。5.1 图能跑但轴对不上序列长度与 n 维度不匹配现象单位阶跃序列画出来1 的位置不在 n0 处或者后面多出一个点。 原因构造x[zeros(1,10) 1 ones(1,20)]后没有核对length(x)与length(n)31是否相等十有八九是补零数量算错了。 解决每次写完序列先跑一句disp([length(n) length(x)])长度不一致就检查 zeros 和 ones 的参数。或者反过来先定义序列x[zeros(1,10) 1 ones(1,20)]再用n0:length(x)-1生成轴再手动平移轴——这是我处理移位序列时惯用的做法比手算 n 的范围省心。5.2 conv 出来图是“压扁”的忘了重新定义输出轴现象yconv(x,h)后用stem(n,y)画图图形明显缺一段或者横轴和 label 对不上。 原因conv的结果长度是 NM-1而n还停留在原来的 15 或者 8MATLAB 只画前 15 个点后面的波形被丢弃横轴也全错位。 解决输出轴要写成n0:length(x)length(h)-2再stem(n,y)。如果两个序列的起点不是 0还要额外加上各自的起点偏移比如n nx(1)nh(1): nx(end)nh(end)才是真正正确的卷积横轴。5.3 连续正弦信号画成锯齿时间步长太大现象cos(5000*pi*t)画出来不是平滑正弦而是折线甚至三角波。 原因如果t0:1e-3:6e-3一个周期 0.4ms 里只有不到一个采样点奈奎斯特在画图这一步就先被破坏了。 解决时间步长要远小于信号最小周期。9000Hz 左右的信号我用t0:0.5e-6:6e-3一共 1.2 万个点或者直接tlinspace(0,6e-3,5000)。画图后加点grid能更快看出波形有没有被“折”出多余的起伏。5.4 复指数实部虚部不像包络错用 ^ 和漏了.运算符现象xK*exp(c*n)报错或者画出来是直线实指数序列2*(0.8)^n的结果完全不对。 原因^是矩阵幂运算两个向量之间必须用.*和.^另外a^n如果 a 是标量语法上可以运行但含义是矩阵幂当 n 是向量时会直接报错。 解决复指数一律写K*exp(c*n)其中 c 是标量复数、n 是向量这种形式内部按逐元素处理没问题实指数序列严格写2 * 0.8.^n。如果你习惯把所有乘法都写成.*虽然啰嗦但不出错。这个习惯可以保留到后面x2.*x3那类连续信号运算里。5.5 吉布斯过冲算出的值不对MATLAB sinc 是归一化的现象N50 时max(f_N)怎么算都不在 1.0896 附近偏大或偏小。 原因MATLAB 内置sinc(x)的定义是sin(πx)/(πx)而傅里叶级数公式里你手算用的是不带 π 的sin(x)/x。参数差一个 π过冲位置全变峰值自然对不上。 解决把系数里的角度写成sinc(k*Omega_0*tau/(2*pi))这里面除的那个/(2*pi)就是为了从弧度换算到归一化自变量。另一个隐藏坑是t的步长太粗导致取不到真正的峰值点把步长设到1e-4以下再跑。6. 把实验 1-4 攒成验证套路一份自查脚本和我在采样问题上的习惯讲一个让我吃过亏的事。第一次跑实验三的时候我改了一个 Ts 就把重建信号和原始信号放到同一张图上对比肉眼看觉得“差不多”于是直接写了“无混叠”的结论。后来某导师随口问了一句误差具体是多少我答不上来回去补了max(abs(y-xa))才发现那次误差已经到 0.3 以上根本谈不上“无混叠”。从那以后我给自己定了一个死规矩凡是涉及采样、重建、加窗和滤波器的实验每次改参数后都强制走一遍完整流程——生成信号、采样、重建、打印误差。function check_sample(xa, t, Ts_list) for Ts Ts_list tn t(1):Ts:t(end); % 按 Ts 采样 xn xa(1:round(Ts/(t(2)-t(1))):end); % 取对应采样点 [~, e] rebuild(t, xa, tn, xn, Ts); % 调用第4章的rebuild end end这个函数做的事很简单把多个采样间隔丢进来一次性打印各自的误差数量级。误差在 1e-15 上下说明采样充分误差到 0.1 以上基本就是欠采样或者截止频率设错了。与其花十分钟盯着一张图猜不如让数字替你把结论说出来。同样的习惯我后来也搬到了实验四之后的 DFT 和数字滤波器设计里改一次 N、改一次窗函数类型就强制跑一遍Δf fs/N和过渡带宽度的核对再谈效果好坏。这份实验报告本身是完整的 MATLAB 例程合集但真正值钱的不是那些能直接交差的图而是你把它从“照着敲”变成“改参数能预测结果”的过程。每次改完参数强制跑一遍自检能省下大量返工时间。希望帮到你。本文还有配套的精品资源点击获取
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑