当前位置:首页 > 代码 > 正文

lms算法代码(lms 算法)

admin 发布:2022-12-19 22:11 189


本篇文章给大家谈谈lms算法代码,以及lms 算法对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

变步长LMS自适应滤波算法的MATLAB程序

clear all

close all

N=10; %滤波器阶数

sample_N=500; %采样点数

A=1; %信号幅度

snr=10; %信噪比

t=1:sample_N;

length_t=100; %期望信号序列长度

d=A*sin(2*pi*t/length_t); %期望信号

M=length(d); %M为接收数据长度

x=awgn(d,snr); %经过信道(加噪声)

delta=1/(10*N*(A^2)); %计算能够使LMS算法收敛的delta

y=zeros(1,M);

h=zeros(1,N); %LMS滤波器系数

h_normalized=zeros(1,N); %归一化LMS滤波器系数

y1=zeros(1,N);

for n=N:M %系数调整LMS算法

x1=x(n:-1:n-N+1);

%LMS算法

y(n)=h*x1';

e(n)=d(n)-y(n);

h=h+delta*e(n)*x1;

%NLMS算法

y_normalized(n)=h_normalized*x1';

e_normalized(n)=d(n)-y_normalized(n);

h_normalized=h_normalized+e_normalized(n)*x1/(x1*x1');

end

error=e.^2; %LMS算法每一步迭代的均方误差

error_normalized=e_normalized.^2; %NLMS算法每一步迭代的均方误差

for n=N:M %利用求解得到的h,与输入信号x做卷积,得到滤波后结果

x2=x(n:-1:n-N+1);

y1(n)=h*x2';

y2(n)=h_normalized*x2';

end

subplot(411)

plot(t,d);

axis([1,sample_N,-2,2]);

subplot(412)

plot(t,x);

subplot(413)

plot(t,y);

subplot(414)

plot(t,y_normalized);

figure(2)

plot(t,error,'r',t,error_normalized,'b');

matlab关于LMS算法的程序

调试信息说的很明确了,xn的下标越界

第一个循环中 xn=xn(5:1) %xn是一个1*5的double阵(或者叫行向量)

第二次循环时 k=6, M=5 xn=xn(6:-1:2) %注意此时xn下标取值为1~5

因此在解释执行xn=xn(6)时机器不知怎么办,于是就出错了……

急求:自适应滤波器LMS算法代码

自适应过程一般采用典型LMS自适应算法,但当滤波器的输入信号为有色随机过程时,特别是当输入信号为高度相关时,这种算法收敛速度要下降许多,这主要是因为输入信号的自相关矩阵特征值的分散程度加剧将导致算法收敛性能的恶化和稳态误差的增大。此时若采用变换域算法可以增加算法收敛速度。变换域算法的基本思想是:先对输入信号进行一次正交变换以去除或衰减其相关性,然后将变换后的信号加到自适应滤波器以实现滤波处理,从而改善相关矩阵的条件数。因为离散傅立叶变换�DFT 本身具有近似正交性,加之有FFT快速算法,故频域分块LMS�FBLMS 算法被广泛应用。

FBLMS算法本质上是以频域来实现时域分块LMS算法的,即将时域数据分组构成N个点的数据块,且在每块上滤波权系数保持不变。其原理框图如图2所示。FBLMS算法在频域内可以用数字信号处理中的重叠保留法来实现,其计算量比时域法大为减少,也可以用重叠相加法来计算,但这种算法比重叠保留法需要较大的计算量。块数据的任何重叠比例都是可行的,但以50%的重叠计算效率为最高。对FBLMS算法和典型LMS算法的运算量做了比较,并从理论上讨论了两个算法中乘法部分的运算量。本文从实际工程出发,详细分析了两个算法中乘法和加法的总运算量,其结果为:

复杂度之比=FBLMS实数乘加次数/LMS实数乘加次数=(25Nlog2N+2N-4)/[2N(2N-1)]�

采用ADSP的C语言来实现FBLMS算法的程序如下:

for(i=0;i<=30;i++)

{for(j=0;j<=n-1;j++)

{in[j]=input[i×N+j;]

rfft(in,tin,nf,wfft,wst,n);

rfft(w,tw,wf,wfft,wst,n);

cvecvmlt(inf,wf,inw,n);

ifft(inw,t,O,wfft,wst,n);

for(j=0,j<=N-1;j++)

{y[i×N+j]=O[N+j].re;

e[i×N+j]=refere[i×N+j]-y[i×N+j];

temp[N+j]=e[i×N+j;}

rfft(temp,t,E,wfft,wst,n);

for(j=0;j<=n-1;j++)

{inf_conj[j]=conjf(inf[j]);} ��

cvecvmlt(E,inf_conj,Ein,n);

ifft(Ein,t,Ein,wfft,wst,n);

for(j=0;j<=N-1;j++)

{OO[j]=Ein[j].re;

w[j]=w[j]+2*u*OO[j];}��

}

在EZ-KIT测试板中,笔者用汇编语言和C语言程序分别测试了典型LMS算法的运行速度,并与FBLMS算法的C语言运行速度进行了比较,表2所列是其比较结果,从表2可以看出滤波器阶数为64时,即使是用C语言编写的FBLMS算法也比用汇编编写的LMS算法速度快20%以上,如果滤波器的阶数更大,则速度会提高更多。

MATLAB实现LMS学习算法

clc;

clear all;

load msesample;

n1=length(x1);

n2=length(x2);

x=[x1;x2];

e=ones(length(x),1);

y=[e x];

b=e;

%b=rand(length(x),1);

yita=1;

eps=0.01;

yy=inv(y'*y)*y';

result=yy*b;

for i=n2:length(x)

y(i,:)=y(i,:).*(-1);

end

a=[1;2;1];

an=zeros(3,100);

an(:,1)=a;

flat=zeros(length(x),1);

n=1;

while(n=100)

for i=1:length(x)

if y(i,:)*an(:,n)=b(i)

an(:,(n+1))=an(:,n)+y(i,:)'*(b(i)-y(i,:)*an(:,n))*yita/n;

end

end

if abs(an(:,(n+1))-an(:,n))=eps

break;

else

n=n+1;

end

end

n

w=an(:,n)

ne=0;

for i=1:length(x)

if y(i,:)*wb(i)

ne=ne+1;

end

end

ne

pe=ne/length(x)

subplot(1,2,1)

plot(x1(:,1),x1(:,2),'bo',x2(:,1),x2(:,2),'ro');

hold on

syms xa xb;

g=w(1)+w(2)*xa+w(3)*xb;

ezplot(g);

title('最小均方误差判决')

legend('第一类样本','第二类样本')

gtext(strcat('错误率为:',num2str(pe)),'Fontsize',8)

subplot(1,2,2)

hold on

i=1:n;

plot(i,an(:,i));

title('权向量')

xlabel('迭代次数')

ylabel('权向量取值')

关于lms算法代码和lms 算法的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

版权说明:如非注明,本站文章均为 AH站长 原创,转载请注明出处和附带本文链接;

本文地址:http://ahzz.com.cn/post/26920.html


取消回复欢迎 发表评论:

分享到

温馨提示

下载成功了么?或者链接失效了?

联系我们反馈

立即下载