%% LMS自适应滤波算法
% 由于射频前端低噪放、滤波等电路的不一致性,导致相同的接收信号通过接收通道后,
% 信号幅度和相位并不相同。为此,需要对通道的幅相误差进行校正。
clc;
close all;
clear all;
%% 参数设置
fc=10e6; % 信号频率
fs=10*fc; % 采样频率
count=1024; % 采样点数
SNR=5; % 信噪比
t=0:1/fs:(count-1)/fs;
% LMS算法相关参数
Num_iteration=count; % 迭代次数
%% 通道信号
%----第一种信号
dn = sqrt(10^(SNR/10))*exp(1j*2*pi*fc*t);% 期望信号
noise = 1/sqrt(2).*randn(1,count)+1j*1/sqrt(2).*randn(1,count); % 高斯白噪声
% un = dn+noise; % 输入信号
un = 1.5*dn*exp(1j*80/180*pi); % 输入信号
%% LMS算法
% 求收敛常数
lamda_max = max(eig(un*un.'));%求解输入xn的自相关矩阵的最大特征值,A = eig(B),意为将矩阵B的特征值组成向量A
mu1 = 2*(1/lamda_max);
mu =1e-3;
%% LMS算法
w=zeros(1,Num_iteration);
for p = 1:Num_iteration % 保证输入延时后的信号有效,所以实际的迭代次数只有(Num_iteration-M)次,
yn(p) = w(p)'*un(p); % 滤波器的输出信号 式(4.4.6)
en(p) = dn(p)-yn(p); % 误差信号 式(4.4.7)
w(p+1) = w(p)+mu*un(p)*conj(en(p));% 滤波器权向量的更新方程 式(4.4.8) conj 共轭
end
%% 绘图
figure(1);
plot(t*1e6,real(dn));hold on;
plot(t*1e6,real(un));hold on;
xlabel('时间/us');ylabel('幅度');
legend('期望信号','输入信号');
figure(2);
subplot(211);
plot(t*1e6,real(dn),'-r');hold on;
plot(t*1e6,real(yn),'-b');hold on;
xlabel('时间/us');ylabel('幅度');
legend('期望信号','校正后的输出信号');
subplot(212);
plot(t*1e6,real(en),'-k');
xlabel('时间/us');ylabel('幅度');
title('误差');
figure(3);
plot(real(w),'-r');hold on;
plot(imag(w),'-b');hold on;
legend('迭代权值的实部','迭代权值的虚部');
|