简介:这份华南理工大学信号与系统实验报告四,面向电子信息、通信工程等专业学生及信号处理初学者,聚焦时域抽样定理与频域抽样定理的验证与理解。报告围绕抽样频率对信号重构的影响、幅度调制信号频率特性、信号抽样与重建、频域抽样与时域混叠四个实验展开,结合代码与波形图分析奈奎斯特采样定理的工程意义,并附有实验思考题与感想,可帮助读者掌握离散化过程的数学与物理概念。资源包共1个doc文件,约276KB,内容为完整实验报告文档,便于直接查阅与参考。目前已有728人学习下载,适合需要完成同类实验、复习抽样定理或准备信号处理课程考核的读者对照使用。
1. 信号与系统实验四:从“波形能画出来”到“参数能讲清楚”
很多同学做信号与系统实验,卡在实验四这一步:前面几个实验还能照着步骤连一连、点一点,到了实验四,突然要求你对采样、卷积、频谱这些概念给出定量解释,波形是画出来了,但一问“为什么这个参数下波形长这样”,就答不上来。这个实验的核心,其实是把“信号与系统”从纸面公式拉到可运行的仿真环境里,用离散采样去逼近连续信号,再用卷积和频谱去验证系统特性。它适合正在上这门课、需要交实验报告,但不想只抄步骤、想真正搞懂参数含义的本科生。我当年做这个实验时,第一次跑出混叠波形还以为是代码写错了,后来才发现是采样率设成了信号最高频率的两倍以下——这个坑,后面会细说。
2. 实验四到底在仿真什么:采样、卷积与频谱的三条主线
2.1 为什么实验四总绕不开“采样率”这个参数
信号与系统实验四通常不会只让你画一个正弦波,而是要求你观察连续信号经过采样后,在离散域里发生了什么。这里最关键的参数就是采样频率 ( f_s )。常见做法是:先定义一个连续时间信号,比如 ( x(t)=\sin(2\pi f_0 t) ),然后以 ( f_s ) 对它采样,得到离散序列 ( x[n]=x(nT_s) ),其中 ( T_s=1/f_s )。
如果你把 ( f_s ) 设得比 ( 2f_0 ) 小,就会看到混叠:原本高频的正弦,在离散序列里看起来像低频。这不是代码 bug,而是采样定理的直接结果。实验四往往要求你分别取 ( f_s > 2f_0 )、( f_s = 2f_0 )、( f_s < 2f_0 ) 三组参数,画出离散序列并比较。很多报告只贴三张图,却不解释为什么 ( f_s = 2f_0 ) 时波形也不理想——因为临界采样对相位和重建滤波器要求极高,实际仿真里稍微偏移一点,重建就会失真。
我一般会建议在实验报告里加一张表,把三组参数下的“观察到的频率”和“理论频率”列出来,这样老师一眼就能看出你理解了混叠。表格比堆图更有说服力。
2.2 离散卷积:从公式到可运行代码的最小闭环
实验四的另一条主线是卷积。连续卷积 ( y(t)=x(t)*h(t) ) 在仿真里通常转成离散卷积 ( y[n]=x[n]*h[n] )。这里最容易翻车的地方是:很多同学直接调用conv函数,但忘了卷积结果的长度是 ( N+M-1 ),画图时时间轴对不上,导致波形“漂移”。
一个可复现的最小闭环是这样的:先定义输入序列 ( x[n] ) 和系统冲激响应 ( h[n] ),用conv得到 ( y[n] ),然后构造正确的离散时间轴。下面这段 Python 代码可以直接抄作业:
import numpy as np import matplotlib.pyplot as plt # 定义离散时间轴,n 从 0 到 19 n = np.arange(0, 20) # 输入信号:指数衰减序列 x = np.exp(-0.3 * n) # 系统冲激响应:长度为 5 的矩形窗 h = np.ones(5) # 离散卷积,结果长度为 len(x)+len(h)-1 y = np.convolve(x, h, mode='full') # 构造卷积结果对应的时间轴 n_y = np.arange(0, len(y)) plt.figure(figsize=(10, 6)) plt.subplot(3, 1, 1) plt.stem(n, x, basefmt=" ") plt.title('输入序列 x[n]') plt.subplot(3, 1, 2) plt.stem(np.arange(len(h)), h, basefmt=" ") plt.title('冲激响应 h[n]') plt.subplot(3, 1, 3) plt.stem(n_y, y, basefmt=" ") plt.title('卷积结果 y[n]') plt.tight_layout() plt.show()这段代码的逻辑说明:np.convolve的mode='full'返回完整卷积,长度是 ( N+M-1 )。参数说明:x的长度是 20,h的长度是 5,所以y的长度是 24。如果你用mode='same',长度会变成 20,但那是为了对齐中心,实验报告里通常要求完整卷积,所以用full。时间轴n_y必须从 0 开始,长度与y一致,否则stem画出来会错位。
2.3 频谱分析:FFT 之后横轴到底怎么标
实验四通常还会要求你对信号做频谱分析。很多同学用fft算完,直接plot(abs(Y)),结果横轴是 0 到 ( N-1 ),完全看不出频率成分。正确的做法是构造频率轴:( f_k = k \cdot f_s / N ),其中 ( k=0,1,\dots,N-1 )。如果只看正频率,就取前 ( N/2 ) 个点。
这里有个血泪经验:如果信号不是整周期采样,频谱会泄漏,原本一根谱线会散开。实验报告里如果要求“观察频谱”,最好让信号长度是周期的整数倍,或者加窗。但加窗会改变幅度,所以要在报告里说明你用了什么窗、为什么用。
常见做法是:先算Y = np.fft.fft(x),再算f = np.fft.fftfreq(len(x), d=1/fs),然后只画f[:len(x)//2]和abs(Y[:len(x)//2])。这样横轴就是真实的 Hz,而不是样本序号。
3. 用 Python 把实验四跑通:从信号生成到频谱验证
3.1 环境准备与最小依赖
实验四不需要复杂的工具箱,Python 里numpy和matplotlib就够了。如果你用的是某高校实验室的机房环境,可能预装了 Anaconda,直接开 Jupyter Notebook 就能跑。我一般会建议新建一个干净的虚拟环境,避免版本冲突:
python -m venv sigsys_env source sigsys_env/bin/activate # Windows 下用 sigsys_env\Scripts\activate pip install numpy matplotlib这段命令的作用是创建独立环境并安装两个核心库。参数说明:venv是 Python 标准库自带的虚拟环境模块,source在 Windows 下换成对应激活脚本。如果你不想折腾环境,直接用系统 Python 也行,但要注意numpy版本最好在 1.20 以上,避免fft接口差异。
3.2 采样与混叠的完整仿真脚本
下面这个脚本把采样、混叠、频谱放在一起,你可以直接改参数观察变化:
import numpy as np import matplotlib.pyplot as plt # 连续信号频率 f0 = 5 # Hz # 三组采样频率 fs_list = [50, 10, 8] # 分别对应过采样、临界、欠采样 t_continuous = np.linspace(0, 1, 1000) plt.figure(figsize=(12, 8)) for i, fs in enumerate(fs_list): # 离散采样 n = np.arange(0, int(fs * 1)) # 1 秒内的样本 x_n = np.sin(2 * np.pi * f0 * n / fs) # 连续信号用于对比 x_c = np.sin(2 * np.pi * f0 * t_continuous) plt.subplot(3, 2, 2*i+1) plt.plot(t_continuous, x_c, 'b', label='连续信号') plt.stem(n/fs, x_n, 'r', basefmt=" ", label='采样点') plt.title(f'fs={fs} Hz, f0={f0} Hz') plt.legend() # 频谱 X = np.fft.fft(x_n) f = np.fft.fftfreq(len(x_n), d=1/fs) plt.subplot(3, 2, 2*i+2) plt.stem(f[:len(f)//2], np.abs(X[:len(f)//2]), basefmt=" ") plt.title(f'幅度谱 fs={fs} Hz') plt.xlabel('频率 (Hz)') plt.tight_layout() plt.show()逻辑说明:第一组fs=50远大于2*f0=10,采样点能还原正弦;第二组fs=10刚好等于 ( 2f_0 ),采样点落在零点附近,重建困难;第三组fs=8小于 ( 2f_0 ),频谱里会出现一个虚假的低频峰,这就是混叠。参数说明:f0是信号频率,fs_list是三组采样率,n是样本索引,n/fs把样本索引转成时间。频谱只画了前半段,因为实信号的频谱对称。
3.3 卷积验证:系统冲激响应与输出波形
实验四经常要求你验证“系统对输入信号的响应等于卷积”。你可以构造一个简单的低通滤波器作为系统,比如滑动平均:
import numpy as np import matplotlib.pyplot as plt # 输入信号:两个不同频率正弦叠加 n = np.arange(0, 100) x = np.sin(0.1 * n) + 0.5 * np.sin(0.8 * n) # 系统:长度为 10 的滑动平均 h = np.ones(10) / 10 # 卷积 y = np.convolve(x, h, mode='full') n_y = np.arange(0, len(y)) plt.figure(figsize=(10, 6)) plt.subplot(3, 1, 1) plt.stem(n, x, basefmt=" ") plt.title('输入信号 x[n]') plt.subplot(3, 1, 2) plt.stem(np.arange(len(h)), h, basefmt=" ") plt.title('系统冲激响应 h[n]') plt.subplot(3, 1, 3) plt.stem(n_y, y, basefmt=" ") plt.title('输出 y[n] = x[n] * h[n]') plt.tight_layout() plt.show()逻辑说明:滑动平均是一个低通系统,高频成分会被削弱。你可以对比输入和输出的频谱,会发现0.8那个频率的幅度明显下降。参数说明:h的长度决定了平滑程度,长度越大,截止频率越低。注意mode='full'导致输出比输入长,这是离散卷积的固有特性。
4. 实验四避坑指南:五个让报告被退回的细节
4.1 现象:采样率设成信号频率的两倍,波形还是不对
原因:临界采样在理论上要求重建滤波器是理想低通,实际仿真里用stem画点,相位稍微偏移就会让样本落在零点附近。解决:实验报告里不要只写“满足采样定理”,要说明临界采样在实际离散仿真中的局限性,建议取 ( f_s \geq 5f_0 ) 作为过采样观察。
4.2 现象:卷积结果长度和输入对不上,画图错位
原因:np.convolve默认mode='full',输出长度是 ( N+M-1 ),但很多同学直接用输入的时间轴去画输出。解决:单独构造输出时间轴n_y = np.arange(0, len(y)),或者用mode='same'并明确说明你做了截断。
4.3 现象:FFT 频谱横轴是样本序号,不是频率
原因:直接plot(abs(fft(x)))没有构造频率轴。解决:用np.fft.fftfreq(N, d=1/fs)生成频率轴,只取前半段画正频率。注意d是采样间隔,不是采样率。
4.4 现象:频谱泄漏导致谱线散开,被误认为噪声
原因:信号长度不是周期的整数倍,FFT 默认认为信号是周期的,边界不连续就会泄漏。解决:调整信号长度使其包含整数个周期,或者加汉宁窗并说明窗函数对幅度的影响。
4.5 现象:实验报告里参数写了一大堆,但没说为什么选这些值
原因:只抄了代码里的数字,没有解释物理意义。解决:每个参数后面加一句“因为……所以取……”,比如“因为信号最高频率是 5 Hz,为了满足采样定理并留有余量,取 ( f_s=50 ) Hz”。
5. 让实验四从“能跑”到“能讲”:一个验证习惯和一条进阶技巧
做完实验四,最怕的是老师问“你这个频谱里为什么有个小峰”。我自己的习惯是:每画一张图,先自己问三个问题——横轴物理量是什么、纵轴物理量是什么、这个形状对应什么数学性质。比如频谱里出现一个小峰,先检查是不是混叠,再检查是不是泄漏,最后检查是不是窗函数旁瓣。这个习惯让我在实验报告里少写了很多“玄学”解释。
进阶技巧是:用scipy.signal里的freqz直接画系统频率响应,和 FFT 结果对照。比如滑动平均系统的频率响应可以用freqz(h)得到,横轴是归一化频率。你可以把freqz的曲线和输入输出频谱叠在一起,验证低通特性。这样报告里就不只是“我算了卷积”,而是“我验证了系统在频域的行为”。
from scipy import signal import matplotlib.pyplot as plt h = [1/10] * 10 w, H = signal.freqz(h) plt.plot(w / np.pi, 20 * np.log10(np.abs(H))) plt.title('滑动平均系统频率响应') plt.xlabel('归一化频率 (×π rad/sample)') plt.ylabel('幅度 (dB)') plt.grid() plt.show()这段代码用freqz计算系统频率响应,w是归一化角频率,H是复频响。参数说明:h是系统系数,w/np.pi把横轴转成以 π 为单位。你可以看到滑动平均在低频增益接近 0 dB,高频衰减,这就是它作为低通滤波器的证据。
最后说一句:实验四的代码可以复制,但参数背后的“为什么”复制不了。我当年就是靠把每个参数都问一遍“如果改成别的会怎样”,才真正把采样、卷积、频谱串起来。希望帮到你。
本文还有配套的精品资源,点击获取