☰
信号处理实验避坑指南:从MATLAB代码到原理的深度解析
2026/10/23 18:00:06 网站建设 项目流程

简介:这份南京邮电大学《信号分析与处理实验》报告合集,面向正在修读数字信号处理(DSP)课程、需要完成MATLAB实验的本科生与自学者,帮助读者系统梳理信号产生与运算、频域分析、时域采样与重建、离散傅里叶变换等核心实验环节。资源包内含1个docx文档,压缩后约1.02MB,以实验报告正文为主体,完整记录四个实验的目的、内容、MATLAB程序代码、波形图与结果分析,可直接对照复现单位阶跃、复指数、实指数、正弦序列及卷积、奇偶分解等典型操作。目前已有952人学习下载,读者可借此掌握连续与离散信号的时域和频域特性、采样定理验证方法以及DFT的编程实现思路,为后续数字滤波器设计与信号处理综合应用打下基础,适合作为实验预习、报告撰写与期末复习的参考材料。

1. 信号处理实验:为什么"能跑通"和"真理解"之间隔着一道鸿沟

很多做过 MATLAB 信号处理实验的人都有过这种体验:代码跑出来了,图也画出来了,实验报告一交,这门课就算翻篇了。可一旦被问到"为什么采样间隔取这个值""为什么 N 取 50 的时候波形还是有过冲""为什么男女声频谱差异在低频段最明显",脑子里就只剩下一句"老师说的"。

这份信号分析与处理实验报告,覆盖了从信号产生、频域分析、时域采样与重建,到离散傅里叶变换、数字滤波器设计的完整链路。它的价值不在于告诉你"怎么调 MATLAB 函数",而在于用可复现的程序和图形结果,把信号处理里那些"看起来理所当然"的结论背后的机制摊开给你看。换句话说,它是一份能让你从"跑通代码"走到"讲清原理"的实操记录。

接下来的内容,我会沿着这份报告里的实验脉络,把每个关键环节的底层逻辑拆开——不是复述实验步骤,而是回答"为什么这么设计、为什么能 work、哪里容易翻车"。

2. 信号的产生与运算:离散序列的"坐标系"到底怎么建

2.1 从单位阶跃序列看 MATLAB 的索引陷阱

实验里第一个容易让人困惑的地方,是单位阶跃序列 u[n] 和 u[n+7] 的画法。程序里用n=-10:20定义时间轴,然后用[zeros(1,10) 1 ones(1,20)]构造序列。这里藏着一个 MATLAB 信号处理中最经典的坑:MATLAB 的数组索引从 1 开始,而信号的时间轴从 -10 开始。

n = -10:20; % 时间轴:31 个点 x = [zeros(1,10) 1 ones(1,20)]; % 序列值:10个0 + 1个1 + 20个1 = 31 个点 stem(n, x); % 用 n 作为横坐标,x 作为纵坐标

这段代码的逻辑是:zeros(1,10)对应 n=-10 到 n=-1 的 10 个点,第 11 个位置放1对应 n=0,后面ones(1,20)对应 n=1 到 n=20。时间轴 n 和序列值 x 的长度必须严格一致,否则stem会直接报错。很多人第一次写的时候会写成n=0:20,结果画出来的图横坐标从 0 开始,和理论上的双边序列对不上。

对于 u[n+7],程序用M=7控制右移量,构造[zeros(1,10+M) 1 ones(1,20-M)]。这里的关键是:u[n+7] 表示序列左移 7 位(因为 n+7=0 时 n=-7),在时间轴上表现为阶跃点从 n=0 提前到 n=-7。但 MATLAB 里没有直接的"移位"操作,只能通过重新构造数组来实现。zeros(1,10+M)把前面的零点数量增加 7 个,ones(1,20-M)把后面的 1 减少 7 个,总长度保持不变。

注意:如果你用circshift做移位,得到的是循环移位,不是线性移位。对于有限长序列,循环移位会把尾部的值搬到头部,和理论上的线性移位完全不同。这是实验报告里没有明说但必须知道的区别。

2.2 复指数序列的实部虚部分解

复指数序列 x[n] = 1.5e^{(0.2+j3)n} 的处理,考察的是对欧拉公式的直观理解。程序里用c = 0.2 + 3*1i定义复数指数,然后x = K*exp(c*n)直接计算。MATLAB 对复数运算的支持很自然,但关键在于画图时必须分别取实部和虚部。

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)); % 实部 subplot(1,2,2); stem(n, imag(x)); % 虚部

这里exp(c*n)展开后是exp(0.2*n) * exp(j*3*n),前者是实指数包络,后者是单位圆上的旋转相位。实部对应1.5*exp(0.2*n)*cos(3*n),虚部对应1.5*exp(0.2*n)*sin(3*n)。实部控制的是"能量增长/衰减的速度",虚部控制的是"振荡的快慢",这两个参数在通信系统里分别对应信号的包络和载波频率。

很多人会问:为什么不用cos和sin直接写?因为复指数形式在推导和计算上更简洁,尤其是在做频域分析时,e^{jωn}是特征函数,而cos和sin需要拆成两个复指数来算。MATLAB 的exp函数对复数输入直接返回复数结果,不需要手动展开。

2.3 正弦序列的"周期"为什么不是整数

实验里有一个看似简单但很容易答错的问题:x[n] = 2.5sin(0.16πn - π/2) 的基本周期是多少?程序里用n=0:49画了 50 个点,但报告里给出的答案是 12.5。

这里涉及离散正弦序列周期性的判定条件:只有当 2π/ω 是有理数时,序列才是周期的。对于 ω = 0.16π,2π/ω = 2π/(0.16π) = 12.5,这是一个有理数(12.5 = 25/2),所以序列是周期的,但基本周期是 25,不是 12.5。

为什么?因为周期的定义是:存在正整数 N,使得 x[n+N] = x[n] 对所有 n 成立。12.5 不是整数,不能作为周期。需要找到最小的正整数 N,使得 0.16πN 是 2π 的整数倍,即 0.16πN = 2πk,解得 N = 12.5k。取 k=2,得到 N=25。所以基本周期是 25。

报告里写"基本周期是 12.5",严格来说是不准确的——12.5 是"周期"的候选值,但不是整数,不能作为离散序列的周期。正确的表述是:该序列的周期为 25,因为 12.5 不是整数,需要取 2 倍才能得到整数周期。这个细节在考试里经常被扣分,但在实际工程中,它决定了你采样后做 FFT 时应该取多少个点才能避免频谱泄漏。

2.4 序列的偶部与奇部:fliplr 的隐含假设

实验里计算序列 x[n] = {1,2,4,-5,-2}(-2≤n≤2)的偶部和奇部,程序用fliplr(x)做翻转。这里有一个隐含假设:序列是关于 n=0 对称的。因为 x 的时间轴是 -2 到 2,共 5 个点,中心在 n=0,所以fliplr翻转后正好对应 x[-n]。

n = -2:2; x = [1 2 4 -5 -2]; y = fliplr(x); % 翻转:得到 x[-n] xe = 0.5 * (x + y); % 偶部:x_e[n] = (x[n] + x[-n]) / 2 xo = 0.5 * (x - y); % 奇部:x_o[n] = (x[n] - x[-n]) / 2

如果时间轴不是关于 0 对称的,比如 n=0:4,那么fliplr翻转后对应的就不是 x[-n],而是 x[4-n],这时候算出来的偶部和奇部就是错的。正确的做法是先确认时间轴的对称性,或者手动构造 x[-n] 的映射关系。

偶部和奇部的分解在信号处理里有一个重要性质:任何序列都可以唯一分解为偶部加奇部,且偶部的 DTFT 是实数,奇部的 DTFT 是纯虚数。这个性质在分析系统的频率响应时很有用——如果系统是实系数的,那么它的幅频响应是偶函数,相频响应是奇函数。

2.5 线性卷积:conv 的长度为什么是 N+M-1

实验里 x[n] 长度 15,h[n] 长度 8,卷积结果 y[n] 的长度是 22。程序用y = conv(x, h)直接计算,然后n = 0:21定义时间轴。这里的关键是:两个长度分别为 N 和 M 的有限长序列,线性卷积的长度是 N+M-1。

nx = 0:14; x = (-1).^nx; % 长度 15 nh = 0:7; h = cos(0.25*pi*nh); % 长度 8 y = conv(x, h); % 长度 15+8-1 = 22 n = 0:21; % 对应的时间轴

为什么是 N+M-1?因为卷积的本质是"翻转-移位-相乘-求和"。当 h[n] 完全移入 x[n] 的支撑区间时,重叠部分从 1 个点逐渐增加到 min(N,M) 个点,然后再逐渐减少到 1 个点。总共有 N+M-1 个非零重叠位置。

很多人会误以为卷积结果的长度和输入一样,或者用filter函数代替conv。filter计算的是差分方程的输出,不是卷积,虽然在某些条件下两者结果相同,但概念上完全不同。conv是纯粹的数学运算,filter涉及系统的初始状态和反馈结构。

提示:如果要做"same"模式的卷积(输出长度和输入相同),可以用conv(x, h, 'same'),但要注意它截取的是中心部分,时间轴需要相应调整。

3. 连续时间信号的频域分析:从傅里叶级数到吉布斯现象

3.1 周期矩形脉冲的频谱:T 增大时发生了什么

实验里用程序 P2_1 画周期矩形脉冲的双边幅度谱和相位谱,然后修改 T=1s 和 T=2s 观察频谱变化。报告里给出的结论是:"随着 T 的增大,幅度谱的值减小,两个频谱均变得更加密集。"

这个结论背后的机制是:周期信号的频谱是离散的,谱线间隔为 Ω₀ = 2π/T。当 T 增大时,Ω₀ 减小,谱线间隔变小,所以频谱看起来更密集。同时,由于周期信号的平均功率与 1/T 成正比,各次谐波的幅度也会相应减小。

但这里有一个更深的点:当 T → ∞ 时,周期信号退化为非周期信号,离散频谱过渡为连续频谱。这就是从傅里叶级数到傅里叶变换的物理意义。实验里虽然没有直接做这个极限,但通过 T=0.5s、1s、2s 的对比,已经能看出这个趋势。

对于周期矩形脉冲,其傅里叶级数系数为:

c_k = (Aτ/T) * sinc(kΩ₀τ/2)

其中 A 是幅度,τ 是脉冲宽度,T 是周期,Ω₀ = 2π/T。sinc 函数的零点出现在 kΩ₀τ/2 = mπ 处,即 k = 2mπ/(Ω₀τ) = mT/τ。当 T 增大时,零点位置向外扩展,但主瓣宽度(由 τ 决定)不变。这就是为什么频谱变得更密集但包络形状不变。

3.2 谐波叠加与吉布斯现象:N 增大为什么不能消除过冲

实验里用 N=15、25、50 个谐波合成矩形脉冲,发现 N 越大波形越接近理想矩形,但不连续点附近的过冲始终存在。报告里给出的过冲最大幅值是 1.0896,约等于理想幅值的 9%。

这就是吉布斯现象。它的数学本质是:用有限项傅里叶级数逼近有间断点的函数时,在间断点附近,级数部分和的极限不等于函数值,而是函数值的 1.0895 倍。这个过冲不会随着 N 的增大而消失,只会越来越靠近间断点。

function p2_4(N) t = -2:10^(-4):2; A = 1; tau = 1; T = 2; Omega_0 = 2*pi/T; c0 = A*tau/T; f_N = c0 * 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

这段代码的核心是:用 N 次谐波叠加来逼近矩形脉冲。sinc函数对应傅里叶系数,cos对应各次谐波的时域波形。当 N 增大时,f_N在间断点附近的振荡频率变高,但过冲幅度趋近于一个常数。

为什么是 1.0895?这个值来自威尔布拉罕-吉布斯常数,约等于 (2/π)∫₀^π (sin t / t) dt + 1。它不是 MATLAB 的数值误差,而是傅里叶级数在间断点处的固有性质。在实际工程中,这意味着你不能指望通过增加谐波数量来消除过冲,只能通过加窗或改变逼近方式来抑制。

3.3 男女声频谱差异:基音频率与共振峰的物理含义

实验里录制男女声并比较频谱,报告里给出的结论是:"男性声音的幅度谱在较低频率处有较高的能量,女性声音的幅度谱在较高频率处有较高的能量。"

这个现象的物理机制是:基音频率由声带振动频率决定,男性声带较长较厚,基音频率通常在 100-150 Hz,女性声带较短较薄,基音频率通常在 200-300 Hz。在频谱上,基音频率表现为最低的谱峰,其各次谐波(2f₀, 3f₀, ...)形成一系列等间隔的谱线。

但除了基音频率,声道形状(共振峰)也会影响频谱包络。男性声道较长,共振峰频率较低;女性声道较短,共振峰频率较高。这就是为什么即使把男声的基音频率调到女声范围,听起来仍然不像女声——因为共振峰结构没有改变。

报告里提到的"男声转女声"方法,本质上是在做频谱包络的变换。基频调整改变谱线间隔,声道长度调整改变共振峰位置,谐波调整改变频谱的精细结构。在实际的语音转换系统中,通常用倒谱域的方法分离激励(基频)和声道(共振峰),然后分别变换再合成。

4. 时域采样与重建:奈奎斯特定理的边界在哪里

4.1 采样定理的严格条件:为什么 Ts=π/2 不混叠而 Ts=2 混叠

实验里用升余弦脉冲信号做采样,报告里给出的提示是:信号的截止频率 Ω_m = 2,奈奎斯特间隔 T_s = π/Ω_m = π/2。当 T_s = π/2 时未发生混叠,T_s = 2 时发生了混叠。

这里的关键是:奈奎斯特采样定理要求采样频率 Ω_s ≥ 2Ω_m。当 T_s = π/2 时,Ω_s = 2π/T_s = 4,恰好等于 2Ω_m = 4,处于临界采样状态。当 T_s = 2 时,Ω_s = π,小于 2Ω_m = 4,发生混叠。

但这里有一个容易被忽略的细节:临界采样(Ω_s = 2Ω_m)在理论上不混叠,但在实际中很危险。因为如果信号的频谱在 Ω_m 处有非零分量,或者采样时钟有抖动,就会产生混叠。工程上通常取 Ω_s = 2.5Ω_m 到 5Ω_m,留出足够的保护带。

% 采样过程的核心逻辑 Ts = pi/2; % 采样间隔 n = 0:Ts:10; % 采样时间点 x_s = cos(2*n) + 4*sin(2*n).*sin(3*n); % 采样后的信号 % 频谱分析:对 x_s 做 FFT,观察频谱是否混叠

报告里没有给出完整的采样程序,但从结论可以反推:采样后的频谱是原信号频谱以 Ω_s 为周期进行延拓。如果 Ω_s < 2Ω_m,延拓后的频谱会发生重叠,高频分量被"折叠"到低频,这就是混叠。

4.2 信号重建:理想低通滤波器为什么不可实现

实验里用低通滤波器从采样信号重建原信号,报告里给出的结论是:当 T_s = 2、截止频率 Ω_c = Ω_m 时,重建误差大大增加。

重建的原理是:采样信号的频谱是原信号频谱的周期延拓,用一个理想低通滤波器(截止频率 Ω_s/2)滤除高频延拓部分,就能恢复原信号。但理想低通滤波器的冲激响应是 sinc 函数,它在时域上是无限长的,且非因果,物理上不可实现。

在实际的 MATLAB 仿真中,通常用有限长 FIR 滤波器或 IIR 滤波器来近似理想低通。这就引入了两个误差来源:通带波纹和阻带衰减。如果滤波器的截止频率设置不当(比如 Ω_c > Ω_m),高频噪声会通过;如果 Ω_c < Ω_m,部分信号分量会被滤除。

报告里提到"低通滤波器的截止频率减小,导致高频分量噪声成分增加",这里的表述需要修正:截止频率减小,应该是滤除了更多的高频信号分量,导致重建信号丢失细节,而不是"噪声增加"。噪声增加通常是因为滤波器阶数不够,阻带衰减不足,导致高频延拓分量泄漏到通带。

4.3 采样间隔与重建误差的定量关系

从实验结论可以总结出:重建误差与采样间隔的关系不是线性的。当 T_s < π/2 时,误差主要来自滤波器的非理想特性;当 T_s 接近 π/2 时,误差开始增大;当 T_s > π/2 时,混叠导致误差急剧增加。

这个关系可以用一个简单的公式描述:

E(T_s) ≈ E_filter + E_alias(T_s)

其中 E_filter 是滤波器非理想带来的固有误差,E_alias 是混叠误差。当 T_s ≤ π/2 时,E_alias = 0,总误差由 E_filter 主导;当 T_s > π/2 时,E_alias 迅速增大,成为主要误差来源。

注意:在实际做实验时,如果你发现 T_s 稍微大于 π/2 但重建效果还可以,不要惊讶。这是因为升余弦脉冲的高频分量在 Ω_m 附近已经很小了,混叠进来的能量有限。但这不代表采样定理可以被违反,只是信号的频谱特性给了你一点"余量"。

5. 避坑指南:信号处理实验里最容易翻车的五个地方

5.1 时间轴和序列长度不匹配

现象:stem(n, x)报错 "Vectors must be the same length"。

原因:n 和 x 的元素个数不一致。常见于手动构造序列时,zeros和ones的数量算错,或者移位时没有同步调整时间轴。

解决:在构造序列后,先用length(n)和length(x)检查长度,或者用assert(length(n) == length(x))强制校验。对于移位操作,建议用n = n + shift调整时间轴,而不是重新构造序列。

5.2 用 filter 代替 conv 做卷积

现象:卷积结果和理论值对不上,或者长度不对。

原因:filter(b, a, x)计算的是差分方程的输出,默认初始状态为零。对于 FIR 滤波器(a=1),filter的结果和conv相同,但长度是length(x)而不是length(x)+length(b)-1。

解决:做线性卷积时坚持用conv。如果要用filter,记得用conv的长度定义时间轴,或者用filter的zi参数控制初始状态。

5.3 频谱分析时忘记做 fftshift

现象:频谱图的零频分量在第一个点,而不是中心。

原因:MATLAB 的fft输出是 [0, Ω_s) 的顺序,零频在第一个点。对于双边谱,需要把零频移到中心。

解决:用fftshift(fft(x))把零频移到中心,同时用linspace(-Ω_s/2, Ω_s/2, N)定义频率轴。注意fftshift只改变排列顺序,不改变数值。

5.4 采样间隔设置不当导致混叠

现象:采样后的频谱出现重叠,重建信号失真。

原因:采样频率低于信号最高频率的 2 倍。

解决:先估计信号的截止频率 Ω_m,然后取 T_s ≤ π/Ω_m。如果不确定 Ω_m,可以先做一次高采样率的 FFT,观察频谱的能量分布,找到能量下降到可忽略的频率点。

5.5 吉布斯现象被误认为是程序错误

现象:用有限项傅里叶级数合成矩形脉冲时,不连续点附近出现过冲,增大 N 也不消失。

原因:这是傅里叶级数的固有性质,不是程序 bug。

解决:接受过冲的存在,或者用加窗方法(如汉宁窗)抑制过冲,但代价是过渡带变宽。在实验报告里,应该明确说明这是吉布斯现象,并给出过冲幅值的理论值(约 9%)。

6. 从实验到工程:采样率选择的艺术与代价

做完这一系列实验,最容易留下的一个印象是"奈奎斯特定理说采样率要大于 2 倍最高频率"。但在实际工程中,这个"大于"到底大多少,是一个充满取舍的问题。

采样率越高,混叠风险越小,但数据量越大、计算成本越高。在通信系统里,采样率通常取 2.5 到 4 倍符号率,留出足够的保护带给滤波器过渡带。在音频处理里,44.1 kHz 的采样率对应 22.05 kHz 的奈奎斯特频率,略高于人耳听觉上限 20 kHz,这个"略高"就是工程上的保护带。

滤波器设计也是同样的取舍。理想低通滤波器不可实现,实际滤波器需要在通带波纹、阻带衰减、过渡带宽度和阶数之间做权衡。阶数越高,逼近越好,但计算延迟越大。在实时系统里,这个延迟可能是致命的。

吉布斯现象则提醒我们:有些误差是数学上的固有性质,不是工程上能"优化"掉的。你能做的只是选择一种逼近方式,接受它的误差特性。矩形窗的过冲是 9%,汉宁窗的过冲几乎为零但过渡带加倍,汉明窗的过冲更小但阻带衰减不如汉宁窗。每一种选择都有代价。

这份实验报告的价值,不在于它给出了多少"正确答案",而在于它用可复现的程序和图形,让你亲眼看到这些取舍在时域和频域上的具体表现。当你下次面对一个实际的信号处理问题时,这些"亲眼见过"的现象会成为你判断的依据。

从那以后我每次做采样相关的设计,都会先问三个问题:信号的最高频率到底在哪里?混叠的后果能不能接受?滤波器的过渡带留了多宽?这三个问题答清楚了,采样率和滤波器参数自然就定了。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询