💥💥💞💞欢迎来到本博客❤️❤️💥💥
🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。
⛳️座右铭:行百里者,半于九十。
目录
⛳️赠与读者
👨💻做科研,涉及到一个深在的思想系统,需要科研者逻辑缜密,踏实认真,但是不能只是努力,很多时候借力比努力更重要,然后还要有仰望星空的创新点和启发点。当哲学课上老师问你什么是科学,什么是电的时候,不要觉得这些问题搞笑。哲学是科学之母,哲学就是追究终极问题,寻找那些不言自明只有小孩子会问的但是你却回答不出来的问题。建议读者按目录次序逐一浏览,免得骤然跌入幽暗的迷宫找不到来时的路,它不足为你揭示全部问题的答案,但若能让人胸中升起一朵朵疑云,也未尝不会酿成晚霞斑斓的别一番景致,万一它居然给你带来了一场精神世界的苦雨,那就借机洗刷一下原来存放在那儿的“躺平”上的尘埃吧。
或许,雨过云收,神驰的天地更清朗.......🔎🔎🔎
💥1 概述
基于LMS与FxLMS算法的主动降噪研究
LMS算法
代码LMS.m使用最小均方差(LMS)算法实现自适应滤波器用于估计滤波器系数的算法。这是一个逐步解释代码的作用:
1.该代码定义了采样频率“Fs”、采样间隔“ts”,并创建了一个时间向量‘t’从0到1,步长为‘ts’。
2.它定义了频率为8*pi Hz的正弦输入信号‘x’。
3.它向输入信号‘x’添加白高斯噪声,以创建有噪声的输入信号‘xn’。
4.代码在单独的图中绘制原始信号“x”和噪声信号“xn”。
5.它把滤波器系数‘wn’初始化为零数组,并定义了脉冲
响应 hn 是一个由 x 的长度除的 1 的数组。
6.它产生一个与‘xn’长度相同的随机参考信号‘dn’。
7.它初始化滤波输出yn和误差信号en的数组。
8.代码进入循环,基于LMS迭代地更新滤波器系数算法。
9. 在 在循环中,它调整“xn”和“wn”的长度以匹配当前的迭代。
10.通过将‘xn’与‘wn’进行卷积来计算滤波输出‘yn’。
11.它计算误差信号‘en’作为参考信号‘dn’和实际信号‘dn’之间的差值以及滤波后的输出‘yn’。
12.它使用LMS更新规则来更新滤波器系数‘wn’。
13.循环针对输入信号‘x’的每个样本继续进行。
最后,代码在以下公式中绘制了估计的滤波器系数‘wn’和误差信号‘en’:单独的数字。
总之,这段代码展示了LMS算法在估计通过基于自适应滤波器中的系数进行迭代调整来获得自适应滤波器中的滤波系数输入信号和期望响应。
FxLMS
代码FxLMS.m使用最小均方差实现了自适应控制系统用于系统识别的最小均方误差(LMS)算法和滤波最小均方误差(FxLMS)主动控制算法。以下是代码的简要说明:
初始化:代码初始化参数,如系统脉冲响应系数(Pw和Sw)、数据长度(T)和学习率(mu)。
2. 系统 系统识别:生成白噪声信号(x_iden),并通过具有脉冲响应系数Sw的模拟系统。系统的输出(y_iden)被测量,并且识别过程开始。应用LMS算法更新自适应滤波器Sh(z)的权重(Shw),以最小化识别误差(e_iden)。
3.主动控制:产生另一个白噪声信号(X)作为控制输入。这个通过将X穿过模拟的传感器位置(Yd)来测量到达该位置的噪声系统具有脉冲响应系数Pw。控制过程从初始化开始控制器状态(Cx)、权重(Cw)和其他变量。FxLMS算法是应用,包括控制器权重(Cw)和基于控制误差(e_cont)和滤波后的控制误差(e_cont_f)的自适应滤波器(Shw)的权重输入信号(Xhx)。
4. 结果 结果可视化:代码绘制识别误差(e_iden)和系数
在第一幅子图中,显示了真实系统(Sw)和适应系统(Shw)的对比。在第二subplot,它显示控制误差(e_cont)并将噪声信号(Yd)与控制信号(Yd - e_cont)。该代码演示了LMS和FxLMS算法如何用于系统识别和主动噪声控制。通过调整滤波器权重在误差信号上,算法旨在最小化期望值与实际值之间的差异以及实际系统响应。
一、LMS算法基本原理与数学模型
LMS(Least Mean Square)算法是一种经典的自适应滤波算法,由Widrow和Hoff于1960年提出,其核心是通过迭代调整滤波器权值,以最小化误差信号的均方误差(MSE)。其数学表达如下:
-
输出信号:

-
误差信号:

-
权值更新:


改进方向:
- 分段迭代:将迭代周期分为初始阶段和收敛阶段,采用不同的步长策略以平衡收敛速度与稳态误差。
- 变步长LMS:通过动态调整步长(如使用双曲余弦函数),在初期加速收敛,后期降低稳态误差。
二、FxLMS算法基本原理与数学模型
FxLMS(Filtered-x LMS)算法是LMS的扩展,专门用于处理存在次级路径(如声学延迟、电声器件响应)的主动噪声控制(ANC)系统。其核心改进在于引入次级路径模型S^(z)S^(z),对参考信号进行预滤波:
-
滤波参考信号:

-
权值更新:

次级路径的引入使得FxLMS能够更精确地补偿实际系统中的传输延迟和频率响应特性,显著提升复杂环境下的降噪性能。
关键优势:
- 适应多通道噪声控制(如汽车舱内多扬声器系统)。
- 鲁棒性强,可应对环境动态变化(如温度、噪声频率波动)。
三、主动降噪系统工作流程
主动降噪系统的实现包含以下核心步骤:
- 噪声采集:通过麦克风获取环境噪声信号。
- 信号处理:生成与噪声相位相反、幅值相同的反相声波。
- 声波干涉:通过扬声器发射反相声波,实现噪声抵消。
- 反馈调整:误差麦克风实时检测残余噪声,动态优化算法参数。
硬件架构:
- LMS系统:通常采用FIR滤波器结构,适用于单通道场景(如耳机降噪)。
- FxLMS系统:需增加次级路径估计模块(如离线建模或在线辨识),适合多通道复杂系统(如汽车发动机舱降噪)。
四、应用场景对比
| 算法 | 典型场景 | 性能特点 | 文献支持 |
|---|---|---|---|
| LMS | 单通道窄带噪声控制(如耳机、电梯噪声) | 结构简单,实时性高,但稳态误差较大 | |
| FxLMS | 多通道/宽带噪声控制(如汽车舱内、船舶、工业设备) | 适应复杂路径,降噪深度更高(可达10 dB以上) |
五、收敛速度与稳态误差分析
- 收敛速度:
- LMS的收敛速度由步长μμ直接决定,但过大的步长会导致发散。
- FxLMS因次级路径滤波的引入,收敛速度通常较慢,但通过变步长策略(如基于误差信号的相关函数调整)可显著优化。
- 稳态误差:
- LMS的稳态误差与输入信号功率正相关,在低信噪比(SNR)下性能下降明显。
- FxLMS通过次级路径补偿,在相同步长下稳态误差更低(如某实验中FxLMS的稳态误差比LMS减少约30%)。
六、硬件实现挑战
- LMS系统:
- 适合FPGA或低功耗DSP实现,计算量小(如32阶滤波器仅需约100 MIPS)。
- FxLMS系统:
- 需额外处理次级路径模型,计算复杂度增加(如多通道系统运算量增长为通道数的平方)。
- 实时性要求高时,需采用并行计算架构(如Speedgoat实时平台)。
七、实验数据与文献总结
- LMS性能:
- 在汽车发动机舱降噪实验中,单通道降噪量达4.6 dB。
- 结合听觉掩蔽效应(Post-masking LMS),车内噪声响度进一步降低约3 dB。
- FxLMS性能:
- 船舶舱室降噪实验中,优化后的变步长FxLMS算法降噪量达5 dB(A)。
- 工业管道ANC系统在200-400 Hz频段降噪量达14 dB。
八、结论与展望
LMS与FxLMS算法在主动降噪领域各有优劣:LMS以其低复杂度适用于简单场景,而FxLMS凭借对次级路径的建模能力,成为复杂环境下的首选。未来研究方向包括:
- 智能步长策略:结合深度学习动态调整参数。
- 分布式架构:通过多节点协作降低大规模ANC系统运算量。
- 硬件加速:利用GPU或专用ASIC提升实时性。
📚2 运行结果
2.1 LMS


2.2 FxLMS


部分代码:
% +-----------+ +
% x(k) ---+--->| P(z) |--yp(k)----------------> sum --+---> e(k)
% | +-----------+ ^- |
% | | |
% | \ ys(k) |
% | +-----------+ +-----------+ | |
% +--->| C(z) |--yw(k)-->| S(z) |---+ |
% | +-----------+ +-----------+ |
% | \ |
% | \----------------\ |
% | \ |
% | +-----------+ +-----------+ |
% +--->| Sh(z) |--xs(k)-->| LMS |<-------+
% +-----------+ +-----------+
%
%--------------------------------------------------------------------------
% Set simulation duration (normalized)
clear
T=1000;
% We do not know P(z) and S(z) in reality. So we have to make dummy paths
Pw=[0.01 0.25 0.5 1 0.5 0.25 0.01];
Sw=Pw*0.25;
% Remember that the first task is to estimate S(z). So, we can generate a
% white noise signal,
x_iden=randn(1,T);
% send it to the actuator, and measure it at the sensor position,
y_iden=filter(Sw, 1, x_iden);
% Then, start the identification process
Shx=zeros(1,16); % the state of Sh(z)
Shw=zeros(1,16); % the weight of Sh(z)
e_iden=zeros(1,T); % data buffer for the identification error
🎉3 参考文献
文章中一些内容引自网络,会注明出处或引用为参考文献,难免有未尽之处,如有不妥,请随时联系删除。
🌈4 Matlab代码实现
资料获取,更多粉丝福利,MATLAB|Simulink|Python资源获取

1860

被折叠的 条评论
为什么被折叠?



