LMS算法步骤:
1,、设置变量和参量:
X(n)为输入向量,悔谈或称为训练样本
W(n)为权值向量
e(n)为偏差
d(n)为期望输出
y(n)为实际输出
η为学习速率
n为迭代次数
2、初始化,赋给w(0)各一个较小的随机非零值,令n=0
3、对于一组输入样本x(n)和对应的期望输出d,计算
e(n)=d(n)-X(n)
W(n+1)=W(n)+ηX(n)e(n)
4、判断是否满足条件,若满足算法结束,若否烂大n增加1,饥前竖转入第3步继续执行。
先对t离散化,然后FFT,再画个幅频和相频就可以了。不过貌似你这个式子有点问题,randn产生1*1024的高斯噪声已经指定了s的维数了,所以t必须去1024个离散值,限定启戚了t的取值了。
你可以参考下面的程序,建议你看懂之后自己编一下。
这是对sin(x)求幅频相频
%用fft求幅频相频
clc%清空
clearall%清除所有变量
closeall%关闭所有窗口
A=10%振幅
fw=50%固有频率
phi=pi/3%相位
step=1000
t=0:1/step:10*pi%时间t
y=A*sin(2*pi*fw*t+phi)%正弦函数y
f=step*(0:256)/512%频率
subplot(3,1,1)%三行一列第一派腊幅图
plot(t,y)%绘制图形
xlabel('t/s','fontsize',13)%横坐标显示t/s,字号13
ylabel('y','fontsize',13)%纵坐标显示y,字号13
title('正弦函数曲线','fontsize',13)%显示标题
Y=fft(y,512)%对y进行傅里叶变换
subplot(3,1,2)%三行一列第二幅图
plot(f,abs(Y(1:257)))%绘制图形
xlabel('f/Hz','fontsize',13)%横坐标显示f/Hz,字号13
ylabel('幅值','fontsize',13)%纵坐标显示幅值,字号13
title('幅频特性曲线','fontsize',13)%显示标题
[value,index]=max(abs(Y))%将abs(Y)最大值点的横坐标、纵坐标分别赋给
value和index
text(f(index),value,sprintf('maxpiont=(%f,%f)',f(index),value),'fonts
ize',13)%显示最大值点坐标
subplot(3,1,3)%三行一列第三尘旁滑幅图
plot(f,angle(Y(1:257))*180/pi)%绘制图形
xlabel('f/Hz','fontsize',13)%横坐标显示f/Hz,字号13
ylabel('相位/°','fontsize',13)%纵坐标显示相位/°,字号13
title('相位特性曲线','fontsize',13)%显示标题
自适应过程一般采用典型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=0i<=30i++)
{for(j=0j<=n-1j++)
{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-1j++)
{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=0j<=n-1j++)
{inf_conj[j]=conjf(inf[j])} ��
cvecvmlt(E,inf_conj,Ein,n)
ifft(Ein,t,Ein,wfft,wst,n)
for(j=0j<=N-1j++)
{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%以上,如果滤波器的阶数更大,则速度会提高更多。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)