首页 > 编程语言 >(60)使用LMS算法和NLMS(归一化LMS)算法进行降噪

(60)使用LMS算法和NLMS(归一化LMS)算法进行降噪

时间:2024-11-09 10:16:57浏览次数:3  
标签:滤波器 NLMS LMS 步长 适应 算法 信号 归一化

文章目录


前言

本文介绍了LMS自适应滤波器和NLMS自适应滤波器在降噪方面的应用,阐明期望信号、参考信号和噪声信号的差别,以及它们在LMS自适应滤波和NLMS自适应滤波过程中的应用,还说明了类LMS自适应算法步长的选择。给出了完整的MATLAB仿真代码与降噪结果,另外,还将LMS自适应滤波器、NLMS自适应滤波器与最优的FIR维纳滤波器进行了对比,可以看到在LMS与NLMS的自适应过程中,自适应滤波器系数收敛于维纳滤波器系数。


一、关于自适应降噪仿真的几点说明

1.降噪

降噪也称信号增强,是指使用自适应滤波器进行噪声滤除,从噪声干扰的信号中提取期望的信号。

2. 参考信号与噪声信号

为了进行自适应滤波,一般需要两个信号:一个参考信号,一个包含期望信号和附加噪声成分的噪声信号。

3. LMS算法的步长

类LMS算法有一个步长参数,它决定了滤波器从一个迭代到下一个迭代所应用的校正量。选择合适的步长并不总是容易的,通常需要自适应滤波器设计的经验。步长太小会增加滤波器收敛到一组系数的时间,这是一个收敛速度和准确性的问题。步长太大可能会导致自适应滤波器发散,永远无法达到收敛。在这种情况下,关注的问题是稳定性,要避免设计的滤波器不稳定。 就设计校验而言,较小的步长可以提高滤波器收敛的准确性,但这是以适应所需时间为代价的。

MATLAB中,dsp.LMSFilter对象的maxstep函数可以用来计算滤波器收敛的条件下,适合每个LMS自适应滤波器算法的最大步长通常,步长的符号是mu。maxstep有两个返回值,第一个是系数均值收敛所需的值,第二个是系数均方收敛所需的值。选择较大的步长通常会导致从收敛值产生较大的波动,因此通常选择较小的步长。

4.自适应降噪原理

在设置了自适应滤波器的参数,并准备好所需的参考信号与噪声信号后,将进行自适应滤波过程,滤波器的输出y尽可能接近期望信号x。 由于参考v2只与x的噪声成分v1相关,它实际上只能模拟v1。误差信号(期望的x)减去实际输出y,构成了与v2不相关的x部分的估计s,即要从x中提取的信号。

5.维纳滤波器系数

最后,为了进行比较,代码中还计算了最优的FIR维纳滤波器。

二、LMS与NLMS自适应降噪的仿真

以下是LMS与NLMS自适应降噪的仿真代码:

clc
close all
clear all
%% 创建自适应信号
% 期望的信号(处理过程的输出)是一个包含1000个样本的正弦波。
f = 1;                               % 频率,单位Hz
fs = 30;                             % 采样率,单位Hz
Ts = 1/fs;                           % 采样间隔,单位秒
t = (1:1000) * Ts;                   % 采样时刻
s = sin(2*pi*f*t');                  % 期望信号

% 生成包含期望信号和噪声的噪声信号
v = 0.8*randn(1000,1);               % 随机噪声
ar = [1,1/2];                        % 自回归系数
v1 = filter(1,ar,v);                 % 噪声
x = s + v1;                          % 噪声信号

% 创建参考信号 
ma = [1, -0.8, 0.4 , -0.2];
v2 = filter(ma,1,v);                 % 参考信号 
%% 构建LMS自适应滤波器和NLMS自适应滤波器
L = 7;                               % LMS和NLMS,都是6阶的
lms = dsp.LMSFilter(L,'Method','LMS');
nlms = dsp.LMSFilter(L,'Method','Normalized LMS');
%% 选择步长
[mumaxlms,mumaxmselms]   = maxstep(lms,x);
% mumaxlms = 0.2134
% mumaxmselms = 0.1264
[mumaxnlms,mumaxmsenlms] = maxstep(nlms,x);
% mumaxnlms = 2
% mumaxmsenlms = 2
%% 设置自适应滤波器步长
% 选择较小的步长
lms.StepSize  = mumaxmselms/30;
nlms.StepSize = mumaxmsenlms/20;
%% 使用自适应滤波器进行滤波
[ylms,elms,wlms] = lms(v2,x);
[ynlms,enlms,wnlms] = nlms(v2,x);
%% 计算维纳最优解
bw = firwiener(L-1,v2,x);            % 最优FIR维纳滤波器
yw = filter(bw,1,v2);                % 使用维纳滤波器估计x
ew = x - yw;                         % 实际正弦信号的估计
%% 绘制结果
% 绘制每个滤波器处理后的去噪正弦波结果
figure();
plot(t(900:end),ew(900:end),'LineWidth',1.5);
hold on;
plot(t(900:end),elms(900:end),'LineWidth',1.5);
plot(t(900:end),enlms(900:end),'LineWidth',1.5);
plot(t(900:end),x(900:end),'k:');                      % 用虚线画出噪声信号,作为参考
grid on;
legend('Wiener filter denoised sinusoid',...
       'LMS denoised sinusoid',...
       'NLMS denoised sinusoid',...
       'Noisy Signal');
title('滤波处理后的去噪正弦波');
xlabel('Time index (n)'); ylabel('Amplitude');
hold off;
%% 画图比较最终系数
figure()
subplot(311)
plot(bw,'ro-','LineWidth',1.5);                  % 维纳滤波器的系数
grid on; title('Wiener filter coefficients');
xlabel('coefficients index'); ylabel('coefficients');
subplot(312)
plot(wlms,'bo-','LineWidth',1.5);                % LMS自适应滤波器系数
grid on; title('LMS adaptive filters coefficients');
xlabel('coefficients index'); ylabel('coefficients');
subplot(313);
plot(wnlms,'go-','LineWidth',1.5);               % NLMS自适应滤波器系数
grid on; title('NLMS adaptive filters coefficients');
xlabel('coefficients index'); ylabel('coefficients');

三、仿真结果

(1)带噪信号与自适应降噪处理后的信号对比:

在这里插入图片描述

(2)LMS与NLMS自适应滤波器系数与FIR维纳滤波器系数:

在这里插入图片描述

通过比较最终系数可以发现:在自适应过程中,自适应滤波器收敛于维纳系数。



标签:滤波器,NLMS,LMS,步长,适应,算法,信号,归一化
From: https://blog.csdn.net/weixin_45333185/article/details/143533453

相关文章

  • JavaCV 图像边缘检测 之 Canny 算法
    ......
  • 算法专题:字符串
    目录1.最长公共前缀1.1算法原理1.2算法代码2.最长回文子串2.1算法原理2.2算法代码3.二进制求和3.1算法原理 3.2算法代码4.字符串相乘4.1算法原理 4.2算法代码1.最长公共前缀.-力扣(LeetCode)1.1算法原理有以下两种策略:两两进行比较统一......
  • 深入解析 Transformers 框架(四):Qwen2.5/GPT 分词流程与 BPE 分词算法技术细节详解
    前面我们已经通过三篇文章,详细介绍了Qwen2.5大语言模型在Transformers框架中的技术细节,包括包和对象加载、模型初始化和分词器技术细节:深入解析Transformers框架(一):包和对象加载中的设计巧思与实用技巧深入解析Transformers框架(二):AutoModel初始化及Qwen2.5模型加载全......
  • 代码随想录算法训练营第十六天| 找树左下角的值
    513.找树左下角的值文章链接:https://programmercarl.com/0513.找树左下角的值.html题目链接:https://leetcode.cn/problems/find-bottom-left-tree-value/description/要点:不管是前中后序遍历,左节点总是先比右节点先遍历,所以只要找到深度最大的叶子节点,即找到最左下角的值cla......
  • 自动泊车端到端算法 ParkingE2E 介绍
    01算法介绍自主泊车是智能驾驶领域中的一项关键任务。传统的泊车算法通常使用基于规则的方案来实现。因为算法设计复杂,这些方法在复杂泊车场景中的有效性较低。相比之下,基于神经网络的方法往往比基于规则的方法更加直观和多功能。通过收集大量专家泊车轨迹数据,基于学习的仿人策......
  • 代码随想录算法训练营day39 day40| 198.打家劫舍 213.打家劫舍II 337.打家劫舍III
    学习资料:https://programmercarl.com/0198.打家劫舍.html#算法公开课动态规划的打家劫舍系列和股票买卖系列(股票还有贪心算法可解)学习记录:198.打家劫舍(一维dp数组,前n间房子都可偷的情况下的最高金额,每间房子偷数都是由前一间和前两间决定)点击查看代码classSolution(object)......
  • 【多微电网】基于粒子群优化算法的面向配电网的多微电网协调运行与优化(Matlab代码实现
     ......
  • 反欺诈算法 - 知识图谱最短路径算法-初识
    1.引言反欺诈技术在金融、电商、社交等行业中扮演着至关重要的角色。随着网络欺诈手段的日益复杂,传统的基于规则的反欺诈检测方法难以应对多变的欺诈模式。为此,知识图谱作为一种强大的数据结构,通过节点(实体)和边(关系)来表达和存储数据,成为了反欺诈检测的一个重要工具。结合......
  • 代码随想录算法训练营第十五天| 110.平衡二叉树,257. 二叉树的所有路径, 404.左叶子之
    110.平衡二叉树文章链接:https://programmercarl.com/0110.平衡二叉树.html#题外话题目链接:https://leetcode.cn/problems/balanced-binary-tree/description/classSolution{public://每次都要比较左右子树的高度差是否在1以内,所以递归是要统计子树的高度的intg......
  • 基础数论算法汇总
    乘法逆元给定\(n\)个正整数\(a_i\),求它们在模\(p\)意义下的乘法逆元。逆元是模意义下的倒数,能够将模意义下无法直接计算的除法转化为乘法。先来总结一下常用的求单个逆元的方法:扩展欧几里得\(O(\logn)\)地求一个数的逆元,要求\(a,p\)互质即可(\(p\)为模数),原理为解线性......