尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

自适应滤波器设计实战:从LMS/NLMS/RLS到LCL谐振抑制

自适应滤波器设计实战:从LMS/NLMS/RLS到LCL谐振抑制 搞信号处理仿真的人迟早会碰到滤波器设计这道坎。我在做并网逆变器控制的时候被LCL滤波器参数设计折腾得不轻后来把自适应滤波器设计这块啃下来才发现很多“难调”的问题其实是算法选型和仿真方法没对上。这篇是滤波器设计与仿真系列里的第十二篇专门聊聊自适应滤波器设计从LMS、NLMS、RLS几个经典算法的取舍到MATLAB/Python里的仿真搭建最后落到LCL滤波器谐振抑制这个真实场景上。无论你是刚接触信号处理的学生还是被项目里的噪声和谐波逼疯的工程师这篇文章都值得静下心读完。1. 自适应滤波器它到底解决什么问题1.1 固定滤波器vs自适应滤波器先聊一个最基础的问题既然已经有FIR、IIR这类设计成熟的固定滤波器为什么还要折腾自适应滤波器固定滤波器的系数在出厂那一刻就定死了它假设信号的统计特性是平稳的。但工程实际里噪声频率会漂、电网阻抗会变、元器件会老化、温度会影响参数固定不变的系数只能在一个窄小的“舒适区”里表现良好。一旦环境偏离设计点性能就开始下滑严重时甚至发散。自适应滤波器最核心的区别就一条它的系数会跟着输入信号和误差信号自动调整。你可以把它理解成一个“有手”的滤波器一边看结果、一边改自己目标是把某个代价函数压到最小。它不关心你预先知道多少信号特性只需要一个参考信号和一条误差反馈路径就能自己收敛到最优解。我常用一个类比固定滤波器像定焦镜头光圈、焦距出厂就锁死自适应滤波器像自动对焦镜头每次拍照前它会根据画面反复微调找到最清晰的点。工程项目里场景往往是变化的自动对焦显然更抗造。1.2 自适应滤波器的典型应用池自适应滤波器能做的事情远比“滤波”两个字看起来宽。大致可以归成四类噪声对消把一个含噪信号作为期望信号把与噪声相关的信号作为参考输入自适应滤波器输出对消后的纯净信号。最典型的例子是语音降噪、心电信号里的工频干扰消除。系统辨识给未知系统一个激励让自适应滤波器去逼近它的传递函数。拿LCL滤波器来说电网阻抗变化会导致谐振点偏移用自适应滤波器在线辨识等效电感电容参数就能为后续控制提供实时模型。预测与均衡用过去信号预测未来值或者补偿信道畸变。通信里的自适应均衡器就是这类边收边调把码间干扰一点点压掉。回声与振动抑制扬声器回声抵消、机械结构主动振动控制都依赖自适应滤波器持续估计路径传递函数并反向抵消。这四类应用的数学本质其实是一样的自适应滤波器在误差信号的引导下不断调整权系数使输出与期望信号之间的误差最小化。理解这一点后后面看LMS、RLS就顺了。1.3 为什么做仿真而不是直接上板我见过不少同学一上来就想在DSP里跑自适应滤波被参数调懵后回头翻书。我的建议永远是先在仿真环境里把算法跑明白再考虑上板。原因有三第一仿真环境可以看到所有权系数、误差、中间变量随时间变化的过程这些内部信号在硬件上几乎不可能直接观测第二仿真里可以随意注入不同频率、不同强度的干扰把算法逼到极限提前暴露边界问题第三参数调整的成本几乎为零改一个步长、换一个遗忘因子只是改个数值的事不用焊板子也不用烧程序。而且像LCL滤波器参数设计这种事在仿真里可以快速试错。你可以在Simulink或Python里搭一个完整的并网逆变器模型再叠加自适应谐振抑制模块先把算法逻辑验证通过再花时间做定点化和代码生成。这个顺序能帮你省下至少一个月的调板时间。2. 核心算法选型LMS、NLMS还是RLS2.1 LMS从最速下降说起自适应滤波器的老祖宗是最小均方LMSLeast Mean Squares算法。它的推导思路很直观设期望信号为d(n)滤波器输出为y(n)w^T x(n)误差为e(n)d(n)-y(n)目标是把均方误差E[e^2(n)]最小化。LMS用瞬时梯度代替统计梯度权系数迭代公式写出来就是w(n1) w(n) 2 * mu * e(n) * x(n)其中mu是步长因子x(n)是参考输入向量。这个公式简洁到我第一次看的时候愣了一下就这么简单是的就这么简单。它做的事情就是沿着误差平方下降最快的方向把权值往前推一点。步长mu的选择是全部参数设计中最关键的一环。mu太小收敛慢要跑几千个采样点才稳定mu太大权值会在最优值附近剧烈振荡甚至直接发散。理论上LMS收敛的充分条件是0 mu 2/lambda_max其中lambda_max是输入信号自相关矩阵的最大特征值。但实际仿真时你很难提前算出特征值所以我一般直接用归一化LMS省去这个麻烦。2.2 NLMS解决收敛不稳定的常见手段归一化最小均方NLMSNormalized LMS算法本质是把LMS的步长按照输入信号的瞬时能量做了一次归一化。迭代公式变成w(n1) w(n) mu * e(n) * x(n) / ( ||x(n)||^2 delta )分母里加了一个delta目的是防止输入能量为零时除零。这样处理之后mu的取值范围被归一化到0到2之间实际工程里取0.1到0.5通常都能稳定工作。为什么NLMS在工程里比LMS流行因为真实信号的功率是变化的。比如电网电压时高时低如果直接用固定步长LMS信号能量大的时候步长相对太大、容易震荡信号能量小的时候步长相对太小、收敛慢。NLMS相当于给步长装了一个自动挡能量大自动踩刹车能量小自动给油。我做LCL谐振抑制时参考信号来自并网电流或电网电压幅值波动很常见所以基本默认用NLMS。2.3 RLS用算力换收敛速度最小二乘RLSRecursive Least Squares算法走的是另一条路。它不再用梯度下降而是直接最小化从开始到当前时刻的加权误差平方和用一个递推方式更新增益向量和协方差矩阵。RLS的核心是增益向量k(n)和协方差矩阵P(n)的迭代P(n) (1/lambda) * ( P(n-1) - k(n) * x^T(n) * P(n-1) ) w(n) w(n-1) k(n) * e(n)这里的lambda是遗忘因子通常取0.98到1之间。它决定了旧数据被遗忘的速度lambda越接近1算法越稳定但对非平稳信号跟踪能力越差lambda越小跟踪越快但稳态误差越大还容易数值发散。RLS最大的优点是收敛速度比LMS快一个数量级甚至更多。我做在线辨识LCL滤波器谐振频率时输入是几十kHz的开关纹波叠加工频分量信号变化快LMS需要上千个点才能收敛RLS几百个点就能逼近真实值。代价是计算量从O(N)涨到O(N^2)当滤波器阶数N比较大时DSP实时跑会有压力。2.4 不同场景下的算法选型表我给自己列过一个选型表现在分享出来你拿去当参考算法收敛速度稳态误差计算复杂度数值稳定性推荐场景LMS慢中等O(N)一般教学验证、平稳噪声对消NLMS较快较低O(N)较好工程首选语音降噪、振动抑制RLS很快低O(N^2)较差需加正则化系统辨识、快速时变信道均衡坦率说没有“绝对最好”的算法只有“当前场景最合适”的算法。如果只是做仿真演示LMS就够了如果要上板跑实时控制NLMS是性价比之王如果你要在线辨识LCL滤波器参数而且处理器性能宽裕RLS是更值得投入的方案。3. 仿真搭建先做一个自适应陷波器3.1 仿真环境与信号场景设计自适应滤波器的仿真门槛很低MATLAB、Octave、Python都可以。我自己更习惯用Python因为后期做数据分析、画图、对接深度学习的工具链更顺。下面给的示例也是Python但移植到MATLAB只是语法层面的小事。仿真第一步是构造一个能说明问题的信号场景。以LCL滤波器谐振抑制为例并网电流里通常有工频50Hz基波同时叠加一个谐振频率附近的振荡分量比如在5kHz处有一个很强的谐振尖峰。我们的目标是消除这个5kHz分量同时保留50Hz基波。所以构造期望信号d(n)为d(n) sin(2 * pi * 50 * n * Ts) sin(2 * pi * 5000 * n * Ts) 0.05 * randn()其中Ts是采样时间randn表示高斯白噪声。自适应陷波器要用与5kHz同频的正交参考信号把5kHz分量从d(n)中减掉误差输出e(n)就是消除后的基波加噪声。3.2 单频自适应陷波器的核心实现单频自适应陷波器实施起来非常简洁。它需要两个参考信号一个是cos(w0 * n * Ts)一个是sin(w0 * n * Ts)分别对应两个权值w_c和w_s。滤波器输出为y(n)w_ccos w_ssin误差为e(n)d(n)-y(n)。NLMS更新公式如下import numpy as np fs 20000 # 采样率 20kHz Ts 1.0 / fs N 4000 # 仿真点数 t np.arange(N) * Ts # 期望信号50Hz基波 5kHz谐振分量 噪声 d np.sin(2*np.pi*50*t) np.sin(2*np.pi*5000*t) 0.05*np.random.randn(N) # 参考信号与权值 w0 2 * np.pi * 5000 xc np.cos(w0 * t) xs np.sin(w0 * t) wc, ws 0.0, 0.0 mu 0.05 delta 1e-4 e_out np.zeros(N) for n in range(N): y wc * xc[n] ws * xs[n] e d[n] - y wc mu * e * xc[n] / (xc[n]**2 xs[n]**2 delta) ws mu * e * xs[n] / (xc[n]**2 xs[n]**2 delta) e_out[n] e运行之后把e_out做FFT你会发现5kHz处的尖峰被明显压低50Hz基波几乎无损通过。这个过程就是自适应陷波器的工作方式它不硬性设置一个固定陷波频点而是靠参考信号告诉你“我要消哪个频率”。一个小细节权值的初始值必须设成0。如果你把wc和ws先设成1算法开头会有一大段削波现象因为一开始就把参考信号完全叠加到了输出里。0初值可以让算法自己从零开始逼近最优解这是LMS类算法的默认操作。3.3 从陷波器到线谱增强器单频陷波器再往前走一步就是自适应线谱增强器ALEAdaptive Line Enhancer。ALE的结构几乎一样只是参考信号不再是本地生成的cos/sin而是把期望信号做一段延迟后作为参考。因为周期性信号自相关性强延迟后依然与自身相关而宽带噪声延迟后相关性迅速下降所以ALE能自动把周期性分量“挑”出来。在LCL谐振抑制场景里ALE可以作为一个频率检测前端不需要预先知道谐振频率是多少只要把并网电流信号延迟L个采样点作为参考ALE就能自动收敛到当前最强的周期分量上输出就是谐振频率信号的估计。之后再把这个估计信号取反叠加回原信号就能实现自动瞄准的谐振抑制。这段代码和上面的陷波器几乎完全一样唯一的区别是把xc和xs替换成d[n-L]和d[n-L]的90度移相信号。90度移相可以用希尔伯特变换实现也可以用简单的差分近似。我通常先用FFT分析确定频谱尖峰再用固定频率陷波器验证逻辑最后才换成ALE做在线自适应这样排查问题比较清晰。3.4 看图说话仿真结果怎么判读仿真跑完不要只盯着一幅时域图就下结论。我通常至少看三样东西权值曲线wc和ws能不能在一个合理时间内收敛到平稳值反映算法是否稳定。如果权值呈现明显的正弦振荡多半是步长偏大。误差信号的频谱这是检验滤波效果的最直接证据。陷波前后对比应该看到目标频点处谱线显著下降而其他频点基本不受影响。收敛时间统计记录误差降到稳态值正负10%范围内所需要的采样点数乘上Ts就是收敛时间。这个数值要和被控系统的动态响应时间做比较不能比系统本身的控制周期还慢。我第一次调试ALE的时候权值曲线看起来收敛了但误差信号频谱里5kHz尖峰依然在。排查了半天才发现参考信号延迟L太小只有1个采样点导致参考信号与期望信号中5kHz分量相关性没有充分分离。把L改到50个采样点后问题立刻消失。这类细节不跑仿真根本发现不了。4. 结合LCL滤波器参数设计一次自适应谐振抑制实战4.1 LCL滤波器参数设计里的痛点聊LCL滤波器之前先简单说说为什么它会出现在并网逆变器里。传统的单L滤波器在高功率等级下需要很大的电感体积才能满足并网谐波要求LCL滤波器用两个电感加一个电容能够在同样谐波衰减指标下大幅减小磁件体积。但LCL滤波器天生自带一个谐振峰。只要参数设计得不合理或者在运行中电网阻抗发生变化这个谐振峰就可能被开关频率附近的谐波激发造成并网电流振荡甚至系统失稳。常规的LCL参数设计会把谐振频率设定在基波频率的10倍以上、开关频率的0.5倍以下同时限制电容吸收的无功功率不超过系统额定功率的5%。这些只是静态设计。问题是并网逆变器的电网阻抗并不是固定的今天挂在强电网明天可能挂在弱电网LCL的实际谐振频率会随电网电感漂移。固定参数的阻尼方案只能在设计点附近工作良好一旦跑远了阻尼效果就大打折扣。4.2 用自适应滤波器实时跟踪谐振点自适应滤波器在这件事上能扮演的角色之一就是做谐振频率跟踪器。思路不复杂把并网电流或者并网电压作为期望信号用一个自适应陷波器去锁定当前最强的谐振分量频率再把陷波输出反馈给控制环路或作为阻尼注入信号。具体做法可以分三步走第一步采集一段并网电流信号用FFT做一次粗扫找出当前谐振峰的大致位置f0作为自适应陷波器的初始参考频率。第二步启动自适应陷波器以f0为初始值通过调整参考信号的瞬时频率或采用多分支滤波器结构让陷波点自动跟随真实谐振频率的偏移。第三步把陷波器输出的误差信号作为控制修正量叠加到逆变器电流环指令上或者直接生成一个阻尼电压注入PWM。这里有一个关键选择陷波器输出到底取y(n)还是e(n)如果你想做谐振频率估计那就看y(n)它是滤波器对谐振分量的重建如果你想做抑制那就把y(n)取反叠加回去等效成在谐振频点处增加了一个极窄的负反馈。我在仿真里验证过这个流程把电网电感从2mH调到3.5mHLCL谐振频率从2.8kHz漂到2.2kHz左右。固定陷波器还在2.8kHz处谐振会重新冒出来自适应陷波器能在一两百个工频周期内跟随到新的频率点并网电流的5次、7次谐波都维持在标准以下。这一步验证坚定了我在后续项目里用自适应的方向。4.3 自适应有源阻尼的实现思路除了直接做陷波自适应滤波器还可以和有源阻尼结合。传统有源阻尼是在电容电流回路里引入一个虚拟电阻用来抑制谐振峰。但虚拟电阻的取值和效果同样受谐振频率影响电网阻抗一变等效阻尼比就跟着变。自适应有源阻尼的做法是用RLS算法在线辨识LCL滤波器在某个特征频率点附近的传递函数实时估计谐振频率和峰值增益然后动态调整有源阻尼系数和陷波器深度。RLS在这种场景的优势体现得很明显它能利用较短的观测数据快速收敛而且不需要像LMS那样反复调步长。具体的控制框图就不画了文字描述一下。你把调制电压和并网电流分别作为RLS的输入和期望输出用一个二阶或三阶的传递函数模型去拟合模型参数递推更新。每拍更新一次谐振频率估计值再根据估计值计算阻尼系数。这个方案的缺点是RLS的O(N^2)复杂度在30kHz以上的控制频率下会比较吃紧所以我一般先用NLMS跑通功能再评估是否升级到RLS。4.4 参数选定时的工程避坑搞LCL自适应谐振抑制以下几条坑我几乎都踩过自适应陷波器带宽不能太窄否则电网频率发生小幅度偏移时陷波点跟不上谐振又会冒出来。我一般把等效品质因数Q控制在10到20之间既保证选择性又不会对频率漂移太敏感。参考频率不要直接用FFT峰值要加一个中值滤波或一阶低通防止开关噪声偶尔把频谱峰值带偏。步长或遗忘因子的初值要偏保守。量纲不同信号幅值不同最适合的mu差几个数量级。我的习惯是先做一次峰值归一化把信号幅值压到0.1到1之间再选mu0.05起步。保护电路的限幅必须放在自适应滤波器之后不能让滤波器输出无限增大导致调制器过调。这些坑在理论推导里完全看不出来只有亲手仿真再对比成品波形才能理解。这也是我坚持先仿真、后上板的原因。5. 常见问题与排查技巧实录5.1 权系数长期不收敛表现跑了上万个采样点权值还在明显振荡误差完全没有减小的趋势。排查思路先看步长。如果是LMS检查是否满足0 mu 2/lambda_max如果不方便算特征值直接切换到NLMS。再看参考信号与期望信号是否有相关性。自适应滤波的核心假设是参考信号和期望信号中的干扰分量相关、而和有用信号不相关。如果参考信号里混进了大量有用信号成分算法会一边对消干扰一边破坏有用信号表现出来就是权值漂来漂去找不到平衡点。还有一个隐蔽原因信号里有两个频率极其接近的窄带分量自适应滤波器在两者之间反复横跳。这种时候需要提高滤波器阶数或者增加参考信号通道数让滤波器有能力同时跟踪多个频率。5.2 收敛但稳态误差偏大收敛是收敛了可误差信号里依然残留明显的目标频率分量。最常见的两个原因是步长太小和参考信号幅度不足。NLMS的步长mu取得过小会让权值在到达最优解附近后停不下来缓慢蠕动的过程看起来像已经收敛实际误差却比理论最小值高不少。这时把mu从0.05提高到0.1附近往往立竿见影。参考信号幅度不足则更隐蔽。比如你用的是cos/sin正交信号但信号幅值是0.01量级分母归一化后步长的实际效果会变差。解决方式是把参考信号也做一次幅度归一化让它的RMS稳定在1左右。5.3 RLS数值发散RLS看起来很美但工程实现时经常出现数值爆炸。现象是前几百个点都很正常某一拍之后权值突然变成10的30次方输出直接打满。根因通常是协方差矩阵P(n)在迭代过程中失去正定性。遗忘因子lambda越接近1P(n)越接近奇异矩阵一旦输入信号在某些方向持续很小P(n)就会被拉崩。我推荐的缓解手段有三个一是在P(0)初始化时加一个小的对角矩阵比如P(0)delta*Idelta取0.01左右二是在每次更新后对P(n)做一次对称化P(PP^T)/2三是限制遗忘因子不低于0.98。如果这些还不够就换成QR分解形式的RLS数值稳定性会好很多代价是代码量翻倍。5.4 实时系统资源不够用仿真跑得欢上板就卡死这是常态。自适应滤波器最耗资源的不是乘法本身而是每一步都要更新权值和内部变量。NLMS的复杂度O(N)N是滤波器阶数RLS的复杂度O(N^2)阶数稍微上去一点计算量就爆炸。我一般按照这个套路来降资源先把滤波器阶数压到性能合格的最低值比如陷波器只需要2阶就绝不加长到64阶其次能换NLMS就换NLMS只有系统辨识这种非NLMS不可的场景才用RLS最后如果DSP还是吃紧把参考信号和期望信号做下采样在较低的速率下更新权值控制周期仍保持高速运行。6. 关于自适应滤波器设计我最后想说的6.1 从仿真到上板的几点个人体会做了这么多年信号处理仿真我越来越觉得自适应滤波器设计这件事功夫一半在数学一半在调试心态。第一次上手时不要贪多先实现一个最最简单的NLMS单频陷波器把权值曲线、误差曲线、频谱图都打印出来盯着看半小时。你会发现权值从初始值慢慢爬向最优值的过程其实是理解梯度下降最直观的教材。之后再上ALE、RLS、多通道底子已经打牢了。参数调整上我的习惯是“先大后小”先用一个相对偏大的步长跑一遍观察发散的边界在哪然后把步长缩小一个数量级找一个明显收敛、又有一定跟踪速度的折衷点。这个做法比查公式、算特征值快得多也更贴合工程现场的实际情况。6.2 后续还能往哪些方向扩展自适应滤波器本身是一个足够深的工具箱我手头还在尝试的几个方向把自适应陷波器扩展到多频点同时抑制LCL谐振、电网背景谐波等多个目标把RLS和卡尔曼滤波对比研究看看在时变电网阻抗下哪个的跟踪延迟更小还有就是把自适应滤波器输出接到神经网络前做一个特征预处理让上游的故障诊断模型不再被噪声带偏。这套方法论不局限于LCL滤波器凡是涉及在线估计、噪声对消、参数漂移的工程问题都能从里面找到借鉴。希望这篇关于信号处理仿真与自适应滤波器设计的分享能给你省下一些查文献和试错的时间。
返回列表