简介:这份资源是南京邮电大学「信号分析与处理实验」课程的完整实验报告,面向正在修读数字信号处理、信号与系统相关课程的高校学生,以及需要借助 MATLAB 完成信号处理实验与课程设计的学习者。报告围绕信号的产生和运算、连续时间信号的频域分析、时域采样与重建、离散傅里叶变换及应用等核心实验展开,并延伸至连续时间系统频域与复频域分析、数字滤波器设计及信号处理综合应用,配有 MATLAB 程序示例与图形结果,便于对照理解时域和频域特性。资源包共 1 个 docx 文件,约 1.02MB,内容为实验目的、实验内容、过程与结果分析的完整记录,可直接参考实验思路、程序编写与数据解析方法。目前已有 952 人学习,适合作为实验预习、报告撰写与 DSP 入门复习的参考材料。
1. 信号处理实验的“黑匣子”:为什么你照着敲代码却看不懂频谱
很多人第一次做信号分析与处理实验时,都有过这种体验:MATLAB 代码一行行敲进去,stem、plot、fft跑得飞起,图也画出来了,可一旦被问“这个频谱为什么长这样”“采样间隔改一下为什么就混叠了”,脑子立刻空白。问题不在于不会用 MATLAB,而在于把信号处理当成了“调包+画图”的玄学——代码是抄的,结果是懵的。
这份实验报告合集(实验 1 到 4)真正的价值,不是给你几段能跑的脚本,而是把“信号从时域到频域、从连续到离散、从采样到重建”这条链路完整地摊开。它逼着你亲手产生单位阶跃、复指数、正弦序列,亲手做卷积、算奇偶部、画双边谱、观察吉布斯过冲、验证奈奎斯特间隔。每一个现象背后都对应一个可推导的机制。搞懂这些机制,你才算真正跨进了 DSP 的门,而不是停留在“MATLAB 绘图员”的层面。下面就从信号怎么被“造”出来开始,一层层拆到采样定理和重建误差的底层逻辑。
2. 信号的产生与运算:从序列定义到卷积的底层逻辑
2.1 离散序列不是“连续曲线的采样点”,而是独立定义的映射
实验一里最先碰到的坑,是把离散序列当成连续信号来理解。比如单位阶跃序列u[n],代码里写的是x=[zeros(1,10) 1 ones(1,20)],配合n=-10:20。这行代码的含义是:在索引n=-10到n=-1上取 0,在n=0上取 1,在n=1到n=20上取 1。它和连续阶跃函数u(t)最大的区别在于:离散序列只在整数点上有定义,点与点之间没有“过渡”,也没有“无穷小的跳变”。
这解释了一个常见困惑:为什么u[n+7]的代码是[zeros(1,10+M) 1 ones(1,20-M)]?因为左移 7 位意味着原本在n=0处的跳变移到了n=-7,所以前面补的零从 10 个变成 17 个,后面剩下的 1 从 20 个变成 13 个。移位在离散域就是索引的平移,不涉及任何插值或重采样。理解这一点,后面做卷积、做 DFT 的循环移位才不会翻车。
复指数序列x[n]=1.5e^{(0.2+j3)n}更值得细看。代码里c=0.2+3*1i,然后x=K*exp(c*n),最后分别画real(x)和imag(x)。这里藏着一个关键机制:复指数序列的实部和虚部都是衰减(或增长)振荡的。实部对应1.5e^{0.2n}\cos(3n),虚部对应1.5e^{0.2n}\sin(3n)。很多新手看到实部图里幅度在涨,以为是“信号不稳定”,其实只是e^{0.2n}这个包络在起作用。把复指数拆成包络和振荡两部分,是理解 Z 变换和傅里叶变换的起点。
2.2 奇偶分解:为什么fliplr能拆出对称分量
实验一里有一个看似简单但极其重要的操作:对x[n]={1,2,4,-5,-2}(n=-2到n=2)做奇偶分解。代码只有三行核心:
y = fliplr(x); % 时间反转:x[-n] xe = 0.5*(x+y); % 偶部 xo = 0.5*(x-y); % 奇部这里fliplr做的是左右翻转,对应时域反转x[-n]。但要注意:这个操作成立的前提是序列的索引关于n=0对称。如果序列从n=0开始,直接fliplr会得到错误的“反转”结果,因为x[0]翻转后应该还在n=0,而不是跑到末尾。实验里特意选了n=-2:2这个对称区间,就是为了让fliplr和真正的时域反转等价。
偶部xe[n]=(x[n]+x[-n])/2满足xe[n]=xe[-n],奇部xo[n]=(x[n]-x[-n])/2满足xo[n]=-xo[-n]。这个分解在信号处理里的意义是:任何序列都可以拆成对称部分和反对称部分,而傅里叶变换的实部对应偶对称、虚部对应奇对称。后面做 DFT 时,如果输入是实序列,频谱的共轭对称性就是从这里来的。很多人背“实序列频谱共轭对称”这个结论,却不知道它和奇偶分解是同一件事。
2.3 线性卷积:conv背后到底在算什么
实验一里x[n]=(-1)^n(0≤n≤14)和h[n]=cos(0.25πn)(0≤n≤7)做卷积,代码直接调用y=conv(x,h),结果长度是15+8-1=22,对应n=0:21。这里有两个必须搞清楚的机制。
第一,卷积的物理含义是“翻转、平移、相乘、求和”。conv函数内部做的就是这件事:把h翻转,然后沿着x滑动,每个位置做点积。对于长度分别为L和M的序列,输出长度是L+M-1。这个公式不是随便定的,而是因为滑动窗口从完全重叠到完全分离,一共经历了L+M-1个位置。
第二,conv默认从n=0开始计算,它不关心你原来的索引是0:14还是-5:9。如果你输入的序列索引不是从 0 开始,conv的输出索引需要你自己平移。比如x的索引是-2:2,h的索引是0:3,那么卷积结果的起始索引是-2+0=-2,终点索引是2+3=5。实验里两个序列都从 0 开始,所以输出索引直接是0:21,不需要额外平移。这个细节在后续做系统响应、做滤波器时域分析时经常被忽略,导致画出来的图“对不上”。
连续正弦信号x_a(t)=cos(5000πt)+4sin(2000πt)sin(3000πt)的绘制则提醒另一件事:连续信号在 MATLAB 里是用极密的采样点“假装”的。代码里t=0:0.5e-6:6e-3,采样间隔 0.5 微秒,对应采样率 2 MHz。这个采样率远高于信号最高频率分量(5000π rad/s 对应 2500 Hz,2000π 和 3000π 的乘积产生 1000 Hz 和 5000 Hz 分量),所以画出来的波形是可信的。如果采样率不够,画出来的“连续波形”本身就是混叠的产物,后面做频域分析会全盘皆错。
3. 连续时间信号的频域分析:从傅里叶级数到吉布斯过冲
3.1 周期矩形脉冲的双边谱:为什么 T 增大谱线变密
实验二的核心是周期矩形脉冲信号的傅里叶级数。代码P2_1画的是A=1, τ=0.1s, T=0.5s的双边幅度谱和相位谱。这里的关键参数是占空比τ/T和基频Ω₀=2π/T。双边谱的谱线出现在kΩ₀处,幅度正比于sinc(kΩ₀τ/2)。
当T从 0.5s 增大到 1s 和 2s 时,基频Ω₀从4π减小到2π和π,谱线间隔变小,所以谱变得更“密”。同时,因为c₀=Aτ/T,直流分量随T增大而减小,整体幅度谱的值也下降。这个现象背后是傅里叶级数到傅里叶变换的过渡:周期趋于无穷大时,离散谱线间隔趋于零,谱线连成一片,就变成了连续频谱密度。实验里让你比较T=1s和T=2s的图,其实是在用肉眼观察这个极限过程。
相位谱同样值得注意。对于实偶对称的矩形脉冲,c_k是实数,相位只有 0 和 π 两种取值,对应正负号。如果脉冲不是关于原点对称的,相位就会变成连续的斜线,对应时移。这个“时移对应相位线性变化”的规律,在后续做 DFT 的相位分析时反复出现。
3.2 谐波叠加与吉布斯现象:为什么过冲不会消失
P2_2用有限项傅里叶级数合成矩形脉冲,N取 15、25、50。现象是:N越大,合成波形越接近矩形,但在不连续点附近始终存在过冲,而且过冲的峰值不随N增大而减小,只是越来越靠近跳变点。这就是吉布斯现象。
实验里P2_4用代码算出了过冲最大值:
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: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% 的过冲。这个数字不是偶然的,它等于(2/π)∫₀^π (sin t / t) dt - 1,是一个只与跳变幅度有关的常数。无论N取多大,只要是用有限项傅里叶级数去逼近有跳变的函数,这个过冲就存在。要消除它,只能换用其他基函数(比如小波)或者对级数做求和加速(比如 Fejér 求和)。实验里让你亲手算出这个数,比背十遍“吉布斯现象”定义都管用。
3.3 男女声频谱差异:基音频率和共振峰的物理含义
实验二最后一部分用 FFT 分析男女声录音的频谱。现象是:男声波形基音频率低、振幅变化大,频谱能量集中在低频;女声基音频率高、波形细致,频谱能量分布更均匀。这里涉及两个概念:基音频率(pitch)和共振峰(formant)。
基音频率由声带振动决定,男性通常在 100-150 Hz,女性在 200-300 Hz。在频谱上表现为一系列间隔为基音频率的谐波。共振峰由声道形状决定,表现为频谱包络上的峰值。男声声道更长,共振峰频率更低;女声声道更短,共振峰频率更高。实验里让你“查阅资料回答男声转女声的方法”,答案里提到的基频调整、声道长度调整、谐波调整,本质上都是在改这两个东西。用 MATLAB 做 FFT 只是第一步,真正难的是从频谱里把基音和共振峰分离出来——这通常需要倒谱分析或线性预测编码,实验报告里没有展开,但方向已经指出来了。
4. 时域采样与重建:奈奎斯特间隔不是“经验值”而是硬约束
4.1 采样定理的验证:为什么 Ts=2 一定会混叠
实验三用升余弦脉冲信号做采样和频谱分析。提示里给了一个关键推导:升余弦脉冲的频谱大部分集中在[0, 2π/τ],设截止频率Ω_m=2π/τ,代入参数得Ω_m=2,所以奈奎斯特间隔T_s=1/(2f_m)=π/2。当T_s=π/2时,采样频谱刚好不混叠;当T_s=2时,T_s > π/2,采样频谱发生混叠。
这个推导里有一个容易忽略的点:Ω_m=2是角频率,对应的实际频率是f_m=Ω_m/(2π)=1/π。奈奎斯特率是2f_m=2/π,奈奎斯特间隔是1/(2f_m)=π/2。实验里直接给T_s=π/2,是因为升余弦脉冲的频谱不是严格带限的,Ω_m只是一个“大部分能量集中”的边界。如果信号严格带限,T_s=π/2刚好满足;如果信号有高频拖尾,即使T_s=π/2也可能有轻微混叠。实验里判断“未发生混叠”是基于频谱图的主瓣是否重叠,不是严格的数学证明。
当T_s=2时,采样率f_s=1/T_s=0.5,远低于奈奎斯特率2/π≈0.637,混叠不可避免。频谱图上会看到原本在高频的副本搬移到了低频,和主瓣重叠。这个现象在音频处理里就是“ aliasing ”,听起来像金属声或鸟叫。实验里让你亲眼看到混叠后的频谱,比记公式深刻得多。
4.2 信号重建:理想低通滤波器为什么在现实中做不到
P3_2做的是采样后重建。理想重建是用一个截止频率为Ω_c=Ω_m的理想低通滤波器对采样信号做滤波,恢复出原始连续信号。代码里用sinc插值实现。当T_s=π/2时,重建误差很小;当T_s=2且Ω_c=Ω_m时,重建误差大大增加。
误差增大的原因有两层:第一,采样间隔增大导致频谱混叠,高频分量被“折叠”到低频,这部分信息在重建时无法恢复;第二,低通滤波器的截止频率设为Ω_m,但混叠后的信号里包含了原本高于Ω_m的频率分量,这些分量被滤波器保留了一部分,表现为噪声。实验报告里写“高频分量噪声成分增加”,指的就是这个。
这里有一个常见的误解:很多人以为只要采样率满足奈奎斯特定理,重建就完美。实际上,理想低通滤波器在时域是sinc函数,它无限长、非因果,物理不可实现。实际重建只能用近似滤波器,会引入相位失真和幅度失真。实验里用sinc插值是在“模拟”理想重建,不是真的实现了它。理解这个区别,才能明白为什么实际音频系统里过采样和抗混叠滤波器那么重要。
4.3 采样间隔与误差的定量关系
实验里没有给出误差的定量公式,但可以从机制上推导。对于升余弦脉冲,采样后的重建误差主要来自两部分:混叠误差和截断误差。混叠误差随T_s增大而增大,大致正比于T_s超过奈奎斯特间隔的部分。截断误差来自sinc插值的有限长度,在实验里因为t的范围足够大,可以忽略。
如果要在实验里定量验证,可以计算重建信号与原始信号的均方误差:
error = mean((xa_recon - xa_original).^2);当T_s=π/2时,error应该很小;当T_s=2时,error会显著增大。这个计算在实验报告里没有写,但它是验证采样定理最直接的方法。很多新手做完实验只画图不量化,结果对“误差增大”只有模糊的视觉印象,没有数字概念。加上这一行,整个实验的严谨性就上了一个台阶。
5. 避坑与排查:信号处理实验里最容易翻车的五个地方
5.1 现象:conv结果长度不对,画图时横坐标对不上
原因:conv输出长度是L+M-1,但很多人直接用输入序列的索引作为输出索引。如果输入索引不是从 0 开始,输出索引需要平移。
解决:先确定输出起始索引n_start = n_x_start + n_h_start,然后生成n_out = n_start : n_start + length(y) - 1。画图时用stem(n_out, y),不要用stem(y)。
5.2 现象:fft得到的频谱和理论谱对不上,幅度差一个系数
原因:MATLAB 的fft不除以N,而傅里叶级数系数c_k通常要除以N或T。另外,fft的输出顺序是[0, 1, ..., N-1],对应频率[0, f_s/N, ..., f_s(N-1)/N],不是双边谱的顺序。
解决:用fftshift把零频移到中心,用abs(fft(x))/N得到幅度谱。如果要画双边谱,频率轴用(-N/2:N/2-1)*f_s/N。
5.3 现象:采样后频谱图看起来“没混叠”,但重建误差很大
原因:频谱图的分辨率不够,或者只看了幅度谱没看相位谱。混叠可能发生在高频段,幅度很小,肉眼看不出来,但重建时误差会累积。
解决:把频谱图放大到高频段,用对数坐标(20*log10(abs(X)))观察。同时计算重建误差的均方值,不要只靠肉眼判断。
5.4 现象:吉布斯过冲的数值每次运行都不一样
原因:t的步长10^(-4)可能没有刚好落在不连续点上,导致max(f_N)取到的峰值位置有微小偏移。另外,N越大,过冲峰值越靠近跳变点,但t的离散化可能错过真正的峰值。
解决:用更细的步长(比如10^(-5)),或者在跳变点附近加密采样。理论上过冲极限是1.0896,实际计算值应该稳定在这个数附近。
5.5 现象:男女声频谱对比时,发现女声低频能量反而更高
原因:录音设备的频响特性、录音距离、音量归一化都会影响频谱。如果女声录音音量更大,低频能量可能反而更高。
解决:先对两段音频做归一化(除以最大绝对值),再计算频谱。比较时看的是频谱形状(基音间隔、共振峰位置),不是绝对幅度。
6. 从实验到工程:采样定理的边界与重建的取舍
做完这四个实验,最容易留下的印象是“采样率大于两倍最高频率就万事大吉”。但真实工程里,这个结论只在理想条件下成立。信号不是严格带限的,滤波器不是理想低通,采样时钟有抖动,量化有噪声。奈奎斯特间隔是一个下界,不是舒适区。实际系统里通常把采样率做到奈奎斯特率的 2.5 到 10 倍,就是为了给抗混叠滤波器留过渡带,给时钟抖动留裕量。
另一个取舍是重建滤波器的设计。理想sinc插值在数学上完美,但时域无限长,无法实时实现。实际系统用零阶保持器加补偿滤波器,或者用多相滤波器组做插值。这些方法都会引入幅度失真和相位失真,需要在通带平坦度和阻带衰减之间做权衡。实验里用sinc插值是在“事后”重建,没有实时性要求,所以可以用很长的窗口。如果换成实时音频流,就必须用短滤波器,误差会更大。
还有一个容易被忽略的点:采样定理保证的是“可以从采样点唯一恢复原信号”,但前提是原信号严格带限。如果信号有宽带噪声,即使采样率很高,噪声也会混叠。这时候需要先做抗混叠滤波,把噪声带宽限制在奈奎斯特频率以内。实验里没有涉及噪声,但实际做音频采集或传感器信号处理时,抗混叠滤波器是前端电路里最关键的模拟部分。
我自己的习惯是:每次做采样相关的设计,先算奈奎斯特率,然后问三个问题——信号真的带限吗?抗混叠滤波器的过渡带够吗?重建滤波器的相位失真在可接受范围内吗?这三个问题答不上来,采样率再高也是白搭。从那以后我每次看到“采样率 44.1 kHz 就够了”这种说法,都会先确认信号带宽和滤波器特性,再下结论。希望这份实验报告里的代码和现象,能帮你把采样定理从公式变成直觉。
本文还有配套的精品资源,点击获取