自适应滤波器更新算法-EP2


本文接上一篇博文,接下来介绍博主阅读论文总结的几种优化后的自适应滤波器更新算法!

1、变步长 SC-MPNLMS 频域分块算法

1.1 算法原理

  该算法由参考文献[1]提出,这种变步长 SC-MPNLMS 频域分块算法首先将远端输入信号分块处理,并对每个独立的块进行 FFT,而 FFT 是实现卷积和的快速运算,将远端输入信号与回声路径的卷积运算变换至频域内,在频域中实现滤波器权值向量的更新迭代,提升了算法的运算速度。在算法的自适应滤波阶段将频域内的信号进行快速傅里叶反变换(Inverse FFT,IFFT)使其变换至时域,并采用递归平均方法得到泄漏系数,从而调整全局步长因子矩阵,实现变步长 SC-MPNLMS 频域分块算法的自适应滤波过程。该算法改善了传统算法达到稳态值时大步长导致稳态失调过大的问题;针对频域分块自适应滤波算法初始收敛速度慢的问题,将滤波器初始权值赋值为稀疏度适中的随机序列。

在这里插入图片描述

  MPNLMS算法解决了PNLMS在估计过程中收敛速度不均的问题,实际上回声路径的稀疏程度是随着时间不断变化的,取决于温度,压力和反射率等因素[37,38],也随着封闭空间中的扬声器与麦克风的距离而变化。由于回声路径的稀疏程度对算法性能影响很大,SC-MPNLMS算法在自适应过程的每次迭代中计算出估计回声路径的稀疏程度,并将其融入MPNLMS算法,得到SC-MPNLMS算法的权值向量更新方程如下:

在这里插入图片描述

其中, μ \mu μ 为全局步长因子, x ( n ) x(n) x(n) 为远端输入信号,L为滤波器的长度, α \alpha α 为调整参数以防止出现被零整除的情况。 G ( n ) G(n) G(n) 为调整步长的对角矩阵,其具体计算方法可以参考文献一。

  变步长SC-MPNLMS频域分块算法的原理如下图所示。首先将输入信号分块,处理每个独立的块时权值系数不变,每个块的数据处理完后才对权值进行更新,降低了计算复杂度。在频域内结合估计回声与误差信号的LPS,采用递归平均得到最优步长因子,使权值系数每次迭代都具有最优步长,在保证稳态性能不降低的前提下,进一步提升了算法的收敛性能。

在这里插入图片描述

算法的具体公式推导也可以从文献中学习,最后变步长的SC-MPNLMS频域分块算法的权值更新迭代公式为:

在这里插入图片描述

1.2 算法代码

该算法针对最优步长的计算较为复杂,博主还未复现。如果有复现的童鞋,欢迎和博主分享学习,非常感谢!

1.3 算法优缺点

  该算法基于频域分块自适应算法[36],将不相关的远端输入信号分块处理,对每个独立的块依次进行频域内的自适应滤波,累加后作 FFT 反变换得到估计回声,将估计回声从期望信号中去除得到误差信号,根据回声对每个频点泄漏程度的不同,结合估计回声与误差信号的 LPS,用递归平均法调整全局步长因子矩阵,使算法初期拥有较大步长来提升收敛速度,后期拥有较小步长从而减小稳态误差,并对滤波器权值系数进行随机序列的非零值初始化,进一步改善了算法的初始收敛速度。当远端输入信号为不相关信号时,对于长度较长的回声路径,本章提出的改进算法在性能表现良好的情况下很大程度上节约了计算成本,使得 AEC 更具有实时性。

2、集成多种自适应滤波算法的回声消除器

1.1 算法原理

  该算法由参考文献[2]提出,其集成了多种自适应滤波器算法的回声消除框架。该算法是基于现代芯片技术的发展,芯片的运算速度得到大大提高而提出的,做法是选择多个各有优缺点且具有一定互补性的固定步长自适应算法,每种算法取多个不同的步长,分析同一时刻不同算法不同步长的误差,用帧误差能量最小的方法来选择该帧用哪一种算法,这样始终能选择—种输出误差最小的算法。该算法的问题是计算量比较大。

  算法的具体实现步骤是:选择LMS、NLMS、PNLMS和IPNLMS这四种具有一定互补性的固定步长自适应滤波算法,每种算法选择三个不同步长进行试验。这样就有12种算法,这12种算法同时进行。首先,计算出各个算法的误差,然后,计算每—帧的误差能量,比较得出最小帧误差能量,最后,将最小帧误差能量的误差作为输出。

在这里插入图片描述

1.2 算法代码

其实现原理就是将多种算法整合起来,每一帧处理后,都将多种算法中结果最好的输出出来。

1.3算法优缺点

  • 该算法集成了多种算法,因为多种算法各有特点并且互补,因此在不同场景下各种算法的效果也不同,但是肯定有一种算法效果最好。该算法就是应用了这一点,可以针对不同场景采用不同的自适应滤波器算法。
  • 该算法的缺点是,每次处理必须要同时计算多种算法的处理效果,计算量巨大。可以理解为用时间+空间换效果。

1.4 算法自适应准则

  文中介绍了两种自适应准则,自适应准则是基于最佳滤波器的设计提出来的,典型的最佳滤波器是维纳滤波器,自适应滤波器对于平稳信号收敛到维纳解。对于平稳的输入信号来说,自适应过程就是从某个初始状态出发求维纳解的过程。常用的自适应准则有两种::

  1. 均方误差(MSE)准则,该准则定义为自适应滤波器对期望信号进行估计的均方值,即期望信号与实际滤波器输出信号的差值的平方的期望值。

    在这里插入图片描述

    其中, d ( n ) d(n) d(n) 代表期望信号, y ( n ) y(n) y(n) 代表自适应滤波器的输出信号, w w w 代表滤波器的权系数矢量,x代表输入矢量。

  2. 最小平方(Ls)误差准则,该准则定义为期望信号与实际滤波输出信号的差值的平方和的平均值或者是加权平方和,即:在这里插入图片描述

式中, C n C_n Cn 为加权值,该准则的基础是误差的加权和最小。

3、新的变步长的LMS自适应滤波算法

3.1算法原理

   该算法是参考文献[3]中提出的,在介绍该算法之前,先介绍几种常用的变步长的LMS自适应滤波算法:

  • 基于对数函数的变步长LMS自适应滤波算法:根据上述动态选择步长参数值的标准,文献[4]提出了一种形式较为简单、计算复杂度低的基于对数函数的变步长LMS算 法,其将对数函数进行适当的改变作为步长参数模型决定步长参数值 μ \mu μ 的变化,使得步长参数的值随着误差 e ( n ) e(n) e(n) 的改变而发生动态的改变,步长调整公式为
    μ ( n ) = σ l o g [ ρ ∣ e ( n ) ∣ υ ] \mu(n) = \sigma log[\rho|e(n)|^\upsilon] μ(n)=σlog[ρe(n)υ]
    其中,参数 σ \sigma σ 的作用是控制步长参数模型的取值范围,参数 ρ \rho ρ 的作用是控制步长参数模型的形状,参数 υ \upsilon υ 的作用是控制步长参数模型邻近误差为 0 的区域的变换速率。经过文献[4]测试, σ = 0.02 , ρ = 1000 , υ = 2 \sigma = 0.02,\rho = 1000,\upsilon = 2 σ=0.02ρ=1000υ=2 时算法效果最好。

  • 基于正态分布函数的变步长LMS自适应滤波算法:文献[5]是在基于sigmoid函数的变步长LMS算法的基础上提出的,其步长参数调整公式为
    μ ( n ) = c { 1 − e x p [ − a ∣ e ( n ) ∣ b ] } \mu(n) = c\{1-exp[-a|e(n)|^b]\} μ(n)=c{ 1exp[ae(n)b]}
    其中,参数 a a a 控制步长参数模型收敛至最大取值的速度,参数 b b b 控制模型底部的形状,即进入稳态使其的步长参数模型的变化趋势,参数 c c c 控制步长参数模型的最大取值,经过文献[5]测试, a = 5 , b = 1 , c = 0.12 a=5,b=1,c= 0.12 a=5b=1c=0.12 时算法效果最好。

  参考文献[3]中提出的算法为了使LMS自适应滤波算法在收敛速度、稳态误差和系统跟踪性能等重要算法特征上得到更好的效果,在上面提出的第一种算法的基础上设计了一种新的步长参数变化模型,新的步长参数与误差之间的函数表达式为:
μ ( n ) = − γ l o g ( 1 1 + τ [ e ( n ) ] 2 ) \mu(n) = - \gamma log(\frac{1}{1+\tau[e(n)]^2}) μ(n)=γlog(1+τ[e(n)]21)
  参数 γ \gamma γ 的取值对于步长参数的取值范围有明显的影响;参数 τ \tau τ 对步长参数取值的范围和形状也就是变化趋势都有一定的影响,进而有可能降低算法的收敛速度以及精度。 根据参考文献中的测试,当 γ = 0.9 \gamma=0.9 γ=0.9 τ = 0.7 \tau = 0.7 τ=0.7 时,改进的变步长LMS自适应滤波器算法的步长参数模型最好。

改进后的LMS算法的具体步骤如下:

  1. 初始化参数。将自适应滤波器权系数的初始值 W ( 0 ) W(0) W(0) 设置为0,将自适应滤波器的阶数设置为M,选择合适的变化的步长值 μ \mu μ ,为了使算法收敛,步长 μ \mu μ 的取值应为:
    0 < μ < 1 / λ m a x 0<\mu<1/\lambda_{max} 0<μ<1/λmax
    其中 λ m a x \lambda_{max} λmax 表示输入信号 X ( n ) X(n) X(n) 的自相关矩阵的最大特征值。

  2. 计算滤波器的实际输出信号为 : y ( n ) = W T ( n ) X ( n ) y(n) = W^T(n) X(n) y(n)=WT(n)X(n)

  3. 计算自适应滤波器的误差为 : e ( n ) = d ( n ) − y ( n ) = d ( n ) − W T ( n ) X ( n ) e(n) = d(n) - y(n) = d(n) - W^T(n) X(n) e(n)=d(n)y(n)=d(n)WT(n)X(n)

  4. 更新步长参数,步长参数更新公式为 μ ( n ) = − γ l o g ( 1 1 + τ [ e ( n ) ] 2 ) \mu(n) = - \gamma log(\frac{1}{1+\tau[e(n)]^2}) μ(n)=γlog(1+τ[e(n)]21)

  5. 更新滤波器权系数的值为: W ( n + 1 ) = W ( n ) + μ ( n ) X ( n ) e ( n ) W(n+1) = W(n) + \mu(n)X(n)e(n) W(n+1)=W(n)+μ(n)X(n)e(n)

重复上述步骤2~5,直到滤波器权系数逼近最佳滤波为止。

3.2算法代码

function[e,y,w] = NLMS(d,x,M)
    % 输入:
    % d  - 麦克风语音
    % x  - 远端语音
    % M  - 滤波器阶数
    %
    % 输出:
    % e - 近端语音估计
    % y - 远端回声估计
    % w - 滤波器参数
    d_length = length(d);
    if (d_length <= M)
        print('error: 信号长度小于滤波器阶数!');
        return; 
    end
    if (d_length ~= length(x))  
        print('error: 输入信号和参考信号长度不同!');
        return; 
    end
    
    xx = zeros(M,1);
    w1 = zeros(M,1);  %滤波器权重
    y = zeros(d_length,1); %近端语音
    e = zeros(d_length,1); %误差
    
    for n = 1:d_length
        %在输入信号x前补上M-1个0,使输出y与输入具有相同长度
        xx = [xx(2:M);x(n)]; %(39,1) +(1,1) = (40,1)
        y(n) = w1' *xx;
        mu = -0.9log(1/1+0.7*e(n)*e(n)); %步长,这里简化了mu的计算,没有防止x(n)过小的情况
        e(n) = d(n) - y(n);  %误差
        w1 = w1 + mu * e(n) * xx;
        w(:,n) = w1;
    end
end

3.3算法优缺点

  该算法在基于对数函数的变步长LMS算法的基础上,建立了一种新的步长参数与误差的关系模型。仿真结果表明,提出算法与已有算法相比,能够达到更高的收敛精度及更快的收敛速度,在系统不发生时变时,收敛精度分别提高了5dB和3dB,当系统发生时变后,收敛精度分别提高了4dB和2dB,不论系统是否发生时变,收敛速度都更快。

参考文献

[1]冯江浩. 基于自适应滤波的声学回声消除算法研究[D]. 太原理工大学.

[2]夏红根. 基于自适应滤波器的回声消除算法研究及应用[D]. 中国科学技术大学, 2009.

[3]张继荣, 张天. 一种改进的变步长LMS自适应滤波算法[J]. 西安邮电大学学报, 2021.

[4]茹国宝, 黄燕, 郭英杰,等. 基于对数函数的新变步长LMS算法[J]. 武汉大学学报:理学版, 2015(3):4.

[5]马凯, 王平波, 武彩. 一种基于正态分布曲线的变步长LMS算法[J]. 计算机仿真, 2019, 36(9):5.

作者:王小二_Leon
欢迎任何形式的转载,但请务必注明出处。
限于本人水平,如果文章和代码有表述不当之处,还请不吝赐教。
本文章不做任何商业用途,仅作为自学所用,文章后面会有参考链接,我可能会复制原作者的话,如果介意,我会修改或者删除。

猜你喜欢

转载自blog.csdn.net/qq_44085437/article/details/128166932