自适应滤波器原理——(功率)归一化最小均方算法(NLMS/PNLMS)

一、归一化最小均方算法(NLMS)

传统的LMS算法的滤波器更新步长是固定的;滤波器的变化与输入信号的大小直接相关,输入较大时,会产生梯度噪声放大的问题,因此,在实际的应用中,我们希望两次权重的更新之间,滤波器权重的变化要尽可能小,波动不要太剧烈,即最小扰动原理。

因此在原始的LMS算法作如下改动:

 

 

归一化最小均方(Normalized Least Mean Squares,NLMS)算法是改进的LMS算法,对于较大的输入,会导致梯度噪声的放大,因此需要用输入向量的平方范数进行归一化。根据原LMS算法中误差信号与远端输入信号的乘积,对远端输入信号的平方(功率)进行归一化处理,将固定步长因子的LMS算法变为根据输入信号时变的变步长NLMS算法,具体算法如下:

其中w(n)为滤波器的系数,e(n)为误差信号

  • 优点:改善了LMS算法收敛速度慢的缺点。计算简单、更高的精度
  • 缺点:输入相关信号时,收敛速率明显下降

MATLAB程序如下:

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;        % (40,1)'*(40,1)=1
        mu = 1/(xx'*xx);    % 步长
        e(n) = d(n) - y(n);     % 误差
        w1 = w1 + mu * e(n) * xx;
        w(:,n) = w1;
    end
end

二、功率归一化最小均方(PNLMS)

 PNLMS 在NLMS的基础上引入了α和β,稳定性要好于 NLMS 。β一般设为一个较小的整数,防止输入数据矢量x(n)的内积过小使得μ(n)过大而引起稳定性能下降,一般取0.0001。当α=1,β=0时, PNLMS 退化为 NLMS 。

MATLAB程序如下:

function [e,y, w] = PNLMS(d, x, M, aplha, beta)
    % 输入:
    % d  - 麦克风语音
    % x  - 远端语音
    % a  - 偏置参数
    % 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;        % (40,1)'*(40,1)=1
        mu = aplha/(beta + xx'*xx);    % 步长
        e(n) = d(n) - y(n);     % 误差
        w1 = w1 + mu * e(n) * xx;
        w(:,n) = w1;
    end
end

参考链接:

https://www.cnblogs.com/LXP-Never/p/11773190.html

https://www.bilibili.com/video/BV1Lt4y1E7DJ/?spm_id_from=333.788

  • 4
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 基于STM32的自适应滤波器程序设计主要包括以下几个步骤: 首先,需要得到输入信号和期望输出信号。输入信号可以通过STM32的模拟输入口或者外部传感器获得,期望输出信号通常来自于信号处理的要求。 其次,采用最小均方算法(LMS)或最小二乘算法(RLS)选择适当的自适应滤波器结构。LMS算法是一种最简单常用的自适应滤波器算法,它通过调整自适应滤波器系数来最小化误差平方的期望值。RLS算法则是一种更复杂的算法,它在计算量上更大,但在性能上更优秀。 然后,设计滤波器的参数。根据实际需求,例如滤波器的阶数、截止频率等,选择合适的参数。通过调整参数,可以达到滤波器对输入信号的处理效果。 接着,通过软件编程实现自适应滤波器。使用STM32提供的开发工具,例如Keil或CubeMX,编写C语言程序,实现自适应滤波器算法。程序需要实时读取输入信号,并计算出滤波后的输出信号。 最后,通过实验验证自适应滤波器的效果。将输入信号输入到STM32开发板中,经过自适应滤波器的处理后,观察输出信号的变化。通过调整滤波器的参数,优化输出信号的质量,达到滤波器的预期效果。 综上所述,基于STM32的自适应滤波器的程序设计主要包括获取输入信号和期望输出信号、选择适当的自适应滤波器结构、设计滤波器参数、编写程序实现滤波器算法以及验证滤波器效果等步骤。这些步骤可以根据实际需求进行调整和优化,以满足特定的应用要求。 ### 回答2: 基于STM32的自适应滤波器程序设计主要是利用STM32单片机的强大计算能力和丰富的外设资源,通过编写程序实现实时信号滤波的功能。 首先,需要明确使用的自适应滤波算法。常见的自适应滤波算法有LMS(最小均方差)算法NLMS归一化最小均方差)算法等。选择合适的算法,根据实际需求来进行。 其次,根据选定的算法,编写STM32的控制程序。首先,需要初始化STM32的外设资源,如ADC(模数转换器)、DAC(数模转换器)、定时器等。然后,通过ADC模块采集待滤波的信号,将数据保存在内部的缓冲区中。接着,使用算法对采集到的信号进行滤波,并将滤波结果输出到DAC模块,以便输出到外部设备或者显示屏。 在算法的实现过程中,需要计算滤波系数。根据选用的滤波算法,利用递推公式或者其他方法计算滤波系数,并根据实时采集到的信号进行动态更新。 最后,进行实时的滤波处理。在每个采样周期,通过ADC采样得到最新的输入信号,然后根据选定的算法和计算得到的滤波系数,对信号进行滤波处理,并将结果输出到DAC模块。 需要注意的是,在程序设计过程中,需要考虑到STM32的计算能力和资源限制,合理利用STM32的优势,如DMA(直接内存访问)等技术,以提高程序的效率和实时性。 总结起来,基于STM32的自适应滤波器程序设计主要包括选定滤波算法、初始化外设、计算滤波系数、实时滤波处理等步骤。通过合理设计程序,可以实现高效、实时的信号滤波功能。 ### 回答3: 基于STM32的自适应滤波器程序设计是一种用于实时信号处理的算法,它可以根据实时信号的特性自动调整滤波器参数,以达到最佳的滤波效果。以下是一个简单的基于STM32的自适应滤波器程序设计的示例: 首先,我们需要初始化STM32的相关硬件和外设,例如GPIO、ADC和DAC等。然后,我们可以通过ADC模块获取实时的输入信号。 接下来,我们可以使用LMS(Least Mean Square)算法来实现自适应滤波器。该算法通过最小化误差信号的均方差来调整滤波器的系数。首先,我们需要初始化滤波器的系数为初始值。然后,通过计算输入信号和滤波器的输出信号之间的误差,我们可以根据误差信号的均方差来调整滤波器的系数。最后,我们将滤波器的输出信号发送到DAC模块,以获得滤波后的输出信号。 在程序的主循环中,我们可以不断地重复执行自适应滤波器的更新和输出过程,以对实时输入信号进行滤波。同时,我们还可以通过增加适当的延迟和缓冲区来提高滤波器的性能,以适应输入信号的不断变化。 总之,基于STM32的自适应滤波器程序设计可以实现对实时信号的自动调整和滤波,提高信号处理的精确性和准确性。通过适当的硬件和算法设计,我们可以实现更高效和可靠的自适应滤波器应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值