ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

现代信号处理2020版习题:核心题型与避坑指南

现代信号处理2020版习题:核心题型与避坑指南 现代信号处理这门课的习题是那种你盯着答案看半小时也未必能悟出所以然的东西。我前后帮三个不同届的学生过过这套2020版的课后题也见过至少五种流传版本的手写答案——有的把双线性变换的预畸变环节直接省了有的在循环卷积长度上取了NN1N2还有的干脆把维纳滤波的自相关矩阵写成了反对称阵。所以这篇不是给你一份能照抄的答案而是把2020版习题里出现频率最高的几类题按看到什么特征就想到什么解法的方式重新拆一遍。这篇内容适合两类人看一类是正在跟课后题死磕、卡在某一步不知道下一步该往哪走的人另一类是把习题刷完了但心里没底、想找一套自查标准的人。信号处理这门学科有个特点它的题目很少有算错一个数这种低级失误绝大多数失分都发生在建模那一步——你选错了变换、定错了收敛域、漏了一个预畸变后面的推导再工整也全是白算。下面这些内容基本就是围绕怎么在动手之前把模型定对这件事展开的。1. 拿到题目先别急着列式子2020版习题的题型生态我统计过自己整理过的那三十多道题一个很明显的规律是这门课的习题不是按难度递增排的而是按数学工具分块排的。第2、3章的题基本都能用z变换一刀切中间几章全部围绕DFT和FFT打转后半部分才是滤波器设计和统计信号处理。你要是按页码顺序一题一题硬啃很容易在某一章被卡死然后失去节奏。1.1 三类题型占了八成以上的分值把2020版习题粗暴分类大致是三块题型大类典型特征常用工具失分重灾区变换与方程求解给出差分方程、序列或频谱表达式z变换、单边z变换、DFT定义收敛域、时移性质符号系统设计与参数计算给出通带阻带指标要求系数或阶数双线性变换、窗函数法、等波纹预畸变、过渡带宽度取整统计与迭代给出随机信号统计量或自适应结构维纳-霍夫方程、LMS、周期图自相关阵构造、步长范围这个分类看着简单实际用起来很管用。因为每类题的第一步动作完全不同变换类先看有没有初始条件设计类先看指标是模拟域还是数字域给的统计类先看已知的是自相关还是功率谱。第一步动作选错后面基本就没救了。1.2 判别靠已知量不靠章节标题很多人习惯先翻章标题觉得第5章的题肯定用第5章的方法。这个思路在设计题上还行在变换题上会翻车。举个我印象很深的例子一道题给出了一个二阶差分方程和一个初始条件y(-1)、y(-2)看起来是求系统响应但因为它带了非零初始条件实际要解的是全响应必须用单边z变换而不能用双边z变换做卷积。这两种方法在零初始条件下结果一样一旦初始条件非零用错了就是系统性错误。我给自己总结的判别顺序是先看有没有初始条件再看是离散还是连续域最后看要求的是解析表达式还是数值结果。这三步问完方法基本就锁定了。1.3 为什么对着答案反推是个坏习惯网上流传的答案有个共同问题它们只写推导不写动机。你看到一行对上式两边取z变换但你不知道作者为什么选z变换而不是直接做卷积也不知道他为什么把收敛域写成|z|2而不是|z|2。这种答案是结论正确、过程不可复现的典型。我的建议是把每道题的解答改写成三段式这一步在干什么、为什么需要这一步、这一步的约束条件是什么。看起来啰嗦但写到第三遍你会发现很多题其实只有两三个真正的决策点剩下的都是机械运算。把决策点找出来这类题就通了。提示如果你手上只有一份纯推导的答案最有效的补救方式是把每一步的输入和输出都标出来然后问自己这一步的输出下一步真的需要吗通常能暴露出删减或者跳步。2. z变换与差分方程从收敛域反推序列的完整链路变换类题目是2020版里数量最多的一块也是最容易看起来会做但实际做不完整的一块。这部分我把它拆成三个动作定收敛域、做部分分式、回代求序列。三个动作里第一个最容易被忽略第三个最容易出错。2.1 收敛域决定答案是否唯一同一个z变换表达式配不同的收敛域对应的是完全不同的时域序列。这一点在课堂上讲过但做题的时候很多人会下意识地只写一个|z|某值。我在批改别人作业时发现漏写收敛域的比例大概在一半以上。判断收敛域有一条硬性逻辑收敛域必须包含单位圆否则系统不稳定必须是一个环形或圆外区域且被极点划出的每段区间都要单独判断。具体题目里如果给的序列是右边序列从某个有限项开始往正方向无限延伸收敛域必然在最外层极点的圆外如果是左边序列收敛域在最内层极点的圆内如果是双边序列收敛域是极点之间的环带。2.2 部分分式展开的手算细节部分分式展开本身是代数动作但有两个细节决定了你最后能不能得到干净的答案。第一个细节是先除后乘。当分子阶数不低于分母阶数时必须先做多项式除法把X(z)拆成一个常数项加一个真分式。很多人在这一步直接对原式做部分分式结果多出一项不知道从哪冒出来的常数后面回代就乱了。第二个细节是极点重复时的处理。当出现(z-p)^2这类重极点时展开式里要同时保留A/(z-p)和B/(z-p)^2两项。B这一项在回代时对应的序列带一个n的因子即n·p^{n-1}·u(n)这一类形式。我见过太多人在重极点题里只写了一个系数答案自然对不上。回代阶段最稳的操作是把X(z)/z先展开再乘回z。因为标准z变换表里大部分是X(z)/z的形式比如z/(z-p)对应p^n·u(n)先除z能让系数直接对照表查避免来回凑。2.3 用单边z变换解差分方程的固定四步带初始条件的差分方程我的固定流程是四步对差分方程两边取单边z变换注意时移性质是X(z)乘z的负幂再加上初始条件带来的附加项比如对y(n-1)有z^{-1}Y(z)y(-1)把所有含初始条件的项挪到等式右边作为等效输入解出Y(z)的表达式做部分分式展开逐项回代按收敛域确定每一项是u(n)还是-u(-n-1)。第二步是把初始条件当输入处理这一步想明白了整类题就变成普通的零状态响应问题。我在给学弟讲的时候经常说初始条件本质上就是系统在n0之前攒下来的历史债你在n0这个时刻必须一次性还清。3. DFT与FFT数值对得上但思路错的三种典型DFT这块的题目有个迷惑性因为定义式就一行很多人觉得随便算算就对。但实际考试和作业里这块的失分点全在定义之外的细节上。我挑三个最典型的说。3.1 循环卷积长度的取值边界用DFT做循环卷积模拟线性卷积前提是圆周卷积长度N不小于两个序列长度之和减一。这个不等式本身不难记难的是判断题目给的两个序列长度到底算多少。如果序列是有限长序列长度就是非零样点的个数注意首尾的零要一起算进去如果序列是无限长的必须先截断再讨论这时候要额外说明截断带来的误差。还有一个容易被忽略的点如果题目要求的是用N点DFT计算循环卷积并说明其结果与线性卷积的关系那么除了给出长度条件还要指出当N不够大时循环卷积的结果等于线性卷积以N为周期做混叠叠加。这句话不写逻辑上就不完整。3.2 频谱泄漏和栅栏效应题目想问的到底是哪个这两个概念经常被混在一起考。判断方式很简单看题目问的是频率分辨率不够还是能量扩散到邻近频点。如果信号频率不是频率分辨率Δffs/N的整数倍谱峰会落在两个离散频点之间测得的是漏掉的峰值这是栅栏效应解决方式是增加点数或者调整采样长度让频率落在格点上如果信号被截断成有限长截断相当于乘了矩形窗频谱会和窗的频谱做卷积导致主瓣展宽、旁瓣堆积这是泄漏解决方式是换用旁瓣更低的窗函数。一句话区分栅栏是看不全泄漏是看糊了。我用这个说法给不少人解释过基本一次就记住。3.3 基2-FFT的蝶形结构与运算量估算运算量估算是这类题的常客。直接DFT的复数乘法次数是N²基2-FFT是(N/2)log₂N。如果题目要求计算N1024时两者的比值答案是1024²/((1024/2)×10)1024/5≈205倍也就是两个数量级左右的加速。蝶形结构本身也要会画。DIT按时间抽取的规律是输入倒序、输出正序DIF按频率抽取正好相反。考试里如果要求画N8的流图最容易出错的是倒序编号那一步。我自己的记法是把序号写成三位二进制然后左右翻转比如3011翻成110也就是6所以第3个输入位置放第6个样点。这个翻转规则比死记硬背可靠得多。4. 数字滤波器设计题从指标到系数的完整链路设计题是整本书里步骤最长、最容易中途断链的一类。我把完整链路画成这样读指标 → 判断模拟域还是数字域 → 预畸变 → 选原型 → 算阶数 → 求模拟系统函数 → 双线性变换 → 得到数字系数 → 验算频响。4.1 巴特沃斯阶数估算的入口在哪巴特沃斯滤波器的幅度平方响应是1/(1(Ω/Ωc)^{2N})这个式子是整条链路的起点。由通带和阻带的两个边界条件能推出阶数估算公式N ≥ log₁₀[(10^{As/10}-1)/(10^{Ap/10}-1)] / (2·log₁₀(Ωs/Ωp))这里的Ap是通带最大衰减dBAs是阻带最小衰减dBΩp和Ωs是通带和阻带的边界角频率。算出来的N必须向上取整这一步绝对不能四舍五入因为向下取整意味着阻带衰减不达标整个设计失效。确定N之后回头求Ωc有两种取法让通带刚好满足或让阻带刚好满足或取两者的几何平均。取几何平均的好处是通带和阻带都留有余量实际工程里更常见但考试里如果明确要求通带恰好满足就得按通带条件反解Ωc。4.2 双线性变换的预畸变最多人翻车的一步双线性变换的映射关系是Ω(2/T)·tan(ω/2)其中ω是数字角频率。这个映射是非线性的——模拟频率从0到∞时数字频率只从0走到π。由于这个非线性如果直接拿数字指标去设计模拟滤波器通带和阻带的边界位置会全部偏移。预畸变就是把这个非线性提前补掉。做法是把数字域给的ωp、ωs先用上面那个式子换算成对应的模拟角频率Ωp、Ωs再拿这两个值去做阶数估算和原型设计。很多人省掉这一步结果设计出来的滤波器截止频率偏低通带边缘衰减超标。我印象最深的一次是帮人查一道题他算出来的阶数和参考答案一样但系数完全不同。查了半天发现问题就在这里他用了数字域的π/4直接当Ωp正确的做法是先tan(π/8)再乘2/T。数值上差了将近好几倍。4.3 FIR窗函数法的过渡带与阻带衰减对照FIR设计题的思路比IIR直接先根据理想频响求单位脉冲响应再用窗函数截断。核心是窗函数的选择它同时决定了过渡带宽度和阻带最小衰减。窗函数过渡带宽度归一化π单位最小阻带衰减dB主瓣宽度矩形窗1.8/N21最窄汉宁窗6.2/N44较宽海明窗6.6/N53较宽布莱克曼窗11.1/N74最宽凯泽窗β可调依β而定依β而定依β而定用这张表做题的流程是先由阻带衰减要求挑窗型再由过渡带宽度反推所需阶数N。比如要求阻带衰减50dB、过渡带宽度0.2π查表得海明窗能满足衰减代入0.2π6.6/N得到N33取N34保证奇数长度或者按题目要求。这里N和阶数M的关系是MN-1题目问阶数时别答错。4.4 线性相位FIR的四种类型与适用边界线性相位FIR分成四类由对称性和长度奇偶决定类型I偶对称、奇数长度可以用于任意滤波器类型II偶对称、偶数长度在ωπ处必然为零不能做高通类型III奇对称、奇数长度在ω0和ωπ处都为零不能做低通和高通类型IV奇对称、偶数长度在ω0处为零不能做低通。这个约束经常作为判断题出现。识别的诀窍是看对称中心落在哪里对称中心在整数样点上对应奇数长度落在两个样点之间对应偶数长度。至于为什么类型II在π处一定为零可以从H(π)的求和表达式看出来——偶对称加偶数长度会让求和项正负成对抵消。5. 谱估计与自适应滤波从维纳解到LMS的迭代结构这一部分是整本书里最反直觉的一块。前面几章的题基本都能手算验证这一块的题往往给一组统计量要求你写出估计器或者推导迭代式答案对不对很难通过具体数值判断。所以要格外注意结构上的完整性。5.1 自相关矩阵的构造决定一切维纳滤波的核心方程是Rwp其中R是输入信号的自相关矩阵p是输入与期望信号的互相关向量。这道题失分最集中的地方是R的构造。对于一个M阶FIR维纳滤波器R是一个M×M的托普利兹矩阵第(i,j)个元素是r_xx(|i-j|)也就是只和下标之差的绝对值有关。很多人错误地把R写成了对称但非托普利兹的形式比如把r_xx(ij)填进去结果解出来的权系数完全不对。托普利兹结构的物理含义是平稳性——信号的统计特性不随时间平移改变。理解了这一点你就不会写错。5.2 维纳-霍夫方程与正交性原理解出wR⁻¹p只是代数结果题目往往还要求说明它的最优性依据。这里要写的是正交性原理最优滤波器下误差e(n)与输入向量x(n)的每一个分量都正交即E[e(n)x(n-k)]0对所有k成立。把这个条件展开正好得到Rwp。我在整理答案的时候发现写出正交性原理的解答得分明显更高因为它是这道题的物理意义部分。信号处理的题目里凡是能用正交性、最小均方、最大似然这类原理重新表述一遍的都值得多写两句。5.3 LMS的步长范围与收敛判断LMS的权更新式是w(n1)w(n)μe(n)x(n)。步长μ的收敛条件是0μ2/(M·P_x)其中M是滤波器长度P_x是输入信号功率。题目里如果给了输入信号的方差和滤波器阶数直接代入算边界就行。这里有个易错点P_x有的是用方差σ²给的有的是用均方值给的。如果输入是零均值的两者相等如果有直流分量均方值等于方差加均值平方用错了步长上限就会算偏。另外题目常问μ取多大时收敛速度最快。理论上μ越接近上限收敛越快但代价是稳态失调增大。工程上常用的经验值是把μ取到上限的十分之一到五分之一兼顾速度和稳态精度。这个经验系数通常不会写在教材答案里但实际调试的时候很有用。6. 多速率信号处理抽取内插题的固定流程多速率这部分在2020版里通常占一到两道大题题量不多但步骤很固定属于会了就一定拿分的类型。6.1 抽取前后频谱被拉伸内插后频谱被压缩抽取M倍时域上每M个点取一个频域上原来的频谱在频率轴上被拉伸M倍并叠加M个副本。如果原信号的最高频率超过了π/M这些副本就会重叠产生混叠。所以抽取之前必须先做抗混叠低通滤波截止频率设在π/M。内插L倍正好相反时域上每两个样点之间插入L-1个零频域上频谱被压缩L倍同时出现L-1个镜像。这些镜像必须用低通滤波去掉截止频率设在π/L。镜像滤不干净输出信号里会出现高频的嗡嗡声这个问题在音频处理里特别明显。6.2 抗混叠滤波器的指标怎么定滤波器指标的确定有个固定套路通带边界设在信号带宽处阻带边界设在π/M处抽取情形阻带衰减由允许的混叠电平决定。如果题目给了混叠分量不超过原信号的1%那就是-40dB的阻带衰减要求。这里有个细节容易被忽略过渡带宽度决定了滤波器的阶数而多速率系统里滤波器工作在低采样率侧所以阶数的计算要用抽取后的采样率来折算。用错采样率阶数会差M倍整个设计就不实用了。6.3 多相分解的计算量账多相分解是多速率部分的进阶内容。它的核心思想是把一个长滤波器拆成M个短滤波器每个短滤波器只在特定的相位上工作。对于M倍抽取如果先滤波再抽取每输出一个点要做M次乘法如果先做多相分解再抽取每个输出点只需要做一次乘法运算量降低M倍。题目如果要求计算多相实现相对直接实现的运算量比答案就是M:1。这个结论很简单但要写出推导过程需要把分解结构画清楚。我建议用N8、M2这样的小例子先手推一遍把这个结构刻在脑子里。7. 用几行Python把答案验一遍纯手算的答案是靠不住的尤其是滤波器系数这种一长串数字。我自己现在做这类题的习惯是手算一遍、代码跑一遍两边对上了才敢交。7.1 变换类题目的数值验证验证z变换的结果最直接的办法是把反变换得到的序列前若干项算出来再和用差分方程直接递推的结果对比。比如解一个二阶差分方程你可以直接写import numpy as np # 手算得到的脉冲响应系数 b [1, 0.5] a [1, -1.2, 0.35] n np.arange(20) impulse np.zeros_like(n, dtypefloat) impulse[0] 1.0 # 递推求解 y np.zeros_like(n, dtypefloat) for k in range(len(n)): acc sum(b[j] * (impulse[k-j] if k-j 0 else 0) for j in range(len(b))) acc - sum(a[j] * y[k-j] for j in range(1, len(a))) y[k] acc print(np.round(y[:10], 4))把手算的部分分式展开式代入前10项如果数值一致说明展开系数和收敛域判断都没问题。这个方法对重极点的情况特别有用因为重极点的系数很容易算错。7.2 滤波器设计的频响回代设计完IIR滤波器之后把系数代进去画幅频响应直接看通带是不是在指定频率处衰减了Ap、阻带是不是从指定频率起衰减了Asfrom scipy import signal import numpy as np # 双线性变换后得到的数字系数 b [0.0201, 0.0602, 0.0602, 0.0201] a [1.0, -2.1174, 1.7082, -0.4691] w, h signal.freqz(b, a, worN2048) mag_db 20 * np.log10(np.abs(h) 1e-12) # 检查通带边缘和阻带边缘 wp_idx int(0.2 / np.pi * 2048) ws_idx int(0.35 / np.pi * 2048) print(f通带边缘衰减: {mag_db[wp_idx]:.2f} dB) print(f阻带边缘衰减: {mag_db[ws_idx]:.2f} dB)如果通带边缘衰减算出来比指标要求的大很多说明截止频率定低了通常是预畸变那一步用了错误的频率值。这个方法能帮你快速定位错误出在哪一环。7.3 自适应迭代的收敛曲线LMS这类迭代算法最好的验证方式是把学习曲线画出来import numpy as np M 8 mu 0.01 N 2000 rng np.random.default_rng(42) x rng.normal(0, 1, N) h_true rng.normal(0, 0.5, M) d np.convolve(x, h_true)[:N] w np.zeros(M) err np.zeros(N) for n in range(M, N): xv x[n:n-M:-1] y w xv e d[n] - y w 2 * mu * e * xv err[n] e ** 2 print(f末段均方误差: {np.mean(err[-500:]):.4f})如果曲线收敛到一个稳定的小值说明步长选得合理如果振荡不收敛先把μ减半再试如果收敛太慢在保证稳定的前提下增大μ。这个试错过程本身就是理解步长上限的实际操作。8. 复盘时最容易丢分的几个动作翻了这么多道题的答案我发现丢分点其实高度集中就那么几个。把它们列出来比多做十道题管用。第一收敛域漏写或者写错。这道工序看着多余但它是判断答案唯一性的唯一依据缺了就等于没答完整。第二滤波器设计题里采样率单位混乱。题目有时候给模拟频率用Hz有时候给数字频率用弧度中间要靠采样率换算。换算过程中把角频率和普通频率搞混是最常见的错误。我自己的习惯是每一步都写清单位宁可多写几个字。第三DFT题里点数N和序列长度搞混。序列长度是数据本身的属性点数是你做变换时选的参数两者可以不同。题目问能否用N点DFT无失真地实现线性卷积时判断依据是点数而不是序列长度。第四统计题里期望和样本平均混用。维纳滤波用的是理论自相关LMS在线估计用的是瞬时值或者块平均。两者的数学地位完全不同写推导的时候要区分清楚。第五画图题不标坐标轴。幅频响应图的横轴要标归一化频率纵轴要标dB关键点要标出来。这个属于形式分但确实有题目会扣。注意这套习题里凡是涉及数值计算的题都建议保留四到五位有效数字。滤波器系数对数值误差比较敏感用两位小数算出来的系数经常会导致频率响应偏移好几分贝。我个人在做这套题时最有效的习惯是把每道题的第一句话单独抄出来然后只在那句话上做判断——这道题给的是时域还是频域、是确定性还是随机、是设计还是分析。这三组判断做完解法基本就确定了。剩下的时间全部花在把中间过程写清楚上而不是花在反复怀疑自己的路子上。
返回列表