⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 saturday.m

📁 自己编写的有详细注释的lms算法。 并且调试已经通过
💻 M
字号:
clear;
x=linspace(0,1,510);
s=sin(2*pi*50*x);    %s是发射的正弦信号,幅度是50,频率是50HZ,长度为510
s1=dct(s);           %s1是s的dct变换后的结果

for j=1:50          %循环50次,求误差的平均值
    
u=awgn(s,20);       %%u是接收到的 叠加了高斯白噪声 的信号,信噪比是20dB
u=dct(u);           %对u进行dct,结果重新放入变量u中

w=zeros(100,1);

% 采用dct域LMS算法,迭代求解
for n=100:510                  
    y(n)=w'*u(n:-1:n-99)';             %y是滤波器输出的值 ,它是估计信号的dct值  
    e(n)=s1(n)-y(n);              %变量e代表输出信号dct值和输入信号的误差
    mu=1/(2*n+u(n:-1:n-99)*u(n:-1:n-99)'); %mu是更新步长,按照归一化方法取值   
    w=w+mu*u(n:-1:n-99)'*conj(e(n));        %用上一次运算的结果 对下次的抽头系数进行更新
end

y1=idct(y);                     %将lms滤波器的输出值进行idct,得到对输入信号的估计值
yy(j,:)=y1;                       %将每一次lms运算的输出结果保存在yy
ee(j,:)=abs(e).^2;                %将每一次lms运算的误差的平方结果保存在ee
end

y1=mean(yy);                        %求运算输出的平均值y1
e1=10*log10(sum(ee)./50);           %通过ee得到均方误差,并将其用分贝形式表示,使得对误差的评判时视觉效果更好

%图形表示
figure(3)
subplot(2,2,1);
plot(s);title('original signal')   %输入信号
subplot(2,2,2);
plot(u);title('dct后的原始信号')   %输入信号的dct结果
subplot(2,2,3);
plot(y1);title('extract signal')    %提取出的信号
subplot(2,2,4);
plot(y);title('提取出的dct域的信号')  %lms滤波器的输出,即估计信号的dct值  

figure(4)
plot(e1(100:510));title('mean square error')   %均方误差e1(dB)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -