编程语言
首页 > 编程语言> > 【语音去噪】基于matlab LMS谱减法语音去噪【含Matlab源码 529期】

【语音去噪】基于matlab LMS谱减法语音去噪【含Matlab源码 529期】

作者:互联网

一、简介

最小均方(LMS, Least Mean Squares)是最基本的自适应滤波算法。
LMS算法是自适应滤波器中常用的一种算法与维纳算法不同的是其系统的系数随输入序列而改变。维纳算法中截取输入序列自相关函数的一段构造系统的最佳系数。而LMS算法则是对初始化的滤波器系数依据最小均方误差准则进行不断修正来实现的。因此理论上讲LMS算法的性能在同等条件下要优于维纳。但是LMS是在初始值下逐步调整的,因此在系统稳定前,会有一段调整时间,调整时间受步长因子的控制,一定范围内,步长因子越大,调整时间越小,步长因子的最大取值为R的迹。LMS采用平方误差最小的原则代替均方误差最小的原则,信号基本关系如下:
在这里插入图片描述
在这里插入图片描述

二、源代码

clear all;clc; close  all;
%filedir=[D:\Program Files\MATLAB\speech.wav];  %路径设置不对,以下用不到就省略掉,直接用下行代码的文件名
filename='speech.wav';  
%fle=[filedir filename];       %无用行,以下没用到
[s,fs] =audioread(filename);   %wavread函数在此版本后不能用了,改用audioread
s=s/max(abs(s));     %将语音信号幅值归一化
N=length(s);         %求信号的长度
time=(0:N-1)/fs;     %设置横坐标的时间
ns=0.5*cos(2* pi* 50* time);   %计算出50Hz的工频信号
x=s+ns';      %语音信号和50Hz的工频信号叠加
snr1=SNR_singlech(s,x);     %计算叠加后50Hz工频信号之后的信噪比
x1=cos(2* pi * 50 * time);  %设置x1和x2
x2=cos(2* pi * 50 * time);
w1=0.1;        %初始化w1和w2
w2=0.1;
e=zeros(1,N);  %初始化e和y
y=zeros(1,N);
mu=0.05;       %设置mu
for i=1:N 
    y(i)=w1* x1(i)+ w2* x2(i);   %LMS自适应陷波器滤波
    e(i)=x(i)-y(i);
    w1=w1+mu* e(i) * x1(i);
    w2=w2+mu* e(i) * x2(i);
end
output=e';    %陷波器输出
snr2=SNR_singlech(s,output);     %计算滤波后的输出
snr=snr2-snr1;
fprintf('snr1=%5.4f  snr2=%5.4f  snr=%5.4f\n',snr1,snr2,snr);
%wavpaly(x,fs);        %从声卡发声比较
audioplayer(x,fs)
pause(1);
audioplayer(output,fs);
wavwrite(output,'hehe.wav');

三、运行结果

在这里插入图片描述

四、备注

版本:2014a

标签:fs,语音,LMS,算法,源码,w2,w1,output
来源: https://blog.51cto.com/u_15287606/2975947