基于LMS算法的语音消噪数字设计实现

基于LMS算法的语音消噪数字设计实现,第1张

文章目录
  • 1. 前言
  • 2. LMS算法
    • 2.1 LMS算法简介
    • 2.2 LMS算法思路
    • 2.3 LMS算法系统模型
  • 3. 算法仿真
  • 4.仿真结果及分析
  • 5. 小结

摘 要: 从最小均方算法LMS(Least Mean Square)基本原理出发,利用该原理实现语音信号消噪。研究了LMS算法不同步长对处理结果的影响,提出了LMS算法,设计了滤波器,实现了消噪的数字设计。理论分析及实验结果表明,在合适的步长下,采用LMS算法的自适应滤波器,可以实现对含有噪声干扰的语音信号中恢复实际信号,且实验结果具有良好的收敛性、较小的稳态误差。算法和设计对同行有参考和借鉴作用。
关键词: 最小均方算法(LMS);语音消噪;自适应滤波

1. 前言

在日常生活里,语音信号在传递过程中都会混有一定的随机噪声。一般信号属于窄带,噪声则属于宽带,且通常会覆盖语音信号频率范围。这就需要滤波,一般是尽量滤除语音信号外的噪声信号。语音消噪技术与通话质量息息相关,应用在不同的环境,噪声差异巨大。针对特定环境下消噪需求而设计的固定滤波器,工程量大且不灵活;而在已知信号频谱范围时,在众多环境下能自适应消除噪声的滤波器设计则更具有使用价值[1]。
本文基于最小均方(Least Means Square,LMS)算法,设计了语音消噪技术,实现了对语音噪声的有效处理。通过Matlab仿真设计了自适应滤波器,解决在不同环境下语音消噪的问题。自适应滤波器区别于固定滤波器的特征就在于它能够在未知环境中,通过系统训练,跟踪输入信号的时域特征[2]。自适应的特征可以滤除噪声。

2. LMS算法 2.1 LMS算法简介

LMS算法是线性自适应滤波算法。一般来说,它包含两个基本过程:(1)滤波过程(filtering process)包括:(a)计算线性滤波器输出对输入信号的响应;(b)通过比较输出结果与期望响应产生估计误差。(2)自适应过程(adaptive process):根据估计误差自动调整滤波器参数。
这两个过程一起工作组成一个反馈环。首先,我们有一个横向滤波器(围绕它构造LMS算法);该部件的作用在于完成滤波过程。其次,我们有一个对横向滤波器抽头权值进行自适应控制过程的算法。
该算法是使均方误差输出在性能表面上下降的算法。这种算法避免了由于一般梯度估值带来的弊端(由于需要权向量的扰动,并要求对每个权分量均要做4N次均方误差输出的数据采样,因而迭代显得相当繁琐,且自适应收敛时间长),采用一种特殊的梯度估值方法(这种方法不需要离线方式的梯度估计或重复使用样本数据,而只需要在每次迭代时对数据做“瞬时”梯度估计)。
同时LMS在实际实现时不需要平方、平均或者微分运算,这就表明了算法的简单性和效率。梯度方向的每个分量由单个数据样本得到,无需扰动权向量,因而梯度估计必然包含了一个大的噪声分量,但是在自适应的过程中,由于存在着如积分电路这样的低通滤波作用,故随着时间的推移,噪声也会被衰减。

2.2 LMS算法思路

LMS(Least mean square)算法是最常见的自适应滤波算法。所谓自适应滤波,就是利用前一个样本已获得的滤波器参数等结果,自动地调节下一时刻的滤波器参数,以适应信号和噪声未知的或随机变化的特性。LMS算法采用平方误差最小的准则代替均方误差最小的准则,信号的基本关系如下:

写成矩阵形式为:

在式2-1中,w(n)为第n时刻自适应滤波器的权矢量,N为自适应滤波器的阶数。X(n)为第n时刻自适应滤波器的参考输入矢量,由前N个信号采样值构成。X(n)=〖[x(n),x(n-1),⋯,x(n-N-1)]〗^T, d(n)是期望输出值,它通常是原始信号。e(n)为自适应滤波器的估计误差,μ是控制LMS算法收敛性和稳定度的常数,称作收敛因子。μ值的选取必须满足收敛条件。在收敛范围内,μ越大收敛效果越好,但μ过大,收敛过程将出现震荡。
根据以上分析,我们可以得到LMS算法的步骤如下:
(1)设定滤波器w(n)的初始值和收敛因子μ,

(2)计算第n时刻滤波器实际输出的估计值。
y(n)=W^T (n)X(n) (2-8)
(3)计算估计误差
e(n)=d(n)-y(n) (2-9)
(4)计算n+1时刻的滤波器输出系数
W(n+1)=W(n)+2μe(n)X(n) (2-10)
(5)计算到第N-1时刻的滤波器系数,重复步骤(2)-(4)。

2.3 LMS算法系统模型

按照如图1所示的系统模型进行LMS噪声消除的程序编写,并完成在不同步长参数、权初值的条件下对算法收敛性能的影响。

如图所示:预测信号x(n)由输入信号和噪声信号相加产生,x(n)=s(n)+n0。其中是n0方差为 1,均值为零的高斯白噪声。

3. 算法仿真

根据上述算法,采用Matlab进行程序设计仿真实验。首先Matlab读入一段音频文件,把它作为理想输入信号。然后产生与输入信号同样长度的高斯白噪声,把高斯白噪声与理想信号叠加起来就得到含噪信号。这个含噪信号就是自适应滤波系统要处理的信号。接着根据LMS算法的原理编写相应的Matlab程序。本次仿真是用Matlab 2018a版本,在该版本中,有常用的自适应滤波算法的库函数,其中包括LMS算法。我们可以利用这些库函数,通过设置输入参量来得到合适的输出。本次算法仿真利用了’dsp.LMSFilter’这个库函数。dsp.LMSFilter系统对象实现了一个自适应有限脉冲响应(FIR)滤波器,该滤波器使用LMS算法将输入信号收敛到所需的信号。它有三个输入参量,分别是滤波器阶数、算法类型和收敛因子。通过[y,e,w]=lmsfilt1(s,r1)这个语句就实现了LMS滤波。输出参数分别为滤波器输出、误差信号、滤波器权系数。
程序如下:

%%%利用LMS算法实现语音去噪
close all;clear;
[s,fs]=audioread('F:\MATLAB project\原始音频.wav');  % 读入数据文件
s=s-mean(s);                           % 消除直流分量
s=s/max(abs(s));                        % 幅值归一
N=length(s);                           % 语音长度
time=(0:N-1)/fs;                        % 设置时间刻度
SNR=5;                               % 设置信噪比
r2=randn(1,N);                         % 产生随机噪声
b=fir1(31,0.5);                         % 设计FIR滤波器,代替H
r21=filter(b,1,r2);                       % FIR滤波
[r1,r22]=add_noisedata(s,r21,fs,fs,SNR); %产生带噪语音信号,信噪比为SNR

M=32;                               % 设置M和mu,M为滤波器阶数
mu=0.001;                           %mu为收敛因子
w=zeros(M,N);                       %将滤波器的初始值设置为0
y=zeros(1,N);                       %初始化滤波器实际输出的估计值
Ps1=sum((s).^2);                    %信号的能量
Pn1=sum((r1-s).^2);                 %噪声的能量
snr1=10*log10(Ps1/Pn1);             %信号的能量与噪声的能量之比,再求分贝值
%	dsp.LMSFilter - Compute output, error, and weights of LMS adaptive filter
%     The dsp.LMSFilter System object implements an adaptive finite impulse response
%     (FIR) filter that converges an input signal to the desired signal using one of
%     the following algorithms: LMS Normalized LMS Sign-Data LMS Sign-Error LMS
%     Sign-Sign LMS
lmsfilt1=dsp.LMSFilter(32,'Method','LMS','StepSize', 0.004);%滤波器阶数32,收敛因子
[y,e,w]=lmsfilt1(s,r1);     %s为理想信号,r1为含噪语音信号.y为LMS滤波后出;
% e为误差信号;w为滤波器权系数
Ps2=sum((s).^2);            %信号的能量
Pn2=sum((y-s).^2);          %噪声的能量
snr2=10*log10(Ps2/Pn2);     %信号的能量与噪声的能量之比,再求分贝值
snr=snr2-snr1;
fprintf('snr1=%5.4f   snr2=%5.4f    snr=%5.4f\n',snr1,snr2,snr);
% 作图
figure(1);
subplot(311);
plot(time,s);
grid on;		%开启坐标网格
xlabel('时间');
ylabel('幅值'); 
title('原始语音信号');
subplot(312);
plot(time,r1);
grid on;
xlabel('时间');
ylabel('幅值'); 
title('带噪语音信号');
subplot(313);
plot(time,y);
grid on;
title('LMS滤波输出语音信号');
xlabel('时间/s');
ylabel('幅值');
sound(s,fs);                %从声卡发声比较,播放原始语音
pause(1)					  %暂停1sound(r1,fs);               %播放含噪语音
pause(1)
sound(y,fs);                %播放去噪后的语音

其中,[r1,r22]=add_noisedata(s,r21,fs,fs,SNR)子函数是对输入信号s加入指定信噪比SNR的高斯白噪声,输出参量r1为含噪信号,r22为对应信噪比的噪声。程序如下:

function [signal,noise]=add_noisedata(s,data,fs,fs1,snr)
s=s(:);                          % 把信号转换成列数据
s=s-mean(s);                     % 消除直流分量
sL=length(s);                    % 求出信号的长度
if fs~=fs1                       % 若纯语音信号的采样频率与噪声的采样
%频率不相等
x=resample(data,fs,fs1);     % 对噪声重采样,使噪声采样频率与纯语音信
%号的采样频率相同
else
    x=data;
end
x=x(:);                          % 把噪声数据转换成列数据
x=x-mean(x);                     % 消除直流分量
xL=length(x);                    % 求噪声数据长度
if xL>=sL                       % 如果噪声数据长度与信号数据长度不等,把噪声数据截断或补足
    x=x(1:sL);
else
    disp('Warning: 噪声数据短于信号数据,以补0来补足!')
    x=[x; zeros(sL-xL,1)];
end
Sr=snr;
Es=sum(x.*x);                    % 求出信号的能量
Ev=sum(s.*s);                    % 求出噪声的能量
a=sqrt(Ev/Es/(10^(Sr/10)));      % 计算出噪声的比例因子
noise=a*x;                       % 调整噪声的幅值
signal=s+noise;                  % 构成带噪语音

在本文,信噪比的计算公式为:

其中,s(i)为原始信号,x(i) 含噪信号。

4.仿真结果及分析

在实际应用中,不仅要考虑消除噪声的效果,也要在尽量消除噪声的同时考虑自适应时间的长短。参数μ直接影响LMS算法的收敛速度和稳态误差。步长因子μ首先要满足LMS算法的收敛条件,以保证完成对噪声尽量滤除,其次,步长因子μ决定着LMS算法的收敛速度。自适应时间的长短与LMS算法的收敛速度正相关。本仿真实验在噪声功率不变的同时,通过改变步长因子μ的大小,使用迭代次数的多少来模拟LMS算法的收敛速度。为了分析算法性能,可以取3个不同的μ值,来比较不同步长因子μ对算法收敛性和平稳性的影响。这里μ值分别取0.001,0.002,0.004。同时,分别取不同的输入信噪比SNR=0dB,SNR=5dB,SNR=10dB。用Matlab进行仿真。输出信噪比的结果如表4-1、4-2、4-3所示。

当u=0.004时,分别取SNR=0dB,SNR=5dB,SNR=10dB,进行仿真。将Matlab运行输出的数据用plot语句绘图,观察比较输出与输入的时域波形图。
图4-1为Matlab读取到的原始语音信号。

图4-2为加噪后的语音信号,对应的信噪比为5dB。

图4-3为LMS滤波后的语音信号。相比于加入噪声的信号,波形平滑了许多。

图4-4为加噪后的语音信号,对应的信噪比为10dB。

图4-7为 u=0.004,SNR=0dB时,LMS滤波后的语音信号。

用同样的方法,当u=0.001时,分别取SNR=0dB,SNR=5dB,SNR=10dB进行仿真。将Matlab运行输出的数据用plot语句绘图,观察比较输出与输入的时域波形图。
图4-8为u=0.001,SNR=0dB时,LMS滤波后的语音信号。

图4-9为u=0.001,SNR=5dB时,LMS滤波后的语音信号。

图4-10为u=0.001,SNR=10dB时,LMS滤波后的语音信号。

从图4-8到图4-10中,u=0.001时,LMS滤波器系数在大约1秒以后才收敛,输出信号相比于原始信号来说刚开始的部分有轻微失真,但是信噪比均得到不同程度提高。
用同样的方法,当u=0.002时,分别取SNR=0dB,SNR=5dB,SNR=10dB进行仿真。将Matlab运行输出的数据用plot语句绘图,观察比较输出与输入的时域波形图。 (限于篇幅,仿真结果图这里省略,读者可自行分析验证。)

5. 小结

在上一节中,我们一方面通过改变步长因子u的值,保持信噪比不变,来观察LMS算法的收敛速率。另一方面,通过改变信噪比,保持步长因子u的值不变来分析LMS算法的性能,计算输出信噪比,比较信噪比的变化。当信噪比相同时,步长越小,那么LMS自适应滤波器收敛速度慢;步长越大,LMS自适应滤波器收敛速度越快[4]。
从图4-7、4-8和4-10中,可以看出在SNR=0dB时,随着u增大,滤波器输出在最开始的时间内失真越小,意味着LMS自适应滤波器收敛越快。当SNR分别为5dB、10dB时也可以得出同样结果。此外,u值相同时,随着信噪比增加,滤波效果则不明显,输出信噪比提升越小。因此在本次设计中,步长因子μ取0.004时可以基本满足消噪需求。但是在实际应用中,人们在设计自适应滤波器时,需要根据这种特性合理选择参数μ,以达到相对良好的收敛性和较小的稳态误差。
本文基于LMS算法,给出了一种适用范围较广、比较有效的语音自适应消噪的设计实现方法。提出如何选择合理的步长因子μ,以平衡稳态误差和收敛速度。同时保持步长因子u不变,改变信噪比,来分析LMS算法的滤波性能。设计出的自适应滤波器具有良好的收敛性、较小的稳态误差、良好的适应性[5]。本设计对语音消噪具有一定的参考价值。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/886899.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-14
下一篇 2022-05-14

发表评论

登录后才能评论

评论列表(0条)

保存