最小均方(LMS)自适应滤波算法

1 LMS函数实现

% ----------------------------LMS(Least Mean Squre)算法------------------------------ %
% parm:
%     xn   输入的信号序列      (列向量)
%     dn   所期望的响应序列    (列向量)
%     M    滤波器的阶数        (标量)
%     mu   收敛因子(步长)      (标量)     要求大于0,小于xn的相关矩阵最大特征值的倒数    
%     itr  迭代次数            (标量)     默认为xn的长度,M<itr<length(xn)
% ---------------------------------------------------------------------------------- %
% retval:
%     W    滤波器的权值矩阵     (矩阵)
%          大小为M x itr,
%     en   误差序列(itr x 1)    (列向量)  
%     yn   实际输出序列         (列向量)
% 参数个数必须为4个或5个
% ---------------------------------------------------------------------------------- %
function [yn,W,en]=LMS(xn,dn,M,mu,itr)
%% 检查输入参数个数 
if nargin == 4                 % itr参数缺省时,将itr设为输入信号的长度
    itr = length(xn);
elseif nargin == 5             % 无参数缺省时
	if itr > length(xn) | itr < M  % 错误判定
        error('迭代次数过大或过小!');
    end
else                           % 错误判定
    error('请检查输入参数的个数!');
end

%% 创建,初始化参数
en = zeros(itr,1);             % 误差序列,en(k)表示第k次迭代时预期输出与实际输入的误差
W  = zeros(M,itr);             % 每一行代表一个加权参量,每一列代表每次迭代,初始为0

%% 迭代计算
for k = M:itr                  % 第k次迭代(从M次迭代到itr次)
    x = xn(k:-1:k-M+1);        % 提取长度为M的输入信号向量(注意MATLAB中索引是从1开始的,所以-1表示倒序),k:-1:k-M+1 表示从当前位置 k 开始向前取M个值
    y = W(:,k-1).' * x;        % 计算出当前迭代滤波器的输出信号,W(:,k-1)表示取前一次迭代的滤波器权值向量,.'表示转置,* 表示矩阵乘法
    en(k) = dn(k) - y ;        % 第k次迭代的误差(期望信号与实际输出信号间的误差)
    % 滤波器权值计算的迭代式
    W(:,k) = W(:,k-1) + 2*mu*en(k)*x; % 使用LMS算法更新滤波器权值
end

%% 求最优时滤波器的输出序列
yn = inf * ones(size(xn));
for k = M:length(xn)
    x = xn(k:-1:k-M+1);
    yn(k) = W(:,end).' * x;
end

整个函数实现主要围绕的就是两个参数,一个就是误差序列 e n en en ,另一个就是滤波器的权值矩阵 M M M,然后做循环获得最好的滤波器权值矩阵,然后就用这个最优解求出最优的输出信号

  • 核心算法就是如何更新滤波器权值
en(k) = dn(k) - y;
W(:,k) = W(:,k-1) + 2*mu*en(k)*x; % 使用LMS算法更新滤波器权值

这个算法感觉很像 P I D 控制算法 PID控制算法 PID控制算法 最短路径的搜索算法 最短路径的搜索算法 最短路径的搜索算法(不停做循环操作,计算 e r r o r error error 参数,将 e r r o r error error 代入算法中进行修正,一步步减小误差,进而不断逼近期望信号 d n dn dn

2 用LMS自适应算法对语语音降噪测试

close all;
clear all; 
clc; 
 
[s, fs] = audioread('C5_1_y.wav');          % 读入数据文件

%% 对上面获取的语言信号,其实就是无噪信号进行预处理
s=s-mean(s);                                % 消除直流分量(原信号-原信号经过均值后的信号)
s=s/max(abs(s));                            % 幅值归一化处理

N=length(s);                                % 语音长度
time=(0:N-1)/fs;                            % 设置时间刻度


%% 对纯净信号添加噪声是之无噪信号变成含噪信号
SNR=5;                                      % 设置信噪比
r1   = awgn(s,SNR,'measured','db');		    % 添加加性白高斯噪声(Additive White Gaussian Noise,AWGN)后得到含噪信号r1
itr  = length(r1);							% 有没有这句不重要,LMS函数实现对缺省情况拟以代码处理这类情况  
snr1 = SNR_Calc(s,r1);                      % 计算初始信噪比

%% 设置降噪过程需要的固定参数
M=64;                                       % 设置M和mu
mu=0.001;

[y,W,e] = LMS(r1,s,M,mu,itr);

output = e/max(abs(e));                 	% LMS滤波输出
snr2=SNR_Calc(s,output);                    % 计算滤波后的信噪比

snr=snr2-snr1;								% 得到滤波前后的信噪比差值

SN1=snr1; SN2=snr2; SN3=snr;

fprintf('snr1=%5.4f   snr2=%5.4f    snr=%5.4f\n',snr1,snr2,snr);

% 作图
subplot 311; plot(time,s,'k'); ylabel('幅值') 
ylim([-1 1]); title('原始语音信号');
subplot 312; plot(time,r1,'k'); ylabel('幅值') 
ylim([-1 1]); title('带噪语音信号');
subplot 313; plot(time,output,'k'); 
ylim([-1 1]); title('LMS滤波输出语音信号');

在这里插入图片描述

下面说的都是各自归一化处理对应的信号:
最上面的小图是无噪信号 s s s,同时它也是这个实验设计的期望信号。
中间的小图是加了白噪声的含噪信号 r 1 r1 r1 ,是这个实验待降噪处理的信号
最下面的小图是最后经过LMS降噪得到的信号
最后感觉LMS方法的得到处理效果比较一般

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/540233.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

统信UOS(Linux)安装nvm node管理工具

整篇看完再操作&#xff0c;有坑&#xff01;&#xff01; 官网 nvm官网 按照官网方式安装&#xff0c;一直报 错 经过不断研究&#xff0c;正确步骤如下 1、下载安装包 可能因为网络安全不能访问github&#xff0c;我是链接热点下载的 wget https://github.com/nvm-sh/…

Java Maven项目推送到 Maven 中央仓库

准备阶段 namespace 域名认证 当需要在 sonatype 认证 com.xxx命名空间时&#xff0c;需要将 .xxx.com 配置域名解析。 记录类型&#xff1a;TXT 文本内容&#xff1a;验证的 key。 GPG 公私钥生成 GPG 下载地址&#xff1a;https://www.gnupg.org/download/index.html M…

RestTemplate—微服务远程调用—案例解析

简介&#xff1a;总结来说&#xff0c;微服务之间的调用方式有多种&#xff0c;选择哪种方式取决于具体的业务需求、技术栈和架构设计。RESTful API和HTTP客户端是常见的选择&#xff0c;而Feign和Ribbon等辅助库可以简化调用过程。RPC和消息队列适用于特定的场景&#xff0c;如…

单片机方案 发声毛绒小黄鸭

随着科技的不断进步&#xff0c;智能早教已经成为了新时代儿童教育的趋势。智能早教玩具&#xff0c;一款集互动陪伴、启蒙教育、情感培养于一身的高科技产品。它不仅能陪伴孩子成长&#xff0c;还能在游戏中启迪智慧&#xff0c;是家长和孩子的理想选择。 酷得电子方案开发特…

OV通配符证书:安全、便捷的网络认证新选择

OV通配符证书&#xff0c;即组织验证型通配符证书&#xff0c;其最大特点在于其通配符功能。这意味着&#xff0c;一个OV通配符证书可以覆盖同一主域名下的多个子域名&#xff0c;大大简化了证书管理和维护的复杂性。无论是大型企业还是个人网站&#xff0c;都可以通过OV通配符…

[面向对象] 单例模式与工厂模式

单例模式 是一种创建模式&#xff0c;保证一个类只有一个实例&#xff0c;且提供访问实例的全局节点。 工厂模式 面向对象其中的三大原则&#xff1a; 单一职责&#xff1a;一个类只有一个职责&#xff08;Game类负责什么时候创建英雄机&#xff0c;而不需要知道创建英雄机要…

多因子模型的数据处理

优质博文&#xff1a;IT-BLOG-CN 数据处理的基本目的是从多量的、可能是杂乱无章的、难以理解的数据中抽取并推导出有价值、有意义的数据。特别是金融数据&#xff0c;存在数据缺失&#xff0c;不完整以及极端异常值等问题&#xff0c;对于我们的分析和建模影响很多。 对于我…

Git分布式版本控制系统——Git常用命令(二)

五、Git常用命令————分支操作 同一个仓库可以有多个分支&#xff0c;各个分支相互独立&#xff0c;互不干扰 分支的相关命令&#xff0c;具体如下&#xff1a; git branch 查看分支 git branch [name] 创建分支&#x…

20240409在全志H3平台的Nano Pi NEO CORE开发板上运行Ubuntu Core16.04时跑通4G模块EC200A-CN【PPP模式】

20240409在全志H3平台的Nano Pi NEO CORE开发板上运行Ubuntu Core16.04时跑通4G模块EC200A-CN【PPP模式】 2024/4/9 14:25 【不建议使用ppp模式&#xff0c;功耗大&#xff0c;貌似更过分的&#xff01;网速还低&#xff01;】 【唯一的优点&#xff1a;ppp模式下是通过脚本配置…

降额的秘密——不要挑战datasheet!

原文来自微信公众号&#xff1a;工程师看海&#xff0c;与我联系&#xff1a;chunhou0820 看海原创视频教程&#xff1a;《运放秘籍》 大家好&#xff0c;我是工程师看海。 什么是降额设计&#xff1f;我们为什么要降额&#xff1f; 额指的是额定工作状态&#xff0c;降额就是…

CSS特效---HTML+CSS实现3D旋转卡片

1、演示 2、一切尽在代码中 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>Document</title&…

Ubuntu无网络标识的解决方法

1.出现的情况的特点 2.解决办法 2.1 进入root并输入密码 sudo su 2.2 更新NetworkManager的配置 得先有gedit或者vim&#xff0c;两个随意一个&#xff0c;这里用的gedit&#xff0c;没有就先弄gedit&#xff0c;有的话直接下一步 apt-get install gedit 或者vim apt-get ins…

Excel中输入数字会改变怎么办?

一、数字显示不全&#xff0c;以“#”号代替 随着列宽的缩小&#xff0c;数字逐渐被“#”号代替&#xff08;首先数字的格式是“数值型&#xff0c;且只有整数”&#xff09; 原因分析&#xff1a;单元格中的数字无法完全显示&#xff0c;Excel会自动用“#”号填充剩余的空间 解…

【数据结构】07查找

查找 1. 基本概念2. 顺序表查找2.1 顺序查找2.2 顺序查找优化-哨兵 3. 有序表查找3.1 折半查找&#xff08;二分查找&#xff09; 4. 分块查找&#xff08;索引顺序查找&#xff09;5. Hash表&#xff08;散列表&#xff09;5.1 散列函数的设计5.2 代码实现5.2.1 初始化Hash表5…

【Python】面向对象(专版提升2)

面向对象 1. 概述1.1面向过程1.2 面向对象 2. 类和对象2.1 语法2.1.1 定义类2.1.2 实例化对象 2.2 实例成员2.2.1 实例变量2.2.2 实例方法2.2.3 跨类调用 3. 三大特征3.1 封装3.1.1 数据角度3.1.2 行为角度3.1.3 案例:信息管理系统3.1.3.1 需求3.1.3.2 分析3.1.3.3 设计 3.2 继…

照片分辨率怎么调?一键修改图片dpi

当我们需要通过电子邮件、社交媒体、即时消息或在线存储服务共享图片时&#xff0c;较高分辨率的图片文件可能会占用更多的存储空间和传输时间。通过修改图片分辨率&#xff0c;您可以减小文件大小&#xff0c;提高传输速度&#xff0c;并确保照片在网络共享和传输过程中的顺利…

gpu服务器与cpu服务器的区别在哪?

GPU服务器与CPU服务器的区别主要体现在处理能力、应用场景、能源消耗和成本等方面。 处理能力&#xff1a;CPU&#xff08;中央处理器&#xff09;是计算机的“大脑”&#xff0c;负责执行指令和处理数据&#xff0c;它的设计注重于逻辑运算和串行处理能力。而GPU&#xff08;…

隐私计算实训营第九讲-隐语多方安全计算在安全核对的行业实践

隐私计算实训营第九讲-隐语多方安全计算在安全核对的行业实践 文章目录 隐私计算实训营第九讲-隐语多方安全计算在安全核对的行业实践1.业务背景&#xff1a;安全核对产生的土壤1.1相关政策出台1.2 数据差异的来源 2.产品方案&#xff1a;从试点到规模化的路3.技术共建&#xf…

c++ 指针总结

概述 内存地址 在计算机内存中&#xff0c;每个存储单元都有一个唯一的地址(内存编号)。通俗理解&#xff0c;内存就是房间&#xff0c;地址就是门牌号 指针和指针变量 指针&#xff08;Pointer&#xff09;是一种特殊的变量类型&#xff0c;它用于存储内存地址。指针的实质…

Java springmvc 参数名用is开头导致为null

因为最近在整理一些源码和编写规范&#xff0c;这里写一下只是记录几年前自己遇到的问题&#xff0c;好久都忘了&#xff0c;还是写下来比较好。 问题记录&#xff1a;由于变量使用了boolean&#xff0c;并且变量名是is开头的&#xff0c;由于java机制boolean默认是false&#…