使用LMS和NLMS算法的信号增强
利用最小均方(LMS)和归一化LMS算法,从噪声污染的信号中滤除噪声,提取出所需的信号。这两种算法都可以使用dsp。LMSFilter
系统对象™。
创造适应信号
期望的信号(过程的输出)是一个每帧有1000个样本的正弦信号。
sin = dsp。SineWave (“频率”, 375,“SampleRate”, 8000,“SamplesPerFrame”, 1000)
sin = dsp。正弦波属性:振幅:1频率:375相位偏移:0 ComplexOutput: false方法:“三角函数”SampleRate: 8000 SamplesPerFrame: 1000 OutputDataType: 'double'
S = sin ();
为了进行自适应,滤波器需要两个信号:
参考信号
一种既包含所要求的信号又包含附加的噪声分量的噪声信号
产生噪音信号
用自回归噪声(定义为v1
).在自回归噪声中,t时刻的噪声只取决于先前的值和一个随机扰动。
v = 0.8*randn(sin . samplesperframe,1);%随机噪声部分。Ar = [1,1/2];%自回归系数。ARfilt = dsp。IIRFilter (“分子”, 1“分母”基于“增大化现实”技术)
ARfilt = dsp。结构:'直接形式II转置'分子:1分母:[1 0.5000]InitialConditions: 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。结构:'直接形式'分子:'属性'分子:[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,构成了对x中与v2 - s不相关的部分的估计,即从x中提取的信号。
[~,elms,wlms] = lms(v2,x);[~,enlms,wnlms] = nlms(v2,x);
计算最优解
为了进行比较,计算最佳的FIR维纳滤波器。
重置(MAfilt);bw = firwiener(L-1,v2,x);%最优FIR维纳滤波器MAfilt = dsp。FIRFilter (“分子”bw)
MAfilt = dsp。分子:[1.0001 0.3060 0.1050 0.0482 0.1360 0.0959 0.0477]InitialConditions: 0显示所有属性
yw = MAfilt(v2);使用维纳滤波器估计xEw = x - yw;%实际正弦的估计值
绘制结果图
绘制每个滤波器(维纳滤波器、LMS自适应滤波器和NLMS自适应滤波器)的降噪正弦信号,以比较各种技术的性能。
N = (1:1000)';Plot (n(900:end),[ew(900:end), elms(900:end),enlms(900:end)])传说(维纳滤波去噪正弦信号,...LMS去噪正弦信号,NLMS去噪正弦信号)包含(时间指数(n)) ylabel (“振幅”)
作为参考点,包括噪声信号作为虚线在图中。
持有在情节(n(900:结束),x(900:结束),凯西:”)包含(时间指数(n)) ylabel (“振幅”)举行从
比较最终系数
最后,将维纳滤波器系数与自适应滤波器系数进行比较。在自适应过程中,自适应滤波器试图收敛到维纳系数。
(bw。' WLMS 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,elms,wlms] = lms(v2,x);[ynlms,enlms,wnlms] = nlms(v2,x);
如果不重置筛选器对象,筛选器将使用前一次运行的最终状态和系数作为下一次运行的初始条件和数据集。
通过学习曲线研究收敛性
为了分析自适应滤波器的收敛性,使用学习曲线。工具箱提供了生成学习曲线的方法,但是您需要多次迭代实验才能获得重要的结果。
这个演示使用了25个噪声正弦信号的样本实现。
重置(ARfilt)重置(sin);释放(sin);N = (1:5000)';正弦。SamplesPerFrame = 5000
sin = dsp。带属性的正弦波:振幅:1频率:375相位偏移:0 ComplexOutput: false方法:“三角函数”SampleRate: 8000 SamplesPerFrame: 5000 OutputDataType: 'double'
S = sin ();Nr = 25;v = 0.8*randn(sin . samplesperframe,nr);ARfilt = dsp。IIRFilter (“分子”, 1“分母”基于“增大化现实”技术)
ARfilt = dsp。结构:'直接形式II转置'分子:1分母:[1 0.5000]InitialConditions: 0显示所有属性
v1 = ARfilt(v);X = repmat(s,1,nr) + v1;重置(MAfilt);MAfilt = dsp。FIRFilter (“分子”、马)
MAfilt = dsp。结构:'直接形式'分子:'属性'分子:[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的)
在这个图中,您可以看到LMS和NLMS自适应滤波器的计算学习曲线。
计算理论学习曲线
对于LMS和NLMS算法,工具箱中的函数可以帮助您计算理论学习曲线,以及最小均方误差(MMSE)、超额均方误差(EMSE)和系数的平均值。
MATLAB可能需要一些时间来计算曲线。代码后显示的图绘制了预测和实际的LMS曲线。
重置(lms);[mmselms,emselms,meanwlms,pmselms] = msepred(lms,v2,x,M);x = 1:M:n(end);Y1 = mmselms*ones(500,1);Y2 = emselms*ones(500,1);Y3 = pmselms;Y4 = mselms;情节(x, y₁,“米”, x, y2,“b”, x, y3,“k”日元,x,,‘g’)传说(“患者”,“EMSE”,“预测LMS学习曲线”,...“LMS学习曲线”)包含(时间指数(n)) ylabel (MSE的)