简介:华南理工大学信号与系统实验报告四面向修读信号与系统课程的本科学子,也可供其他高校相关课程作为实验参考。报告以MATLAB为实验平台,完整呈现时域抽样定理与频域抽样定理的核心验证过程:采用50Hz抽样频率对不同频率正弦信号取样,直观比较抽样率不足时产生的波形失真,并给出提高抽样频率至400Hz和1000Hz的改进措施;随后通过幅度调制信号、4cos(4πt)信号重建以及序列x[k]={1,3,2,-5}的频域抽样,分析低通滤波恢复效果、频谱混叠现象与抽样点数N对时域恢复精度的影响,帮助深入理解奈奎斯特准则和抗混叠方法。压缩包内含1个doc文档(约276KB),除实验目的、操作步骤、MATLAB代码和波形结果外,还整理了多道思考题,涵盖语音信号抽样频率选取、误差克服、带通信号欠抽样原理、内插函数特性等,便于对照复习和撰写报告。已有727人学习下载,适合需要深入理解采样与重建原理、完成实验作业或备考信号与系统的学生使用。
1. 时域抽样与频域抽样,这个实验到底在验证什么
信号与系统里最容易被公式“骗过去”的知识点,就是抽样定理。这个实验没有用复杂的语音或图像,而是用三个频率翻倍的正弦波和一个长度只有四点的序列,把时域抽样和频域抽样两个定理放到了同一张示波器上:以 50Hz 采样率去采 10Hz、50Hz、100Hz 三个信号,结果只有 10Hz 能被正确表达,50Hz 恰好踩在临界点,100Hz 则直接混叠成另一个低频信号。更值得琢磨的是第四步,对序列{1,3,2,-5}的频谱做不同点数采样,N 从 2 变到 5,时域恢复结果呈现出完全可预测的周期延拓规律。整份实验其实在验证一对对偶现象:时域抽样造成频谱周期化,频域抽样造成时域周期化。适合正在啃信号与系统考研真题的人,也适合做数据采集、语音处理入门的工程师——采样率边界和混叠长相,这些代码能让你看得一清二楚。
2. 时域抽样定理:为什么 50Hz 采样挡不住 50Hz 的信号
2.1 三个信号同一个采样率:谁失真了
实验第一步的物理场景很直接:抽样频率fs = 50Hz,对应抽样间隔T = 1/fs = 0.02s,观察区间取tp = 0.1s。三个待抽样信号分别是 10Hz、50Hz、100Hz 的余弦波,用同一个stem画抽样序列,再用很细的时间网格把原信号曲线叠在一张图上,抽样点是否落在原信号的节律上,肉眼一扫就知道。
原实验代码是这样的:
T = 0.02; % 抽样间隔,对应 fs=50Hz tp = 0.1; % 观察时长 t = 0:T:tp; % 抽样时刻序列 t1 = 0:0.0001:0.1; % 画连续包络用的细网格 subplot(3,1,1); stem(t, cos(2*pi*10*t)); % 10Hz 信号的抽样序列 hold on; plot(t1, cos(2*pi*10*t1)); % 原信号连续曲线 hold off; subplot(3,1,2); stem(t, cos(2*pi*50*t)); % 50Hz 信号:每周期只采一个点 hold on; plot(t1, cos(2*pi*50*t1)); hold off; subplot(3,1,3); stem(t, cos(2*pi*100*t)); % 100Hz 信号:欠采样 hold on; plot(t1, cos(2*pi*100*t1)); hold off;代码逻辑上,stem画离散样本,plot画原始连续信号,subplot把三段波形纵向排布。参数上t = 0:T:tp决定了抽样点数:0.1s 内 50Hz 采样只会产生 5 个样本点。对 10Hz 信号,采样率远大于 2 倍信号频率,5 个点虽然粗糙,但大致能看出原信号的起伏;对 50Hz 信号,每个周期恰好采到一个相同相位点,抽样序列变成常数,波形信息完全丢失;对 100Hz 信号,采样点反而像在描一个低频余弦,这就是教材里说的“混叠”。
原实验报告写“采样频率小于等于信号频率”,这个表述要修正:采样定理的边界是fs >= 2fm,50Hz 信号是临界状态,100Hz 信号才是真正不满足条件。考试和面试时如果把这个边界说错,基本会暴露概念不清。改进措施也很明确,后两个信号要实现无失真恢复,采样率必须分别大于 100Hz 和 200Hz,实验后续给出的 400Hz 与 1000Hz 正是留出了工程余量的取值。
2.2 调幅信号的频谱分析与采样率设计
第二步引入一个幅度调制信号x(t) = cos(2πt)·cos(200πt)。这类信号在通信系统里随处可见,分析它的第一步是展开频谱:用积化和差公式,cos(A)cos(B) = 1/2[cos(A-B) + cos(A+B)],代入A = 2πt、B = 200πt,得到:
fs = 800; % 抽样率 800Hz t0 = 0:0.001:0.1; % 连续曲线的时间网格,步长 1ms t = 0:1/fs:0.1; % 抽样时刻,步长 1.25ms x_cont = cos(2*pi*t0).*cos(200*pi*t0); x_sample = cos(2*pi*t).*cos(200*pi*t); plot(t0, x_cont); % 原调幅信号 hold on; stem(t, x_sample, 'r', 'MarkerSize', 4); % 抽样序列 hold off;频谱展开后只有两个分量:99Hz 和 101Hz,信号最高频率fm = 101Hz,奈奎斯特频率是 202Hz。实验取fs = 800Hz,大约 4 倍于奈奎斯特率。这样抽样点足够密,50Hz 以上的边带在周期延拓时不会和镜像频谱重叠。参数上要注意t0和t的步长不能搞混,t0是画连续波形用的,步长要远小于信号周期(1ms 对应 0.1ms? 不对,这里步长 1ms,信号周期 1s 和 1/100s,1ms 能大致画出高频分量),t是真正的抽样时刻,步长由1/fs决定。
2.3 抽样率选择的工程冗余
从上面两个小实验能提炼出一个工程结论:奈奎斯特频率只是理论下限,实际系统里几乎没有理想低通滤波器,抗混叠滤波器在截止频率附近有过渡带,所以抽样频率必须往上抬。做 DSP 时我一般这样定:先找出信号最高频率fm,理论下限取2fm,然后根据滤波器过渡带留 1.2~2 倍余量;如果后续还要做包络检测或频谱分析,直接取(3~5)fm也是常见操作。实验里把 100Hz 信号的采样率定到 1000Hz,就是为了让恢复出来的波形在肉眼层面无失真,这个思路和语音信号处理中把 3400Hz 语音按 8kHz 采样的做法完全一致。
3. 信号重建:sinc 内插与混叠的边界
3.1 从抽样序列到连续信号的数学桥
第三步的关键不是“抽样”,而是“重建”。抽样定理保证,只要fs > 2fm,原带限信号就可以通过理想低通滤波从样本中恢复。理想内插的数学形式是每个样本乘一个归一化的 sinc 函数再叠加:
fm = 10; % 抽样率 10Hz Ts = 1/fm; % 抽样间隔 0.1s t0 = 0:0.001:1; % 原信号时间网格 t = 0:Ts:1; % 抽样时刻 x = cos(4*pi*t); % 抽样序列,原始信号 2Hz tr = 0:0.01:1; % 重建信号时间轴 xr = zeros(size(tr)); % 存放重建结果 for k = 1:length(x) xr = xr + x(k)*sinc((tr - (k-1)*Ts)/Ts); % 叠加内插核 end plot(t0, cos(4*pi*t0), 'b'); hold on; stem(t, x, 'r'); plot(tr, xr, 'g', 'LineWidth', 1.2); hold off; legend('原信号','抽样序列','重建信号');这段代码把每个样本点当成一个权值,sinc((tr - k*Ts)/Ts)是中心在k*Ts、零点和整数倍抽样间隔对齐的内插核。sinc是 MATLAB 内置函数,定义是sin(πx)/(πx),注意它和理论公式里的sinc(x)=sin(x)/x差一个 π 因子,写代码时直接用内置版本最省事。参数上fm=10对应Ts=0.1s,重建时间轴步长取0.01s,也就是每个抽样间隔里插 10 个点。for循环逐样本叠加,比直接调用conv更直观,也不会混淆卷积长度。
原实验里写的是h = sin(pi*t1*0.1)/(0.1*pi*t1); y = conv(x,h);,这个写法有两个明显的坑:第一,t1=0时分子分母都是 0,MATLAB 会产生NaN,画图时那个位置会断开;第二,conv的结果长度是length(x)+length(h)-1,多出来的一段需要手工对齐,初学者很容易把重建波形画错。所以这里更推荐用sinc和循环叠加。
提示:如果看到重建波形在样本点附近有毛刺或空洞,优先检查内插核在零点是否被赋值成
NaN。把t1=0单独置 1,或者改用内置sinc,问题立刻消失。
3.2 10Hz 抽样下的重建成功
原信号是cos(4πt),频率 2Hz,最高频率 2Hz,奈奎斯特频率 4Hz。实验用 10Hz 采样,满足fs > 2fm,所以重建波形应该和原信号高度一致。运行上面的代码后,绿色重建线和蓝色原信号基本重合,差异主要来自两个来源:一是重建时间轴步长0.01s还不够细,内插核的峰值位置有量化误差;二是抽样序列只在0~1s内取了 11 个点,两端会有 sinc 截断引起的边缘抖动,非周期信号尤其明显。
这个实验里,原信号恰好是 2Hz 余弦,观察区间取 1s,正好是整数个周期。工程上我一般建议观察区间至少取 10 个以上周期,这样两端截断的影响可以被平均掉。如果重建波形在两端出现明显摆动,不要怀疑抽样定理,而是检查观察窗口是不是太短。
3.3 3Hz 抽样下的重建失败
把上一节的抽样频率改成fm = 3,也就是Ts = 1/3s,其他代码不动。这时 2Hz 信号的奈奎斯特频率是 4Hz,3Hz 低于这个值,不满足抽样定理。运行结果里,重建波形不再是一条 2Hz 余弦,而是一条周期更长、幅度起伏更缓的低频曲线,这就是频谱混叠的时域表现。
混叠的本质是原信号 2Hz 分量在周期延拓时,与fs - 2Hz = 1Hz的镜像分量叠在一起。你做频谱分析时会在 1Hz 处看到一个本不该存在的分量。验证方法很简单:对重建信号做 FFT,看除了 ±2Hz 之外是否出现其他谱峰。如果抽样率只是略低于奈奎斯特频率,混叠分量会压在原分量旁边;如果低很多,混叠频率可能远离原频率,时域上就表现为完全不同的波形。这个特征在做语音降噪和振动信号采集时经常遇到:采样率不够,设备振动频率被“翻译”成另一个低频值,数据解读就会完全跑偏。
4. 频域抽样定理:频域取点少,时域就混叠
4.1 频域抽样与 DFT 的隐含周期延拓
第四步把视角从时域翻转到频域。给定有限长序列x[k] = {1, 3, 2, -5},它的离散时间傅里叶变换(DTFT)是一个连续函数X(e^jω)。计算机没法处理连续谱,只能在[0, 2π)上等间隔取 N 个点,这 N 个点的集合就是 DFT,而由 DFT 反变换恢复出的序列,并不是原序列本身,而是原序列以 N 为周期延拓后的主值区间:
xr[n] = Σ_{m=-∞}^{∞} x[n + mN]
这就是频域抽样定理:频域离散化对应时域周期化,严格和时域抽样导致的频谱周期化对偶。当 N 大于等于原序列长度时,周期延拓的各周期互不重叠,恢复结果是原序列后面补零;当 N 小于原序列长度时,相邻周期会重叠,重叠部分直接相加,产生时域混叠。
4.2 N=2,3,4,5 的恢复对比
原实验直接对 DTFT 表达式取频域样本,再用ifft恢复时域。复现代码如下:
x = [1, 3, 2, -5]; Nlist = [2, 3, 4, 5]; for N = Nlist k = 0:N-1; omegam = 2*pi*k/N; % 频域抽样点 Xk = 1 + 3*exp(-1j*omegam) ... + 2*exp(-2j*omegam) ... - 5*exp(-3j*omegam); % 抽样出的频谱值 xr = ifft(Xk); % 反变换恢复时域 fprintf('N=%d: ', N); fprintf('%.4f ', real(xr)); fprintf('\n'); end代码里omegam是 N 个均匀分布的频域点,Xk是原序列 DTFT 在这些点上的取值,ifft完成离散时间傅里叶反变换。注意 DTFT 表达式的指数项是负号,和 DFT 正变换的定义一致;real是因为理论上的实数序列在数值计算中可能带极小的虚部,取实部是为了方便观察。运行结果如下:
| N | 恢复序列 xr | 现象 |
|---|---|---|
| 2 | [3, -2] | 原序列以 2 为周期延拓,严重混叠 |
| 3 | [-4, 3, 2] | 仍混叠,x[0] 与 x[3] 叠加为 -4 |
| 4 | [1, 3, 2, -5] | 与原序列完全一致 |
| 5 | [1, 3, 2, -5, 0] | 无混叠,尾部补零 |
N=2 时,恢复序列只有两个点,因为相邻周期重叠,3是x[0]+x[2]=1+2的结果,-2是x[1]+x[3]=3-5的结果。N=3 时,xr[0]=x[0]+x[3]=-4,其余两个点未受污染。N=4 和 N=5 时延拓不再重叠,区别仅在 N=5 时多出一个零值点——如果按“序列长度是否等于 4”来比较,N=5 的尾部补零仍然保持了全部原始样本值,工程上通常认为无混叠。
提示:
ifft默认归一化为 1/N,这正好匹配 IDFT 的数学定义。如果自己手动写 IDFT,不要漏掉 1/N,否则幅度会放大 N 倍。
4.3 从实验结果看 DFT 点数选择
这个实验揭示了 FFT 分析中一个常被忽视的规则:DFT 点数 N 必须不小于时域有效长度,否则恢复出来的时域序列就是混叠后的版本。反过来,如果信号本身就无限长,截断是不可避免的,此时时域“伪混叠”来自窗函数泄漏,和这里的周期延拓混叠是两回事。原实验思考题里提到“增加抽样序列 x[k] 的长度能否改善重建信号质量”,答案是能增加频谱细节,但不能提高重建精度——因为精度上限由抽样频率和信号带限决定,DFT 点数只决定频域分辨率。实际做频谱分析时,我习惯先保证时域采集点数足够,再靠补零把频谱画平滑,而不是靠大量补零去“无中生有”。
5. 工程落地:语音抽样率和内插函数的选择
5.1 为什么语音系统都用 8kHz 而不是 6800Hz
实验思考题里提到,人声音频范围是 300~3400Hz,按抽样定理最低要 6800Hz。但实际电话语音系统标准抽样率是 8kHz,原因在抗混叠滤波器。理论边界要求滤波器在 3400Hz 处直接截断,现实中的模拟滤波器做不到这么陡峭,在 3400Hz 到 4000Hz 之间必须留出一条过渡带,否则高于奈奎斯特频率的噪声和带外信号会折叠回有效频带。8kHz 采样率把过渡带设计在 3400~4000Hz,是一个成本和性能的平衡点。这个思路直接对应实验里对 100Hz 信号取 1000Hz 采样率的做法。
5.2 四种内插函数怎么选
实验思考题最后问到了内插函数特性,这里给出一个对比:
| 内插方式 | 表达式或行为 | 典型场景 |
|---|---|---|
| 抽样内插 | sinc(t/Ts) | 带限信号理论重建,精度最高 |
| 阶梯内插 | 样本值保持到下一个采样点 | DAC 零阶保持输出,硬件实现简单 |
| 线性内插 | 相邻样本用直线连接 | 工程快速平滑,CPU 开销低 |
| 升余弦内插 | 升余弦核加窗 | 频谱成形平滑,音频过采样常用 |
选型原则是:恢复精度要求越高,内插核的旁瓣越小、阶数越高。抽样内插虽然精确,但 sinc 无限长,实际必须截断,截断会引入吉布斯效应;阶梯内插是最粗的近似,但在 FPGA 里只需要一个寄存器就能实现;线性内插是“够用就好”的代表,多数嵌入式波形恢复用它;升余弦内插则牺牲了一点带宽换取时域波形的光滑程度,适合示波器显示和音频重采样。
5.3 重建质量验证和采样率留余量
验证重建是否合格,不要只盯着时域波形看相似度。把重建信号做 FFT,如果最高信号频率之外出现了明显谱峰,基本可以断定抽样率或滤波器有问题,或是混叠从高频折返到了低频。还可以计算重建信号与原信号的均方误差,公式是MSE = mean((xr - x).^2),MSE 应该远小于信号功率。最后说一个落地技巧:选定采样率时,先用 MATLAB 把信号频谱看一眼,确认最高频率分量到奈奎斯特频率之间至少有 10%~20% 的空白过渡带,再定滤波器指标;如果过渡带被顶满,就把采样率往上调 1.2 倍,这是比直接套fs >= 2fm更稳的工程做法。
本文还有配套的精品资源,点击获取