主要内容

基于LMS和NLMS算法的信号增强

利用最小均方(LMS)和归一化LMS算法,通过滤除噪声,从被噪声污染的信号中提取所需信号。这两种算法都可用dsp。LMSFilter系统对象™。

创建适应信号

所需的信号(过程的输出)是一个每帧有1000个样本的正弦信号。

正弦= dsp。SineWave (“频率”, 375,“SampleRate”, 8000,“SamplesPerFrame”, 1000)
正弦= dsp。正弦波的属性:振幅:1频率:375相位偏移:0 ComplexOutput: false方法:'三角函数' SampleRate: 8000 SamplesPerFrame: 1000 OutputDataType: 'double'
s = sin ();

为了进行自适应,滤波器需要两个信号:

  • 一个参考信号

  • 既包含所需信号又包含附加噪声成分的一种噪声信号

产生噪声信号

用自回归噪声创建一个噪声信号(定义为v1).在自回归噪声中,t时刻的噪声只依赖于以前的值和一个随机扰动。

v = 0.8 * randn (sine.SamplesPerFrame, 1);%随机噪声部分。基于“增大化现实”技术= (1 1/2);%自回归系数。ARfilt = dsp。IIRFilter (“分子”, 1“分母”基于“增大化现实”技术)
ARfilt = dsp。结构:'直接形式II转置'分子:1分母:[1 0.5000]初始条件:0显示所有属性
v1 = ARfilt (v);

损坏所需信号以产生噪声信号

为了产生既包含所需信号又包含噪声的噪声信号,添加噪声信号v1到所要求的信号年代.的正弦信号x是:

X = s + v1;

自适应滤波处理寻求恢复年代x通过删除v1.为了完成进行自适应滤波所需的信号,自适应过程需要参考信号。

创建一个参考信号

定义移动平均信号v2这与v1.信号v2是本例的参考信号。

Ma = [1, -0.8, 0.4, -0.2];MAfilt = dsp。FIRFilter (“分子”、马)
MAfilt = dsp。FIRFilter与属性:结构:'直接形式' NumeratorSource: '属性' Numerator: [1 -0.8000 0.4000 -0.2000] InitialConditions: 0显示所有属性
v2 = MAfilt (v);

构造两个自适应滤波器

两个相似的六阶自适应滤波器——LMS和NLMS——构成了这个例子的基础。在MATLAB™中将顺序设置为变量并创建过滤器。

L = 7;lms = dsp。LMSFilter(L,“方法”“LMS”
lms = dsp。LMSFilterwith properties: Method: 'LMS' Length: 7 StepSizeSource: 'Property' StepSize: 0.1000 LeakageFactor: 1 InitialConditions: 0 AdaptInputPort: false WeightsResetInputPort: false WeightsOutput: 'Last' Show all properties
nlms = dsp。LMSFilter(L,“方法”“归一化LMS”
nlms = dsp。LMSFilterwith properties: Method: 'Normalized LMS' Length: 7 StepSizeSource: 'Property' StepSize: 0.1000 LeakageFactor: 1 InitialConditions: 0 AdaptInputPort: false WeightsResetInputPort: false WeightsOutput: 'Last' Show all properties

选择步长

类lms算法的步长决定了滤波器从一个迭代适应到下一个迭代时所应用的校正量。太小的步长会增加滤波器收敛于一组系数的时间。步长过大可能会导致自适应滤波器发散而无法收敛。在这种情况下,生成的过滤器可能不稳定。

作为经验法则,较小的步长提高了滤波器收敛以匹配未知系统特征的准确性,但代价是它需要花费时间来适应。

maxstep的函数dsp。LMSFilter对象确定适合于每个LMS自适应滤波器算法的最大步长,以确保滤波器收敛到一个解。通常,表示步长的符号是µ。

[mumaxlms, mumaxmselms] = maxstep (lms, x)
mumaxlms = 0.2127
mumaxmselms = 0.1312
[mumaxnlms, mumaxmsenlms] = maxstep (nlms、x)
mumaxnlms = 2
mumaxmsenlms = 2

设置“自适应过滤步长”

的第一个输出maxstep函数是系数均值收敛所需要的值,而第二个输出是系数均值平方收敛所需要的值。选择较大的步长往往会引起收敛值的较大变化,所以一般选择较小的步长。

lms。StepSize = mumaxmselms / 30
lms = dsp。LMSFilterwith properties: Method: 'LMS' Length: 7 StepSizeSource: 'Property' StepSize: 0.0044 LeakageFactor: 1 InitialConditions: 0 AdaptInputPort: false WeightsResetInputPort: false WeightsOutput: 'Last' Show all properties
nlms。StepSize = mumaxmsenlms / 20
nlms = dsp。LMSFilterwith properties: Method: 'Normalized LMS' Length: 7 StepSizeSource: 'Property' StepSize: 0.1000 LeakageFactor: 1 InitialConditions: 0 AdaptInputPort: false WeightsResetInputPort: false WeightsOutput: 'Last' Show all properties

使用自适应过滤器进行过滤

您已经设置了自适应滤波器的参数,现在可以过滤噪声信号了。参考信号v2是自适应滤波器的输入。X是这个配置中需要的信号。

通过自适应,滤波器的输出y尽可能接近于x。

因为v2只与x的噪声分量v1相关,所以它只能真正模拟v1。误差信号(期望的x)减去实际输出的y,构成了与v2 - s不相关的x部分的估计,v2 - s是要从x中提取的信号。

[~,榆树,wlm) = lms (v2, x);[~, enlms wnlms] = nlms (v2, x);

计算最优解

为了比较,计算最优FIR维纳滤波器。

重置(MAfilt);bw = firwiener (l - 1 v2, x);最优FIR维纳滤波器MAfilt = dsp。FIRFilter (“分子”bw)
MAfilt = dsp。FIRFilter与属性:结构:'直接形式' NumeratorSource: '属性' Numerator: [1.0001 0.3060 0.1050 0.0482 0.1360 0.0959 0.0477] InitialConditions: 0显示所有属性
yw = MAfilt (v2);%使用维纳滤波器估计x= x - yw;%实际正弦值的估计

阴谋的结果

绘制每个滤波器(维纳滤波器、LMS自适应滤波器和NLMS自适应滤波器)去噪后的正弦信号图,以比较各种技术的性能。

n =(1:1000)”;情节(n(900:结束),[电子战(900:结束),榆树(900:结束),enlms(900:结束)])传说(“维纳滤波去噪正弦信号”...“LMS运用正弦信号”“NLMS运用正弦信号的)包含(“时间指数(n)”) ylabel (“振幅”

作为参考点,在图中以虚线表示噪声信号。

持有情节(n(900:结束),x(900:结束),凯西:”)包含(“时间指数(n)”) ylabel (“振幅”)举行

图中包含一个坐标轴。轴包含4个线型对象。这些对象分别代表维纳滤波去噪正弦信号、LMS去噪正弦信号、NLMS去噪正弦信号。

比较最终系数

最后,将维纳滤波器系数与自适应滤波器系数进行比较。在自适应时,自适应滤波器尽量收敛于维纳系数。

(bw。“wlm wnlms]
ans =7×31.0001 0.8644 0.9690 0.3060 0.1198 0.2661 0.1050 -0.0020 0.1226 0.0482 -0.0046 0.1074 0.1360 0.0680 0.2210 0.0959 0.0214 0.1940 0.0477 0.0292 0.1127

在过滤前重置过滤器

的方法可以在任何时候重置内部筛选器状态重置函数。

例如,这些连续的调用在重置对象后产生相同的输出。

[ylms,榆树,wlm) = lms (v2, x);[ynlms, enlms wnlms] = nlms (v2, x);

如果不重置筛选器对象,筛选器将使用上次运行的最终状态和系数作为下次运行的初始条件和数据集。

通过学习曲线研究收敛性

利用学习曲线分析自适应滤波器的收敛性。工具箱提供了生成学习曲线的方法,但是您需要进行不止一次的实验迭代才能获得显著的结果。

这个演示使用了25个噪声正弦波的样本实现。

重置(ARfilt)重置(sin);释放(sin);n =(1:5000)”;正弦。SamplesPerFrame = 5000
正弦= dsp。正弦波的属性:振幅:1频率:375 PhaseOffset: 0 ComplexOutput: false方法:'三角函数' SampleRate: 8000 SamplesPerFrame: 5000 OutputDataType: 'double'
s = sin ();nr = 25;v = 0.8 * randn (sine.SamplesPerFrame nr);ARfilt = dsp。IIRFilter (“分子”, 1“分母”基于“增大化现实”技术)
ARfilt = dsp。结构:'直接形式II转置'分子:1分母:[1 0.5000]初始条件:0显示所有属性
v1 = ARfilt (v);X = ref (1, 1,nr) + 1;重置(MAfilt);MAfilt = dsp。FIRFilter (“分子”、马)
MAfilt = dsp。FIRFilter与属性:结构:'直接形式' NumeratorSource: '属性' Numerator: [1 -0.8000 0.4000 -0.2000] InitialConditions: 0显示所有属性
v2 = MAfilt (v);

计算学习曲线

现在计算均方误差。为了加快速度,每10个样本计算一次误差。

首先,重置自适应滤波器以避免使用它已经计算的系数和它已经存储的状态。然后绘制LMS和NLMS自适应滤波器的学习曲线。

重置(lms);重置(nlms);M = 10;%大量毁灭的因素mselms = msesim (lms, v2, x, M);msenlms = msesim (nlms v2, x, M);阴谋(1:M: n(结束),mselms,“b”1: M: n(结束),msenlms,‘g’)传说(“LMS的学习曲线”“NLMS学习曲线”)包含(“时间指数(n)”) ylabel (MSE的

图中包含一个坐标轴。轴线包含2个线型对象。这些对象分别代表LMS学习曲线、NLMS学习曲线。

在这幅图中,您可以看到LMS和NLMS自适应滤波器的计算学习曲线。

计算理论学习曲线

对于LMS和NLMS算法,工具箱中的函数可以帮助您计算理论学习曲线,以及最小均方误差(MMSE)、超额均方误差(EMSE)和系数的平均值。

MATLAB可能需要一些时间来计算曲线。代码后显示的图绘制了预测和实际的LMS曲线。

重置(lms);[mmselms, emselms meanwlms pmselms] = msepred (lms, v2, x, M);x = 1: M: n(结束);日元= mmselms *的(500 1);y2 = emselms *的(500 1);y3 = pmselms;y4 = mselms;情节(x, y₁,“米”, x, y2,“b”, x, y3,“k”日元,x,,‘g’)传说(“患者”“EMSE”“预测LMS学习曲线”...“LMS的学习曲线”)包含(“时间指数(n)”) ylabel (MSE的

图中包含一个坐标轴。轴包含4个线型对象。这些对象分别代表MMSE、EMSE、预测LMS学习曲线、LMS学习曲线。