自适应并行多通道Notch滤波器实战:CW单频干扰抑制与MATLAB实现

发布时间:2026/9/24 0:09:08
自适应并行多通道Notch滤波器实战:CW单频干扰抑制与MATLAB实现 简介面向电子信号处理学习者与研究者的陷波滤波器Notch Filter专题资源聚焦连续波CW信号环境下自适应并行多通道Notch滤波器的设计与实现。资源通过实验文档与MATLAB脚本完整呈现了基于IIR结构的自适应陷波滤波原理并针对多中心频率信号环境中噪声与单频干扰并存这一常见问题给出了LMS/RLS自适应算法的具体工程实现思路与参数调节要点。压缩包为rar格式共2个文件包含1份docx实验说明文档和1个m格式MATLAB源码脚本整体仅524KB便于快速下载与本地运行调试。实验文档详细阐述滤波器结构选择、阶数设定、采样率匹配及性能评估方法脚本则提供可直接运行验证的算法实现适合通信、雷达等方向的本科生或研究生对照学习。目前已有608人学习使用。通过学习该资源读者既能掌握Notch滤波器消除单频干扰的核心原理又能获得一套可复用的自适应多通道滤波代码为处理复杂信号环境中的CW信号恢复与干扰抑制提供实用参考。1. 自适应并行多通道 Notch 滤波器一份能直接跑通的 CW 单频干扰实验资源我拆过不少信号处理课程实验资源真正能直接跑出效果、又能把参数关系讲明白的其实不多。Notch.rar 里的 binlian.m 和 Notch 实验二.docx 算一个它演示了如何用自适应并行多通道 Notch 滤波器在存在连续波CW单频干扰的信号里把目标频率干净地捞出来。适合正在做 CW 雷达、声呐、振动监测被工频或某个固定单频耦合干扰折磨的人也适合刚学自适应滤波想看到真实迭代代码而不是教材伪代码的人。这份资源的核心就两件事理解 IIR 陷波器为什么能窄带滤除单频把单个陷波器复制成多个并行通道并让每个通道的频率自适应跟踪干扰。2. 先弄懂三个问题干扰模型、陷波结构、什么叫并行多通道2.1 单频干扰的数学模型为什么普通高通、低通都搞不定工程里说的“单频干扰”在时域上基本可以写成x(t) s(t) A·sin(2π·f_i·t φ)其中 s(t) 是有效信号A 是干扰幅度f_i 是干扰频率φ 是随机相位。这类干扰在频域里只占一根很窄的谱线能量却可能很大。用高通或低通去滤会把有效信号的一大段频谱一起干掉用普通带阻滤波器去滤只要 f_i 偏离滤波器中心几个赫兹残留干扰就会重新露头。这就是课程里强调“陷波”而不是“滤波”的原因陷波器要求在 f_i 这个点上增益做到接近零但 f_i 附近哪怕只隔几赫兹的频谱都要尽量保持原样。自适应并行多通道的场景里问题会更复杂一点。比如 CW 雷达回波里同时存在多个频率分量每一路信号都叠了一个窄带干扰又比如多通道采集系统里所有通道都被同一个电源谐波污染。此时单一陷波器只能处理一个频点或者只能处理一路输入剩下的干扰依然留在数据里。多通道的意思就是一个通道配一个陷波单元各管各的频率互不干扰。binlian.m 这个脚本名其实就是“并联”的拼音对应的就是这种结构。2.2 IIR 陷波器的传递函数为什么用二级直接型就够用自适应 Notch 滤波器的主干是一个定系数的数字陷波器最常用的是二阶 IIR 结构传递函数写成H(z) (1 - 2·cos(ω₀)·z⁻¹ z⁻²) / (1 - 2·ρ·cos(ω₀)·z⁻¹ ρ²·z⁻²)其中 ω₀ 是归一化陷波角频率等于 2π·f₀/fsρ 是极点半径。分子两个零点在单位圆上所以 ω₀ 处增益严格为零分母两个极点在半径 ρ 的圆上用来补偿零点附近的相位和幅频响应让陷波带宽不至于把邻近频谱拖垮。这里有个选型问题FIR 陷波器也能做但同样带宽下阶数高很多实时更新系数时计算量不划算。IIR 结构阶数低、频率选择性好代价是相位非线性但在滤除单频干扰这个场景里相位失真对后续解调影响通常可接受。教材里常提到格型结构稳定性更好但直接从传递函数理解、直接写差分方程反而是最容易跑通的方式。实验文档里给出的实现本质上就是在这个传递函数的基础上加一个自适应更新律。2.3 自适应更新律用输出能量当误差梯度下降调频率自适应要解决的问题是事先不知道 f₀或者 f₀ 会缓慢漂移。我们把 ω₀ 当成一个可变参数让滤波器输出 y(n) 的能量作为代价函数。陷波器对准干扰时干扰被滤掉输出能量最小没对准时输出里残留的干扰能量大。于是频率更新可以写成ω(n1) ω(n) - μ · y(n) · g(n)其中 g(n) 是输出 y(n) 对 ω 的梯度μ 是步长。这里不是简单做一次 LMS因为 IIR 滤波器有递归结构输出不仅依赖当前输入还依赖过去的输出梯度也要通过递归方程算出来。这个梯度通道本质上是另一个 IIR 滤波器输入是 x(n-1) 和 y(n-1) 的组合。直接用数值差分也能逼近梯度但每步要跑两次滤波器速度慢binlian.m 里用的是解析梯度代码里会看到它额外维护了 g1、g2 两个状态变量。2.4 并行多通道的连接方式并联还是级联要分清楚资源名叫“并行多通道”但它不是简单的“多个滤波器并联接在同一个输入上然后把输出相加”。多通道的正确理解是每一路输入信号独立配一个陷波单元每个单元只对自己的输出负责。用矩阵表示就是输入 X 是 N×M输出 Y 也是 N×M第 k 列只和第 k 路的陷波频率相关。如果你的目标是把一路信号里的多个单频干扰全部滤掉那应该做的是级联第一个陷波器滤掉 f₁把输出送给第二个陷波器再滤 f₂。并行多通道的价值在于多路数据可以用同一套参数批量处理还能各自独立跟踪不同频率。实际工程里我经常先并行看每一路残留确认哪一路频率漂移大再决定要不要改成级联或加大跟踪速度。实验二.docx 里的验证图也是按通道分别画频谱的而不是把多通道输出直接相加。3. 把 binlian.m 跑起来单通道实现、并行循环与验证频谱3.1 资源包结构和运行前提Notch.rar 解开后主要看两个文件binlian.m 和 Notch 实验二.docx。.m 文件是主程序docx 是实验说明包含原理推导、参数表和预期的验证图。运行前提是 MATLAB 基础环境加 Signal Processing Toolbox因为后面画频谱要调 pwelch如果不用频谱验证纯 base MATLAB 也能跑通滤波部分。第一次拿到手不要急着全部运行。先打开 binlian.m把前 30 行的路径设置和数据读取部分改成你自己的数据文件路径。这个脚本的设计思路是先构造一个含 CW 信号和单频干扰的测试信号跑多通道自适应陷波最后画频谱对比。把测试信号换成你的真实采集数据只需要改采样率 fs 和信号向量 x。3.2 单通道自适应 Notch 核心函数下面这段是我从资源里抽出来的核心单通道实现去掉了和路径读取相关的内容逻辑保持一致function [y, w_seq] adapt_notch_one(x, fs, f0, rho, mu) % 单通道自适应 IIR Notch 滤波器 % x : 输入信号列向量 % fs : 采样率单位 Hz % f0 : 陷波频率初值单位 Hz % rho : 极点半径0.95 ~ 0.995 % mu : 自适应步长通常 1e-3 ~ 1e-2 % y : 滤除单频干扰后的输出 % w_seq : 每次迭代的归一化角频率记录 N length(x); w 2 * pi * f0 / fs; % 归一化角频率初值 y zeros(N, 1); w_seq zeros(N, 1); % 滤波器历史状态x1x(n-1), x2x(n-2), y1y(n-1), y2y(n-2) x1 0; x2 0; y1 0; y2 0; % 梯度历史状态g1g(n-1), g2g(n-2) g1 0; g2 0; for n 1:N c cos(w); s sin(w); % 二阶 IIR 陷波器的差分方程 yn x(n) - 2*c*x1 x2 2*rho*c*y1 - rho^2*y2; % 输出 y 对 w 的梯度递归计算 g 2*s*x1 - 2*rho*s*y1 2*rho*c*g1 - rho^2*g2; % 归一化 LMS 更新防止信号幅度变化影响步长 w w - mu * yn * g / (g^2 1e-6); % 限制频率范围不要掉到直流或奈奎斯特频率附近 w max(0.05, min(pi - 0.05, w)); y(n) yn; w_seq(n) w; % 状态移位注意顺序 x2 x1; x1 x(n); y2 y1; y1 yn; g2 g1; g1 g; end end这个函数里最关键的是第 19 到 25 行。第 19 行是标准 IIR 陷波滤波它保证当前频率附近被陷掉第 22 行是梯度信号它代表“如果陷波频率稍微动一点输出会怎么变”第 24 行才是真正让滤波器“自适应”的地方它把输出能量沿梯度下降方向修正。梯度更新做了归一化除数是 g² 加上一个很小的 1e-6这样输入信号幅度变大时不会让频率更新一次跳太多。rho 和 mu 都属于要调的核心参数后面第 4 章详细说。3.3 并行多通道的主循环单通道函数有了之后并行多通道就是把同一个输入或者多路输入分别送进各自的陷波单元。下面这段是 binlian.m 里主循环的整理版%% 构造测试信号两路 CW 目标 两路单频干扰 fs 20000; N 20000; t (0:N-1) / fs; fcw [500, 1200]; % 需要保留的 CW 信号频率 fint [850, 2200]; % 需要滤除的单频干扰频率 s zeros(N, 1); for k 1:length(fcw) s s sin(2*pi*fcw(k)*t); % 合成目标信号 end interf zeros(N, 1); for k 1:length(fint) interf interf sin(2*pi*fint(k)*t 0.5*k); % 合成干扰 end x s interf 0.01*randn(N, 1); % 最终输入 %% 并行多通道参数 f_init [840, 2190]; % 陷波频率初值故意偏离真实干扰频率 rho 0.98; % 极点半径 mu 0.008; % 自适应步长 numCh length(f_init); Y zeros(N, numCh); % 每个通道的滤波输出 TH zeros(N, numCh); % 每个通道的频率迭代记录 for k 1:numCh [Y(:,k), TH(:,k)] adapt_notch_one(x, fs, f_init(k), rho, mu); end %% 验证画滤波前后频谱 figure; subplot(2,1,1); pwelch(x, hann(1024), 512, 4096, fs); title(滤波前); subplot(2,1,2); pwelch(Y(:,1), hann(1024), 512, 4096, fs); hold on; pwelch(Y(:,2), hann(1024), 512, 4096, fs); title(两个通道滤波后);这里要注意并行循环里每个通道都从原始 x 开始滤波所以 Y(:,1) 是滤掉 850Hz 干扰但还保留 2200Hz 干扰的信号Y(:,2) 相反。要一路信号同时滤两个干扰需要把 Y(:,1) 再送进第二个陷波器级联一次。并行结构处理的场景是多路输入、各自存在不同干扰比如采集系统的 8 个通道都混入不同频点的串扰这时候每个通道独立跑这个函数互不牵连。运行这段代码正常会在 840Hz 和 2190Hz 附近看到明显凹陷500Hz、1200Hz 两个目标峰保持完好。如果从初值到收敛需要几百到几千个点不等这和 rho、mu 都有关。3.4 实验文档里的验证指标怎么看Notch 实验二.docx 里除了频谱图通常还要求画频率收敛曲线和输出时域波形。收敛曲线是用 w_seq 转成频率后画的能看出陷波频率从初值到真实干扰频率的追踪过程。判断滤波效果不能只看时域有没有“变小”单频干扰幅度大时就算滤掉一半肉眼也不容易分辨。更可靠的指标是两个陷波频点处的频谱幅度降了多少以及目标频率附近的幅度有没有被连带削平。一般降 40dB 以上算合格如果只降 10dB先检查 rho 是不是太小、迭代初值是不是离真实频率太远。4. 参数之间怎么互相拉扯采样率、rho、步长和初值4.1 rho 是“窄”和“稳”之间的天平rho 直接决定陷波带宽。rho 越接近 1极点越靠近单位圆陷波带宽越窄对邻近频谱的损伤越小但收敛速度和稳定性都会变差。工程上有一个粗略的数量级估算3dB 陷波带宽约为 fs·(1-rho)/π。在 fs20000Hz 时rho0.98 对应的陷波带宽大约 127Hzrho0.995 时带宽降到约 32Hz。这不是玄学是极点位置到单位圆距离的几何关系。极点越贴单位圆滤波器 Q 值越高瞬态响应越长。也就是说把 rho 调大之后输出前几毫秒里会有一段明显的“拖尾”那是滤波器自身的暂态不是你信号的问题。我的习惯是先在 rho0.98 附近跑通确认频率能收敛再慢慢往大调每次加 0.005幅频响应不行再退回来。4.2 步长 mu 的上限不是越大越好mu 控制频率更新的速度。mu 太小频率收敛慢干扰频率如果漂移就跟不上mu 太大频率会在真实值附近来回震荡输出会听到类似“咕噜咕噜”的调制噪声。代码里做了梯度归一化所以 mu 的量级不会因为输入幅度变化剧烈变化但这不意味着可以随便取大值。根据我在多组数据上的经验归一化后 mu 在 0.001 到 0.01 之间最常用。判断 mu 是否过头有个简单办法看输出的高频段有没有出现额外能量。迭代稳定后如果 w_seq 曲线是一条平滑往真实频率收敛的曲线说明 mu 合适如果曲线像锯齿一样抖动把 mu 除以 3 再试。逼近真实频率时自适应过程本质上是一个一阶环路太高的增益必然带来过冲这是控制论里的基本结论别指望靠滤波算法本身把过冲吃掉。4.3 初值不要瞎猜先用频谱找峰值自适应陷波器虽然能收敛但初值离真实频率太远时有两个风险。一是收敛时间长对短数据就是灾难二是如果信号里有两个接近的干扰峰初值给错可能两个通道抢同一个峰。比较稳的做法是先对输入做一次 pwelch用 findpeaks 把前几个峰的位置找出来作为每个通道的 f_init[pxx, f] pwelch(x, hann(1024), 512, 4096, fs); [~, idx] findpeaks(pow2db(pxx), MinPeakHeight, -20, MinPeakDistance, 20); f_peak f(idx); f_init f_peak(1:numCh); % 取前 numCh 个谱峰作为初值这里有一个容易被忽略的细节如果干扰幅度远大于目标信号FFT 谱峰里排前面的全是干扰直接把峰位置当 f_init 没问题如果目标信号幅度也不小想把目标信号保留就不要拿谱峰当“待滤除频率”要结合时频分析或先验信息区分目标和干扰。实验文档里的信号是构造的目标峰和干扰峰在频谱上分得很开按谱峰初值跑不会翻车但换到真实数据时一定要把背景噪声先看一遍。4.4 采样率、并行通道数和频率分辨率之间的约束采样率首先满足奈奎斯特条件这个不用多说。容易被忽略的是并行多通道之间的频率间隔约束两个陷波频率靠太近各自的陷波带宽重叠收敛时会发生“抢频”现象。经验值是频率间隔至少大于 3 倍陷波带宽按 fs20000、rho0.98 算两个干扰频率至少要隔 300Hz 以上。如果实际信号里两个干扰只差 50Hz就不要硬用两个独立通道应该先用一个窄带滤波器把信号分段或者把 rho 调大到接近 0.999但要想清楚稳定性和瞬态成本。频率分辨率方面pwelch 画频谱时窗长选 1024频率分辨率大约是 fs/1024约 19.5Hz。这个分辨率足够看到 50Hz 以上的单频干扰但如果干扰频差小于 20Hz频谱图上是两个峰叠在一起肉眼判断会出错。此时把窗长加到 4096频率分辨率降到约 5Hz再重新做初值估计。5. 避坑调这个实验时我踩过的几个实际问题5.1 输出前端有一段明显的瞬态脉冲现象滤波结果的时域波形前几百个采样点幅度异常大后面才恢复正常。原因陷波器有两个零点在单位圆上初始状态 x1、x2、y1、y2 都是 0输入信号一进来滤波器要从零状态建立稳态响应同时频率参数也在从初值往真实值爬这双重暂态叠加在一起输出开头必然有一段非平稳过程。解决把前 10% 的样本丢掉或者给数据加一段“预热序列”。常见做法是先独立跑 1000 个点的零均值白噪声让滤波器状态充满再用正式数据去接续。我一般直接把输出序列前 N/10 个点从后续统计里排除简单有效。如果担心数据短就先用固定频率跑一遍获得稳态初值再开启自适应更新。5.2 干扰频率随时间缓慢漂移固定 Notch 滤不干净现象频谱图上看干扰峰旁边还有一个残余小峰陷波深度随时间变化。原因电路发热会让振荡器频率漂移或者电机转速波动导致干扰频率不是绝对恒定的 CW而是有慢变调制的窄带信号。固定陷波器零点不动干扰一旦离开零点位置就恢复原状。解决把 mu 适当调大让频率跟踪速度跟上漂移率。判断依据是看 w_seq 曲线如果它一直在缓变跟随说明频率在动这是正常行为如果 w_seq 来回震荡但频谱里干扰还在说明 mu 不够大或信噪比太低导致梯度估计被噪声淹没。后一种情况可以把梯度更新改成块处理每 16 个点算一次平均梯度再更新。5.3 两个并行通道收敛到同一个频点现象两个通道的输出频谱都陷在同一频率另一个真实干扰峰还原封不动。原因两个通道的初始频率太接近或者两个干扰频点本来就相邻自适应更新时两个梯度信号相互耦合。因为每个通道的滤波输出都包含另一个干扰通道 1 可能检测到通道 2 没滤掉的能量误以为自己的目标还没收敛继续偏移。解决先用频谱峰做初值分配保证每个通道初值离最近干扰峰不超过半个峰距其次对每个通道加频率牵引约束每次更新后把频率限制在初值附近一个区间内比如 ±100Hz。如果是慢漂移场景可以每帧重新做一次峰值检测再按频率最近原则把通道和干扰重新匹配。5.4 把 rho 调到 0.999 之后滤波器直接发散现象输出变成巨大噪声w_seq 快速跳到边界后续所有数值都异常。原因rho 接近 1 时极点极度靠近单位圆定点或有限长浮点计算下极点轻微扰动就可能越过单位圆滤波器从稳定变成不稳定。另外梯度递归通道也是 IIR 结构它的极点半径是 rho²比 rho 更接近单位圆所以梯度通道会比主滤波器更早发散。解决先检查是不是上了 rho0.999。如果是降到 0.995 以下如果必须要极窄陷波不要用单级二阶 IIR改用两级级联或格型结构稳定性会好很多。另外把误差保护加上每次迭代后检查 y(n) 的绝对值是否超过输入最大值的 100 倍一旦超过把滤波状态全部清零重新初始化。5.5 频谱图里陷波点凹下去但时域干扰还在现象pwelch 画出来 850Hz 处有一个深坑但是监听或者时域波形里仍然听得到干扰。原因pwelch 显示的是功率谱平均如果自适应频率在 850Hz 附近来回摆动平均下来会把凹陷展宽看起来像陷得很深实际每一帧的瞬时陷波点并没有完全对准干扰。这是自适应滤波时频率抖动和频谱平均共同造成的假象。解决验证时不要只看平均频谱要看 w_seq 曲线的波动范围和瞬时谱。把 w_seq 转成频率后统计标准差如果标准差超过陷波带宽的一半就说明频率没锁住需要减小 mu 或者增加 rho。从那以后我每次验证都会把频率收敛曲线和频谱图放在同一张图里看两个都对上才敢说滤干净了。6. 收尾的调试习惯把收敛曲线和频谱放在同一张图里前面踩了这么多坑最后沉淀成一个习惯。每次跑完 binlian.m除了看滤波前后的频谱我强制自己加一张“频率收敛 瞬时输出”的图figure; subplot(2,1,1); plot((1:N)/fs, TH(:,1)*fs/(2*pi), LineWidth, 1); hold on; plot((1:N)/fs, TH(:,2)*fs/(2*pi), LineWidth, 1); yline(850, k--); yline(2200, k--); xlabel(时间/s); ylabel(估计频率/Hz); legend(通道1, 通道2, 真实干扰1, 真实干扰2); subplot(2,1,2); plot((1:N)/fs, Y(:,1)); xlabel(时间/s); ylabel(通道1输出);这张图能一次性回答四个问题频率是否收敛到真实值、收敛用了多长时间、频率是否稳定、滤波输出是否还有异常瞬态。配合频谱图基本就能确定参数组合能不能用于真实数据。关于参数调优的顺序我一般固定采样率和初值先扫 rho再扫 mu。rho 从 0.98 起步每次加 0.005看着频谱里的陷波带宽变窄直到目标信号附近的谱线开始被影响就退回去mu 从 0.002 起步每次加倍观察频率收敛曲线从平滑变锯齿的位置再除以 2 留一点余量。整个过程跑一遍不到十分钟但能避免“参数乱调、结果看起来都对、换了数据就翻车”的情况。这份资源最大的价值不是给你一个现成滤波器而是让你能在一段可以完全控制的信号上把自适应 Notch 的每个参数变化都可视化出来。希望这些从实验里滚出来的经验能帮你少走一圈弯路。本文还有配套的精品资源点击获取

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询