简介:现代信号处理复习题是一份面向通信、电子、自动化等专业学生的课程复习资料,尤其适合准备期末考、考研复试或面试中信号处理相关考点的人群。文档围绕采样理论、傅里叶变换、数字信号处理、滤波器设计、系统稳定性分析和数字滤波器六大模块展开,将复习题中涉及的奈奎斯特采样条件、频谱分辨率调整、DFT谱线间距、抗折叠滤波器作用、系统因果性与稳定性判断、FIR与IIR滤波器对比等关键问题逐一讲解,并提供详细推导与参考答案。压缩包共1个doc文件,大小约1.88MB,内容按知识点分题呈现,排版规范,便于查阅和打印。该资料已有1330人学习浏览,适合用来巩固概念、强化计算并快速回顾重点题型。
1. 现代信号处理复习题:先看清这几类题目的共同骨架
复习题不能当成孤立知识点去背。从本科课程的章节练习,到考研、资格考试里出现的高频题型,表面上看题目分布在时域、频域、复频域、随机域,实际上每一道题都在做同一件事:建立信号模型,选定变换工具,给出系统或估计器,再验证误差或代价函数。一个典型的例子是:给出带噪观测序列,要求设计低通滤波器并估计信噪比,这一道题就同时触及离散系统、傅里叶变换、滤波器设计和随机信号的多个概念。因此,读任何一道现代信号处理复习题时,先问三个问题:输入信号的域是什么?输出判据是什么?中间允许使用的变换或工具是什么?把这条主线固定下来,后续章节再从理论、计算、仿真和复盘四个方向展开。
2. 现代信号处理复习题中必考的离散与变换域理论
理论小题通常是整套复习题的送分项,也是大题的底座。离散时间线性时不变系统的性质判断、DTFT/DFT 的关系、z 变换的收敛域,这三块几乎是每年必现的对象。很多人只背结论,不把定义落到代码里,等到题目把公式改写一下,就认不出来。这一章把三个最常考的“概念型理论”变成可以被验证的操作过程。
2.1 离散时间信号与系统:先厘清三个基本操作
离散时间信号与系统的复习题,最多的一类就是给出输入输出关系式,要求判断线性、时不变、因果、稳定。碰到这种题不用先套现成结论,先把输入信号替换成 ax1[n]+bx2[n] 并展开,再把输入信号整体平移 n0,看输出是否跟着平移。这两个检查动作就是“线性”和“时不变”的几何含义:线性是叠加,时不变是平移可交换,因果是输出不能看到未来,稳定是有界输入产生有界输出。
| 性质 | 定义式 | 复习题常见得分点 |
|---|---|---|
| 线性 | T{ax1+bx2}=aT{x1}+bT{x2} | 出现 x[n] 的平方、绝对值或系数依赖 n 都会破坏线性 |
| 时不变 | y[n-n0]=T{x[n-n0]} | 系数中包含 n 则系统时变 |
| 因果 | n 时刻输出只依赖 x[n],x[n-1],... | 冲激响应 h[n]=0 当 n<0 |
| 稳定 | ∑ | h[n] |
这张表里隐藏了一个很容易被忽略的点:稳定与因果不是一回事,但复习题经常把两者放在一起。系统函数的分母多项式所有根都在单位圆内,稳定就成立;因果性则要看系统函数的收敛域是否包含无穷远点。如果题目给的是差分方程而不是系统函数,就先两边取 z 变换,再画极零图,这样比在时域里凑冲击响应快得多。
2.2 傅里叶变换:DTFT、DFT 与谱泄漏复习要点
DTFT 是连续频率的频谱,DFT 是对 DTFT 在 N 个频点上的采样。许多复习题的分界线就在采样点数 N 上,两个正弦频率间隔小于约 2π/N 时,DFT 很难分辨,这就是窗函数主瓣泄漏造成的限制。常见的考法是给你一段有限长信号,要你选择窗函数或加大 N 来改善频谱。下面的代码把“矩形窗”和“汉宁窗”的频谱叠在一起,是复习时最直接的对照实验。
import numpy as np import matplotlib.pyplot as plt fs = 1000 # 采样率,单位 Hz N = 512 # 参与 DFT 的点数 t = np.arange(N) / fs # 时间轴 x = np.sin(2*np.pi*50*t) + np.sin(2*np.pi*55*t) # 矩形窗:相当于直接截断,没有额外乘窗 X_rect = np.fft.rfft(x) freq = np.fft.rfftfreq(N, 1/fs) # 汉宁窗:先乘窗再做 FFT w = np.hanning(N) X_hann = np.fft.rfft(x * w) plt.plot(freq, 20*np.log10(np.abs(X_rect)+1e-12), label='rectangular') plt.plot(freq, 20*np.log10(np.abs(X_hann)+1e-12), label='hann') plt.xlabel('Frequency (Hz)') plt.ylabel('dB') plt.legend() plt.show()这里的 fs=1000,N=512,频率分辨率约为 fs/N≈1.95Hz,而 50Hz 与 55Hz 的间隔是 5Hz,大约只占不到 3 个频率点,属于“勉强可分”的场景。rfft只计算正频率部分,后续绘图更直观;rfftfreq会返回对应的频率轴。矩形窗旁瓣高但主瓣窄,弱信号容易被相邻强信号的旁瓣掩盖;汉宁窗以主瓣变宽为代价压低旁瓣。复习题中判断“是否需要加窗”,就看着眼点是低旁瓣还是高分辨率。
不同窗函数的参数在复习题里通常要求直接背诵:
| 窗函数 | 主瓣宽度 | 旁瓣衰减 |
|---|---|---|
| 矩形窗 | 4π/N | -13 dB |
| 汉宁窗 | 8π/N | -31 dB |
| 哈明窗 | 8π/N | -43 dB |
| 布莱克曼窗 | 12π/N | -58 dB |
主瓣越宽,两个相近频率越难分离;旁瓣衰减越大,泄漏干扰越小。如果题目问“抑制频谱泄漏”,优先答旁瓣衰减大的窗;如果问“分辨两个很近的正弦”,则应该考虑增加 N 或使用主瓣更窄的窗,而不是一味加窗。
2.3 z 变换与极零图:判断系统稳定性的动手办法
z 变换是 DTFT 的一般化,复习题里常给一个 H(z) 表达式,要求判断稳定性、因果性,甚至反过来补全系统参数。用代码检查比手画更快:让 SciPy 把分子分母拆成零点、极点,再直接在单位圆图上验证。
import numpy as np import matplotlib.pyplot as plt from scipy import signal # 系统函数 H(z) = 1 / (1 - 0.5 z^-1 + 0.2 z^-2) b = [1] a = [1, -0.5, 0.2] zeros, poles, gain = signal.tf2zpk(b, a) # 画单位圆 theta = np.linspace(0, 2*np.pi, 400) plt.plot(np.cos(theta), np.sin(theta), 'k--', linewidth=0.8) plt.plot(np.real(zeros), np.imag(zeros), 'o', label='zeros') plt.plot(np.real(poles), np.imag(poles), 'x', label='poles') plt.axis('equal') plt.grid(True) plt.legend() plt.title('Pole-Zero Plot') plt.show() r = np.abs(poles) print('极点模值:', r) print('系统稳定:', np.all(r < 1))tf2zpk的参数中,b 是分子多项式系数,a 是分母多项式系数,都按 z 的降幂排列。这里多项式是 a[0]z^2 + a[1]z + a[2] 的形式,所以 a=[1,-0.5,0.2] 对应 1-0.5z+0.2z^2,等价于写成 z 变换里的 1-0.5z^-1+0.2z^-2 整理后的形式。这个系统两个极点的模都小于 1,因此 BIBO 稳定。若出现某个极点模正好等于 1,系统是临界稳定,此时能否使用还要看收敛域,考试里最常见的答案是“不满足绝对可和,所以不能算稳定系统”。
3. 现代信号处理复习题中的计算题:从读题到写答案的标准流程
理论小题之后,复习题的主体通常是能写步骤的计算题,包括卷积、滤波器设计、功率谱估计。每一类都有固定的求解框架,如果能在 30 秒内识别出题眼,就能把分值变成流水线。这一章不只给公式,还给出可以直接验算的代码,让手算结果和代码结果互相印证。
3.1 线性卷积与圆周卷积的计算题:边界条件是得分点
线性卷积的定义是 y[n]=∑x[k]h[n-k],DFT 乘积对应的是圆周卷积。复习题最典型的陷阱是:先用 DFT 求卷积,要么忘了把序列补零到足够长度,要么在输出端取错区间。记住一个关键长度:长度分别为 M 和 N 的序列做线性卷积,结果长度是 M+N-1;只有当 DFT 点数 L≥M+N-1 时,循环卷积才等于线性卷积。
常见做题步骤如下:
- 写出两个序列长度,确定线性卷积结果长度。
- 若题目要求做 L 点循环卷积,先把两序列补零到 L。
- 用公式、矩阵或 FFT 求 DFT 乘积,再逆变换。
- 观察 L 小于线性卷积长度时,结果尾部会折叠到头部,这就是循环混叠。
import numpy as np x = np.array([1, 2, 3, 4]) h = np.array([0.5, 1]) y_linear = np.convolve(x, h) # 长度 = 4+2-1 = 5 N = 5 y_circ5 = np.fft.ifft(np.fft.fft(x, N) * np.fft.fft(h, N)).real N = 4 y_circ4 = np.fft.ifft(np.fft.fft(x, N) * np.fft.fft(h, N)).real print('线性卷积:', y_linear) print('5点循环: ', y_circ5) print('4点循环: ', y_circ4)运行后可以看到,5 点循环卷积与线性卷积完全一致,因为 5≥4+2-1;4 点循环卷积则把线性卷积索引 4 处的数值折叠到索引 0 处,形成混叠。代码里np.fft.fft(x, N)会把 x 自动补零到 N,这是一个非常容易忽略的细节,也是手算和代码结果对不上的常见来源。
3.2 FIR 与 IIR 滤波器设计的题目:频率转换表是必背项
滤波器设计题中容易丢分的位置,是模拟频率与数字频率的换算。数字频率 ω 与模拟频率 Ω 的关系由采样间隔 T 决定,但设计 IIR 滤波器时常用双线性变换 s=(2/T)(1-z^-1)/(1+z^-1)。这个变换把整个模拟频率轴压缩到单位圆一次,不会混叠,但会引入频率畸变,因此设计前需要预畸变。
| 设计方法 | 转换关系 | 频率混叠 | 相位特性 | 适合题型 |
|---|---|---|---|---|
| 脉冲响应不变法 | Ω=ω/T | 有 | 基本保持线性 | 窄带低通、模拟原型 |
| 双线性变换 | Ω=(2/T)tan(ω/2) | 无 | 非线性 | 通用 IIR 选频设计 |
| 简单差分近似 | s≈(1-z^-1)/T | 有 | 较差 | 一般不建议 |
考试时看到数字通带频率 fp 和阻带频率 fr,首先要转换为归一化频率。以采样率 fs=1000Hz 为例,fp=200Hz 对应的数字归一化频率是 2*fp/fs=0.4,fr=300Hz 对应 0.6。用 SciPy 可以不用每次手算预畸变,iirfilter或butter内部已经按双线性变换完成映射,但手算题仍要理解转换表。
from scipy import signal fs = 1000 fp = 200 fr = 300 rp = 1 rs = 40 N, wn = signal.buttord(2*fp/fs, 2*fr/fs, rp, rs) b, a = signal.butter(N, wn) w, h = signal.freqz(b, a, worN=2048, fs=fs) print('滤波器阶数:', N) print('200Hz 幅度:', abs(h[np.argmin(abs(w-200))])) print('300Hz 幅度:', abs(h[np.argmin(abs(w-300))]))buttord中的第一个参数是通带边缘归一化频率,第二个是阻带边缘归一化频率,1 对应奈奎斯特频率也就是 fs/2,所以这里写成 2*fp/fs。butter(N, wn)直接得到巴特沃斯滤波器系数。打印出的 200Hz 幅度应接近 1,300Hz 幅度应低于 10^(-40/20)=0.01。如果幅度不满足,就要回过去检查归一化频率是否写错,或者阶数是否被buttord计算出错。
3.3 功率谱估计的复习题:周期图与相关函数的取舍
功率谱估计复习题通常分两类,一类是给一段序列让求周期图或自相关谱,一类是概念题,问周期图为什么不一致。答案都落在“方差”与“分辨率”的权衡上。周期图直接对 N 点数据做 FFT 取模平方,分辨率是 fs/N,但方差并不随 N 增大而下降到零,这是它的理论缺陷;Welch 谱把数据分段、加窗、平均,用损失分辨率的代价换取稳定。
rng = np.random.default_rng(7) fs = 1000 N = 2048 t = np.arange(N) / fs x = np.sin(2*np.pi*60*t) + 0.3*np.sin(2*np.pi*150*t) + 0.5*rng.standard_normal(N) f1, P1 = signal.periodogram(x, fs, detrend=False) f2, P2 = signal.welch(x, fs, nperseg=512, noverlap=256, detrend=False)periodogram直接给出周期图谱估计,welch中nperseg=512表示每段取 512 点,noverlap=256表示相邻段重叠一半。Welch 谱的分辨率约为 fs/nperseg=1.95Hz,比整段周期图的 0.49Hz 粗,但方差明显减小。若在复习题中看到“数据很长,希望降低谱估计波动”,首选 Welch;若题目强调“想要分辨两个间隔很近的频率”,就必须用短分段以外的长数据做周期图或相关法。
4. 用脚本刷现代信号处理复习题:生成题、验算答案、可视化
复习阶段最怕的是题目数量不够、答案无处检查。把复习题变成一组可复用的 Python 函数,可以瞬间生成一道类似的新题,并自动验证手算步骤。下面用一组带噪混合信号,演示从数据生成、滤波器验算到小波去噪的完整回路。
4.1 用 NumPy 生成带噪声的随机信号作为题库
import numpy as np rng = np.random.default_rng(2024) fs = 4000 N = 8000 t = np.arange(N) / fs # 确定性正弦成分 + 随机高斯噪声 x = 0.8*np.sin(2*np.pi*50*t) + 0.2*np.sin(2*np.pi*320*t) x += 0.4*rng.standard_normal(N) # 加入一个瞬态脉冲 x[2500] += 2.0 np.save('review_signal.npy', x) np.savetxt('review_signal.csv', x, delimiter=',')固定随机种子2024,让每次生成的噪声形状都一致,复习时可以重复比较不同处理方法。正弦频率选 50Hz 和 320Hz,分别模拟低频主导和高中频成分;高斯噪声的方差 0.4 让信号信噪比处于中间档次,既能看到频谱峰,又不会一眼就看穿。数据保存为 npy 和 csv 两种格式,方便后续脚本用不同方式读取。
4.2 用 SciPy 验证 DFT 与滤波器设计的中文结果
有了标准数据后,最常用的验算是设计一个带通滤波器,确认输出频谱满足指标。下面代码生成 100Hz 到 250Hz 的巴特沃斯带通滤波器,并用频率响应函数的输出反查两个边界频率的幅度。
from scipy import signal x = np.load('review_signal.npy') fs = 4000 low = 100 / (fs/2) high = 250 / (fs/2) b, a = signal.butter(4, [low, high], btype='band') y = signal.lfilter(b, a, x) f, H = signal.freqz(b, a, worN=4096, fs=fs) print('100Hz 幅度', abs(H[np.argmin(abs(f-100))])) print('250Hz 幅度', abs(H[np.argmin(abs(f-250))]))low和high都是归一化频率,1 对应奈奎斯特频率。100Hz 的归一化频率是 100/(4000/2)=0.05,250Hz 对应的归一化频率是 0.125。freqz的fs=4000参数让返回频率轴是真实赫兹,因此可以直接用argmin找最近点。如果 100Hz 或 250Hz 的幅度与预期相差太多,先检查边界频率是否写反,再看滤波器阶数是否太低导致过渡带过宽。
4.3 用小波变换做去噪题:阈值怎么定才不是背口诀
去噪复习题几乎都会问到小波阈值怎么设。经典 Donoho-Johnstone 通用阈值是 thr=σ√(2lnN),其中 σ 用第一层细节系数中位数估计:σ=median(|cD1|)/0.6745。这个公式的依据是,高斯白噪声在第一层小波系数中占主导,中位数能稳定估计噪声尺度,而不受少量大系数干扰。
import pywt x = np.load('review_signal.npy') coeffs = pywt.wavedec(x, 'db4', level=3) cA3, cD3, cD2, cD1 = coeffs sigma = np.median(np.abs(cD1)) / 0.6745 thr = sigma * np.sqrt(2 * np.log(len(x))) cD1_th = pywt.threshold(cD1, thr, mode='soft') cD2_th = pywt.threshold(cD2, thr, mode='soft') cD3_th = pywt.threshold(cD3, thr, mode='soft') x_den = pywt.waverec([cA3, cD3_th, cD2_th, cD1_th], 'db4')db4是 Daubechies 小波中的一种,阶数为 4,兼顾时间局部性和振荡形态的匹配;level=3表示分解到第三层,层数越多对低频的刻画越细腻,但阈值作用于每一层细节系数时,要单独处理。代码只对细节系数做阈值,保留近似系数 cA3 不变。mode='soft'是软阈值,把系数向零收缩;硬阈值hard直接清零小于阈值的系数。两者在复习题中的区别如下。
| 阈值模式 | 处理方式 | 适用场景 |
|---|---|---|
| 硬阈值 | 小于阈值的系数置零,其余保留 | 对幅度敏感、要保留细节边缘 |
| 软阈值 | 每个系数向零收缩,幅度连续 | 标准去噪题、结果更平滑 |
5. 现代信号处理复习题的三种复盘技巧
复习到最后阶段,不能靠盲目刷题,而要通过复盘发现隐藏的知识漏洞。这里给出三种可以在不增加额外时间压力下,快速检查答案是否合理的技巧。
5.1 用卷积定理交叉验证卷积题
在卷积和 DFT 相关的复习题中,先用np.convolve算出线性卷积结果,再用 FFT 在长度大于等于 M+N-1 的条件下做循环卷积,两结果应当几乎完全一致。如果出现偏差,基本上可以断定是补零长度不够或取点数错误。这个方法也适用于验证滤波器对信号的卷积过程,尤其是考试里要求在时间域与频域分别计算时,两者交叉检查比任何公式背诵都可靠。
5.2 用帕塞瓦尔定理验证频域结果的能量守恒
离散信号 x[n] 的时域能量等于单边频域能量的换算关系,也就是 np.sum(np.abs(x)**2) 应约等于 np.sum(np.abs(np.fft.fft(x))**2)/N。功率谱估计题里,这个检查非常容易暴露错误:如果周期图计算出的总功率和时域均方值相差超过 1e-3,就该检查有没有漏掉窗函数修正因子。加窗后,时域能量会被压低,必须在功率谱密度上乘以窗函数平均功率的倒数,否则谱峰值会偏小,这一项在复习题中常常作为隐藏扣分点。
5.3 写一个简短的属性测试函数
把“线性”“时不变”这类判断型复习题,变成输入随机信号并调用系统函数的数值测试。例如对 T{x}=x[n]+x[n-1],构造两个随机序列,计算 T(ax1+bx2) 与 aT(x1)+bT(x2) 的差值是否接近零,再把输入延迟 n0 后观察输出是否同样延迟 n0。这个测试适用于任何给定差分方程的系统,比死背定义更接近工程实感。注意如果系统表达式里带有常数初始条件、非线性运算或查表操作,测试函数会给出 false,这时候要回到原始表达式逐行检查。
本文还有配套的精品资源,点击获取