资讯详情 匹配滤波器MATLAB实现:原理、峰值检测与测距
📅 2026/11/6 4:38:35
简介匹配滤波器原理及MATLAB实现是一份面向通信、信号处理课程学习者与初级算法实践者的轻量教程聚焦噪声环境下已知信号的最佳检测问题围绕最大信噪比准则讲解匹配滤波器的互相关原理、共轭时间反转结构及峰值检测思路。压缩包仅822B共2个文件包含1个m脚本和1个txt文本前者承载MATLAB侧的原理验证与滤波实现后者用于补充说明或参考资料索引体量虽小但主题集中。已有4934人学习说明该主题在课程实验与入门自学中具有较高关注度。读者可借助其中的代码框架对照理解发送信号生成、噪声叠加、滤波器设计及输出峰值判读等关键环节并以此为起点复现匹配滤波流程、核对理论公式与仿真结果适合作为通信原理实验和最佳接收机入门的参考材料。1. 一个 -12 dB 下还能把目标挑出来的滤波器值不值得自己撸一遍匹配滤波器这东西我第一次真正用上是帮某实验室调一套超声测距的接收链路。回波信噪比压到 -12 dB 上下包络检波的门限怎么摆都是虚警和漏检两头跑门限抬高两米外的弱回波直接消失门限压低噪声尖峰又把距离读数打到 0.3 米。后来换了个思路——把参考波形时间反转、取共轭再跟回波卷一遍峰值信噪比一口气抬了 20 dB 以上门限一刀切下去干净利落。通信、雷达、超声、水声只要凑齐“已知波形 白噪声”这个组合它几乎都是绕不开的第一选择。这份 MATLAB 实现走的是最朴素的路线不依赖任何工具箱七八个函数把参数、波形、卷积、门限检测拆开写跑一遍就能看到时域回波、滤波输出和时延估计值。新手能照着把公式变成能跑的代码熟手能拿它当基线工程往 LFM 脉压、多普勒通道上扩。2. 原理拆解从输出信噪比最大倒推滤波器长什么样2.1 为什么是“倒着卷一遍”三步推导先把问题摆清楚。发射波形记作s(t)能量E ∫|s(t)|²dt。接收信号是r(t) A·s(t - t0) n(t)n(t)是零均值白噪声双边功率谱密度N0/2。现在挂一个线性时不变滤波器h(t)希望在t t0 T这个判决时刻输出的信号功率与噪声功率之比尽可能大。第一步写输出。滤波器的输出是卷积y(t) r(t) * h(t)在t T0把t0 T合并成一个常数时刻信号分量可以写成频域积分y_s(T0) (A/2π) ∫ S(ω) H(ω) e^{jω(T0 - t0)} dω噪声分量是白噪声激励线性系统的响应输出噪声功率等于噪声谱密度乘上滤波器能量P_n (N0/2) · (1/2π) ∫ |H(ω)|² dω第二步做比值。输出信噪比就是|y_s(T0)|² / P_n把上面两式代进去SNR |∫ S(ω)H(ω)e^{jω(T0-t0)}dω|² / (π N0 ∫|H(ω)|²dω)第三步用 Cauchy-Schwarz 不等式放大。把被积函数看成两个向量的内积|∫ S·H·e^{jωΔ}dω|² ≤ ∫|S|²dω · ∫|H|²dω等号成立的条件是H(ω)与S(ω)e^{-jωΔ}成比例。把那个相位因子吸收进常数就得到H(ω) k · S*(ω) · e^{-jωT0}换回时域h(t) k · s*(T0 - t)。这就是全部秘密——时间反转再取共轭。写成离散形式就是h[n] conj(s[N-1-n])MATLAB 里一行conj(flipud(s))搞定。提示这里的 2 倍因子是单边谱和双边谱约定不同造成的不同教材的推导会差一个常数。工程上记住结论就行——输出峰值信噪比约等于“信号能量除以噪声单边功率谱密度”量级上跟10*log10(N)N 为脉冲采样点数对得上就够了。最大信噪比能到多少把H kS*e^{-jωT0}代回去SNR_max 2E/N0。这个式子的意思是只要波形能量固定不管你把能量摊成多宽的频带匹配滤波后的峰值信噪比都是同一个数。这跟直觉有点冲突但仔细想也合理——匹配滤波干的事就是把这个能量在判决时刻全部相干地堆到一个采样点上。推导完了回头看为什么非得反转因为卷积本身就是“翻转 平移 相乘求和”。你手动把s翻一次卷积里的翻转就把这次翻转抵消掉剩下的恰好是“逐点相乘再累加”的相关运算。所谓匹配匹配的就是这个相位。2.2 频域视角匹配滤波其实是共轭匹配从H(ω) k·S*(ω)·e^{-jωT0}这个式子能读出两层含义值得单独拎出来讲。看幅频|H(ω)| |k|·|S(ω)|。滤波器的幅度响应曲线跟信号自己的频谱形状完全一样。信号在哪个频点强滤波器在哪个频点就“放行”得多信号在哪个频点弱甚至为零滤波器在那儿也就基本不响应。这跟常规低通、带通滤波器的思路完全是两回事——后者是凭经验画个通带阻带匹配滤波是让信号自己定义通带。看相频∠H(ω) -∠S(ω) - ωT0。信号本身各频率分量的相位是散开的滤波器给每个分量补一个相反的相位再加上一个随频率线性变化的-ωT0。补偿的结果是在t T0这一刻所有频率分量的相位全部对齐同相相加。这就是“相干积累”四个字的物理含义。换个说法匹配滤波器在频域做的事就是把接收信号里那份属于s(t)的谱用共轭的方式“对齐相位、按强度加权”别的一概不管。噪声是白的各频点功率一样加权之后总功率是∫|H|²而信号是相干的加权之后是|∫ SH|一平方一比差距就出来了。这也解释了一个常见疑问匹配滤波器是不是追求“滤得干净”不是。它不追求把带外噪声滤掉它追求的是判决时刻那一个采样点上的信噪比最大。输出波形好不好看它不负责。2.3 匹配滤波、相关接收与白化滤波的等价关系实际工程里经常听到三个说法匹配滤波、相关接收、滑窗相关。概念上它们是一回事只是输出形式不同。相关接收机是这么算的y(T0) ∫ r(t)·s*(t - T0) dt只算判决时刻那一个值。匹配滤波器是把整个y(t)都算出来判决时刻取峰值。把h(t) s*(T0 - t)代进卷积定义展开就是相关接收的式子。所以“匹配滤波 全长输出的相关器”这句话是对的。实现方式输出形式复杂度典型用途时域相关逐点滑窗全长O(M·N)短序列、教学演示时域卷积conv全长O(M·N)中等长度代码最直观filter(h,1,r)全长O(M·N)需要流式处理时FFT 频域相乘全长O(L·logL)长序列、实时系统第三种情况要单独说一下白化。上面推导全程假设噪声是白的功率谱平坦。如果噪声有色比如接收机前端有个窄带干扰直接匹配滤波就不是最优了。标准做法是先在前面串一个白化滤波器1/Sn(ω)Sn是噪声功率谱把噪声压平再对新波形做匹配。很多雷达抗干扰的处理链就是这么搭的只不过工程上很少真的去估Sn(ω)一般用自适应权值近似。还有一点容易被忽略S*(ω)里的共轭对实信号来说就是S(-ω)频域翻转。所以实信号的匹配滤波器幅频响应是信号谱的镜像。对复信号解析信号、基带复包络就必须老老实实取共轭这一步漏了输出会变成两路信号互相关峰值直接掉一半。后面避坑那章会专门讲这个。3. MATLAB 工程搭起来参数、信号、滤波器三段式3.1 目录与函数职责划分我不喜欢把所有东西塞进一个.m文件里调参调到后面自己都不认识哪行是哪行。这套实现按“参数 → 信号 → 滤波 → 检测 → 评估”切成函数主脚本只负责串流程matched_filter_demo/ ├── main_demo.m % 主流程只做编排 ├── param_init.m % 所有可调参数集中在这 ├── gen_signal.m % 发射波形生成 ├── add_echo.m % 按目标时延/幅度叠加回波并加噪 ├── matched_filter.m % 时域匹配滤波 ├── matched_filter_fft.m % 频域快速实现长序列用 ├── peak_detect.m % 门限检测 局部极大值筛选 ├── eval_snr.m % 峰值信噪比评估 └── plot_result.m % 三联图输出文件输入输出改它的场景param_init.m无结构体 P换采样率、脉宽、信噪比gen_signal.mPs, t换成 LFM、相位编码add_echo.mP, s, 时延/幅度向量r, t加多目标、多普勒matched_filter.mr, sy, h加窗、换滤波器结构peak_detect.my, 门限系数峰值索引/幅度换 CFAReval_snr.my峰值信噪比 dB接性能统计这么拆的好处是改一处不影响别处。比如想把矩形脉冲换成线性调频只动gen_signal.m一个文件想把固定门限换成 CFAR只动peak_detect.m。做二次开发时这个边界感很值钱。3.2 发射波形与回波模型参数先集中起来。采样率取 200 kHz脉宽 1 ms载频 20 kHz点数正好 200 点function P param_init() % 参数集中管理改这里就够了 P.fs 200e3; % 采样率 200 kHz P.T 1e-3; % 脉宽 1 ms P.f0 20e3; % 载频 20 kHz P.N round(P.T * P.fs); % 每脉冲采样点数200 P.snr_dB -10; % 脉冲内每采样点信噪比 P.rngSeed 20240501; % 固定种子保证每次跑结果一致 rng(P.rngSeed); endP.N这个量后面到处要用。它既是脉冲长度也是匹配滤波的增益因子——理论上输出峰值信噪比等于输入信噪比加上10*log10(P.N)这一条是后面验证结果对不对的标尺。波形生成函数返回列向量能量归一化到 1function [s, t] gen_signal(P) % 生成复单频脉冲能量归一化 t (0:P.N-1). / P.fs; % 列向量时间轴 s exp(1j*2*pi*P.f0*t); % 复指数长度 N s s / sqrt(sum(abs(s).^2)); % 能量归一化到 1 end能量归一化这一步不是可选项。归一化之后mean(abs(s).^2) 1/N匹配滤波输出峰值恰好等于 1因为自相关峰值等于信号能量噪声方差也恰好等于输入噪声方差因为h的能量也是 1。这样一来所有量纲都对齐后面算信噪比不用再做换算省掉一大堆“这个 20 还是 10”的纠结。回波模型把多个目标按给定时延和幅度叠进一个观测窗再按指定信噪比加复高斯白噪声function [r, t] add_echo(P, s, delayList, ampList) % 按目标时延与幅度叠加回波并加复高斯白噪声 tMax max(delayList) P.T 5e-3; % 观测窗留 5 ms 余量 M round(tMax * P.fs); r zeros(M, 1); for k 1:numel(delayList) i0 1 round(delayList(k) * P.fs); % 起始样本索引 seg i0 : i0 P.N - 1; r(seg) r(seg) ampList(k) * s; % 叠加第 k 个目标 end % 噪声功率按脉冲内每采样点信噪比定义 p_sig mean(abs(s).^2); % 1/N p_noi p_sig / 10^(P.snr_dB/10); noise (randn(M,1) 1j*randn(M,1)) / sqrt(2); % 单位方差复噪声 r r sqrt(p_noi) * noise; t (0:M-1). / P.fs; end几个参数值得说清楚。delayList是目标的双程时延秒换算成样本索引就是乘fs再取整取整误差不超过半个采样间隔对应测距误差c/(2fs)200 kHz 下大约 0.75 毫米实际工程够用。ampList是各目标相对幅度用来模拟不同距离衰减。噪声那里除以sqrt(2)是为了让复噪声的方差归一——randn 1j*randn的方差是 2除完正好是 1。还有个细节p_sig用的是单脉冲内的平均功率1/N不是整个观测窗的平均功率。因为观测窗里大部分是空白用整窗平均会把噪声压得很低实际信噪比跟设定值对不上这是我自己踩过的坑。3.3 匹配滤波器核心函数主函数就两行但顺序不能错function [y, h] matched_filter(r, s) % 时域匹配滤波h conj(flip(s))再与 r 做线性卷积 h conj(flipud(s)); % 时间反转 共轭缺一不可 y conv(r, h); % 输出长度 numel(r) numel(s) - 1 endflipud对列向量做上下翻转conj取共轭。这两个操作对实信号来说conj是空的所以你拿实信号测试永远发现不了漏写共轭的问题一换到复基带信号就翻车。conv的输出长度是M N - 1比输入长N - 1个点。这个尾巴不是 bug是线性卷积的正常结果但它会带来一个坐标偏移问题回波在第d 1个样本起始卷积后的峰值却在第d N个索引。后面测距换算必须减掉这个N不然距离会整体偏N/fs秒。长序列场景下时域卷积会慢换频域实现function y matched_filter_fft(r, s) % 频域等效实现FFT 相乘再 IFFT适合长序列 L numel(r) numel(s) - 1; nfft 2^nextpow2(L); % 补零到 2 的幂防循环卷积混叠 Y fft(r, nfft) .* conj(fft(s, nfft)); y ifft(Y); y y(1:L); % 截掉补零尾巴保持与时域版本等长 end2^nextpow2(L)这一步是必须的。如果nfft小于LIFFT 出来的是循环卷积尾部会绕回头部出现“鬼影峰值”。这个坑很隐蔽——大部分时候峰值还在只是多出几个假的看着像噪声尖峰实际上是算法bug。频域版本和时域版本的结果应该完全一致差一个数值精度可以写个断言验证max(abs(y1(1:L) - y2)) 1e-10。我一般在新环境上跑一次这个检查确认 FFT 那套没写错。3.4 峰值检测与测距换算检测这块我不用固定门限用噪声底估计function [idx, amp, sigma] peak_detect(y, thrFactor) % 基于 Rayleigh 包络中位数的自适应门限检测 yMag abs(y(:)); sigma median(yMag) / sqrt(2*log(2)); % 中位数反推 Rayleigh 尺度参数 thr thrFactor * sigma; % 门限 系数 × 噪声底 isOver yMag thr; locMax false(size(yMag)); locMax(2:end-1) (yMag(2:end-1) yMag(1:end-2)) ... (yMag(2:end-1) yMag(3:end)); idx find(isOver locMax); amp yMag(idx); if isempty(idx) warning(未检测到超过门限的峰值检查 thrFactor 或 snr_dB); end end为什么用中位数而不是均值因为均值会被强目标拉高弱目标就漏了中位数对少量大值不敏感估计的是“背景水平”。Rayleigh 分布的中位数是sigma * sqrt(2*ln2) ≈ 1.1774 * sigma反推回去就是噪声底。这个估计器在目标占比低于 30% 时都很稳。thrFactor取多大对 Rayleigh 包络虚警概率Pfa exp(-thrFactor²/2)。取 4Pfa ≈ 3.4e-4取 5Pfa ≈ 3.7e-6取 6Pfa ≈ 1.5e-8。做演示我一般用 5虚警少又不至于漏。locMax那两行筛的是局部极大值防止一个目标的展宽主瓣被检出好几次。注意边界处理只从 2 到 end-1首尾两个点不参与省得越界。测距换算在主脚本里做就是前面说的那个减NdelayEst (idx - P.N) / P.fs; % 索引 - 时延秒 rangeEst delayEst * 1500 / 2; % 假设声速 1500 m/s双程除以 2换算公式的来龙去脉回波从第d1个样本开始d round(delay*fs)卷积峰值出现在d N所以d idx - N时延 d / fs。写成(idx - P.N) / P.fs一步到位。3.5 主脚本与指标输出主脚本只做编排不写具体算法P param_init(); [s, ~] gen_signal(P); delayList [2e-3, 7.5e-3]; % 两个目标2 ms 和 7.5 ms ampList [1.0, 0.6]; % 幅度比 1 : 0.6 [r, t_r] add_echo(P, s, delayList, ampList); [y, ~] matched_filter(r, s); [idx, amp, sigma] peak_detect(y, 5); delayEst (idx - P.N) / P.fs; rangeEst delayEst * 1500 / 2; % 峰值信噪比评估 snr_out 20*log10(max(abs(y)) / sigma); snr_th P.snr_dB 10*log10(P.N); fprintf(理论输出 SNR: %.1f dB\n, snr_th); fprintf(实测峰值 SNR: %.1f dB\n, snr_out); for k 1:numel(idx) fprintf(目标 %d: 时延 %.3f ms, 距离 %.1f mm\n, ... k, delayEst(k)*1e3, rangeEst(k)*1e3); endsnr_th那行是整个工程的“体检指标”。输入的每采样点信噪比是 -10 dB匹配滤波增益10*log10(200) ≈ 23 dB理论输出应该是 13 dB 左右。实测一般落在 12.6 到 13.4 之间偏差来自噪声随机性。如果实测只有 7 dB、8 dB那肯定有地方错了——最常见的是漏了共轭或者h没翻转。这个对照关系比看波形图靠谱得多波形图你永远能说服自己“看起来还行”。plot_result.m里画三联图原始回波、匹配滤波输出包络、门限与检测点。第一个图看噪声有多糊第二个图看峰值有多尖第三个图看门限切得合不合适。三张图摆一起出问题时一眼能定位到是哪一环。4. 实现细节决定成败离散化、四种写法与门限4.1 采样率、脉宽与点数的三角关系这一节讲清楚fs、T、N三者的约束因为改参数时最容易在这里翻车。采样率的下限由信号带宽决定不是由载频决定。对单频脉冲理论上带宽很窄但实际发射机有调制、有包络带宽B大致是1/T量级。工程上按fs ≥ 4B到8B取留够余量因为匹配滤波的峰值形状对过采样率敏感——采样点落在主瓣边缘还是中心输出峰值能差 1 dB 以上。点数N round(T * fs)必须是整数这一步的取整会带来脉宽误差ΔT ≤ 0.5/fs。200 kHz 下是 2.5 微秒对应测距误差不到 2 毫米可以接受。但如果你把fs降到 10 kHz同样的取整误差就变成 50 微秒、37 毫米这时候必须回过头修正T或者改用分数延迟。还有一个隐性约束N越大匹配滤波增益越高10log10(N)但计算量也线性增长而且对多普勒频移越来越敏感。1000 点的脉冲一点点频偏就能让峰值掉好几个 dB。这个取舍在做 LFM 的时候尤其明显。% 参数检查放在 param_init 末尾改参数时自动报警 assert(P.fs 4/P.T, 采样率偏低匹配滤波峰值会有明显损失); assert(abs(P.N*P.fs^-1 - P.T) 1/P.fs, 点数与脉宽不自洽);这两行断言挡住过好几次“改了 T 忘了改 fs”的低级错误。加到工程里成本几乎为零。4.2 conv / filter / xcorr / fft 四种写法的差异同一件事 MATLAB 里至少有四种写法结果在理想情况下应该一致但细节差别不小。% 写法一conv最直观 h1 conj(flipud(s)); y1 conv(r, h1); % 写法二filter适合流式 y2 filter(h1, 1, r); % 写法三xcorr注意参数顺序 y3 xcorr(r, s); % xcorr 内部已经做了共轭等价于 conv(r, conj(flipud(s)))conv和filter的结果完全一样但索引对齐方式不同。conv(r,h)的第一个输出对应r[0]*h[0]filter(h,1,r)的第一个输出也是两者等长吗不等——conv输出MN-1点filter输出M点。filter截掉了尾部N-1点因为它是因果滤波器认为“未来的输入还没来”。做离线处理用conv更省心做实时流式必须用filter但要自己管状态filtic或者dsp.FIRFilter。xcorr的结果长度是2*max(M,N)-1而且它会自动补零对齐索引换算跟conv完全不同。我一般不推荐用xcorr做这件事除非你很清楚它在干什么——它内部对较短的那个序列补零到等长再做共轭翻转中间的偏移规则要单独算。第四种是 FFT3.3 节已经给过代码。总结一下选择依据场景推荐写法理由教学演示、短序列conv代码最贴近公式序列长度 10000FFT复杂度从 O(MN) 降到 O(LlogL)实时流式处理filter 状态管理因果、逐点输出只想算一个相关值内积s*r不需要全长输出有个坑要提一句xcorr默认会做归一化吗不会但它的索引从负延迟开始y3(N)对应零延迟。如果你直接拿find(y3 max(y3))当峰值索引得到的数字跟conv那套完全对不上中间差了N-1。这个偏移量我在不同项目里至少栽过三次。4.3 噪声底估计与虚警门限门限这块固定阈值是最容易写也最容易出事的写法。if max(abs(y)) 0.5这种换个信噪比、换个目标数量立刻就废。正确的做法是让门限跟着噪声底走。3.4 节用的是全局中位数简单有效但有两个局限一是要求目标占总样本比例低通常满足脉冲很窄二是噪声底在观测窗内均匀白噪声满足有色噪声不满足。如果背景不均匀比如近距强杂波就得上单元平均 CFARfunction det ca_cfar(yMag, guardLen, refLen, pfa) % 单元平均 CFAR用两侧参考单元估计局部噪声底 L numel(yMag); det false(L,1); alpha refLen * (pfa^(-1/refLen) - 1); % CA-CFAR 门限因子 for i guardLenrefLen1 : L-guardLen-refLen leftRef yMag(i-guardLen-refLen : i-guardLen-1); rightRef yMag(iguardLen1 : iguardLenrefLen); noiseEst mean([leftRef; rightRef]); det(i) yMag(i) alpha * noiseEst; end endguardLen是保护单元防止目标主瓣泄漏到参考窗里抬高噪声估计这叫“目标自遮蔽”。refLen一般取 16 到 32。alpha那个公式是 CA-CFAR 的标准门限因子给定虚警率pfa直接算出来不用手调。pfa 1e-4、refLen 24时alpha ≈ 24*(1e-4^(-1/24) - 1) ≈ 11.2。这个数比固定系数 5 大不少因为 CA-CFAR 估的是均值不是尺度参数两者不是一回事别混着用。CFAR 的代价是运算量和边缘效应。序列头尾各guardLenrefLen个点检测不了做短序列演示时会明显看出两端“瞎了”。这个取舍自己权衡。4.4 旁瓣、多目标与距离分辨率矩形脉冲的匹配滤波输出是三角形自相关的形状第一旁瓣 -13.2 dB。这个电平意味着一个强目标旁边 -13 dB 处的弱目标会被旁瓣淹掉检测不出来。这是匹配滤波的固有缺陷不是实现问题。解决办法是加窗。在构造h的时候乘一个 Hamming 或 Taylor 窗w hamming(P.N); % 或 taylorwin(P.N, 5, -35) h conj(flipud(s)) .* w; % 加窗后的匹配滤波器 h h / norm(h); % 重新归一化能量代价是主瓣展宽。Hamming 窗把第一旁瓣压到 -42 dB但主瓣宽度从2/fs变成大约3/fs距离分辨率下降 1.5 倍峰值信噪比也损失约 1.3 dB。这是一个非常典型的工程折中——旁瓣抑制和分辨率不可能同时最优。窗函数第一旁瓣主瓣展宽峰值 SNR 损失矩形不加窗-13.2 dB1.0×0 dBHamming-42.7 dB1.5×1.34 dBHann-31.5 dB1.5×1.76 dBTaylor (-35 dB)-35 dB1.4×约 1.2 dB多目标场景下还要注意“弱目标被强目标旁瓣掩盖”。两个目标时延差小于主瓣宽度时本来就会融合成一个峰这是分辨率的物理极限加窗也救不了。时延差大于主瓣但小于旁瓣范围时加窗能救。还有一个隐性因素目标幅度动态范围。如果强弱目标差 30 dB而旁瓣只有 -42 dB那弱目标仍然在旁瓣之下还是检测不到。这时候要么提高分辨率增大带宽要么做旁瓣抑制算法自适应权、CLEAN 之类单靠匹配滤波不够。5. 避坑与常见问题排查五个我自己翻过的车5.1 峰值位置总差 N 个点距离整体偏移现象检测到的时延比设定值大了整整N/fs秒200 kHz、200 点下就是 1 ms换算成距离偏了 0.75 米。原因conv(r, h)的输出索引跟输入索引不是一个坐标系。回波从r的第d1点开始卷积峰值落在第dN点中间多了N-1个点的“滤波器建立时间”。这个偏移量跟h的长度严格相关h换长度偏移量就变。解决所有测距换算统一写成(idx - numel(s)) / fs。更稳妥的办法是在matched_filter.m里就把输出裁掉前N-1点让y和r严格对齐y conv(r, h); y y(numel(s):end); % 裁掉建立时间索引与 r 对齐裁完之后delay (idx - 1) / fs公式干净得多也不容易在别处再算错一次。我现在默认都裁。5.2 加了匹配滤波输出信噪比反而比输入还低现象eval_snr算出来的增益是负数明明卷积了反而更糊。原因九成是h构造错了。最常见的两种一是忘了flipud直接h conj(s)那做的不是相关而是“同相卷积”峰值位置跑到脉冲末尾幅度也不对二是s是行向量、h是列向量conv自动给你转置结果一样但中间变量容易搞混。还有一种隐蔽情况输入信噪比的定义和噪声功率对不上。本文还有配套的精品资源点击获取