# 信道均衡

clear all;close all;clc

L=3; %信道长度

N=2000; %序列长度

delta_v=0.001;%噪声方差

W=2.9; %幅度失真量

delay=2;

hn=0.5*(1+cos(2*pi/W.*((1:L)'-delay))); %信道单位冲激响应

an=round(rand(N,1))*2-1; %双极性随机序列

sn=conv(hn,an);

vn=sqrt(delta_v)*randn(N,1);%高斯白噪声

un=sn(1:N)+vn(1:N); %观测信号

TT=200; %独立实验次数

M1=5; M=2*M1+1;%滤波器阶数

MSE_nlms=zeros(N-M+1,1);

MSE_sign=zeros(N-M+1,1);

MSE_blms=zeros(N,1);

for ii=1:TT

vn=sqrt(delta_v)*randn(N,1);%高斯白噪声

un=sn(1:N)+vn(1:N); %观测信号

%%%%%%%%NLMS%%%%%%%

mu=1.1;fai=0.1;

wn_nlms=zeros(M,1);wn_nlms(M1+1)=1;%初始滤波器系数

for jj=M:N

un_nlms=un(jj:-1:jj-M+1);%观测向量

dn_nlms=an(jj-delay-M1);%期望信号

yn_nlms=wn_nlms'*un_nlms;

en_nlms=dn_nlms-yn_nlms;

step=mu/(un_nlms'*un_nlms+fai);%步长

wn_nlms=wn_nlms+step*conj(en_nlms)*un_nlms;%更新权

MSE_nlms(jj-M+1)=MSE_nlms(jj-M+1)+conj(en_nlms)*en_nlms;

end

%%%%%%%%符号LMS%%%%%%%%

step=0.02;%0.01

wn_sign=zeros(M,1); wn_sign(M1+1)=1;%初始权向量

for jj=M:N

un_sign=un(jj:-1:jj-M+1);%观测向量

dn_sign=an(jj-delay-M1);%期望信号

%%%%LMS迭代过程%%%%

yn_sign=wn_sign'*un_sign; %n时刻的估计

en_sign=dn_sign-yn_sign; %n时刻的估计误差

wn_sign=wn_sign+step*sign(un_sign)*conj(en_sign);%更新权

MSE_sign(jj-M+1)=MSE_sign(jj-M+1)+conj(en_sign)*en_sign;

end

%%%%%%%%BLMS%%%%%%%%

step=0.26;%0.26

L=M+4; %数据块长度

KK=floor(N/L);%数据块个数

wk_blms=zeros(M,1);wk_blms(M1+1)=1;%初始权向量

for ii1=0:KK-1

delta_blms=zeros(M,1); %负梯度

if (ii1*L)

continue

end

for ii2=0:L-1

un_blms=un(ii1*L+ii2:-1:ii1*L+ii2-M+1);

dn_blms=an(ii1*L+ii2-M1-delay);

yn_blms=wk_blms'*un_blms;

en_blms=dn_blms-yn_blms;

delta_blms=delta_blms+conj(en_blms)*un_blms;

MSE_blms(ii1*L+ii2)=MSE_blms(ii1*L+ii2)+conj(en_blms)*en_blms;

end

wk_blms=wk_blms+step*delta_blms/L;

end

end

yyn_sign=zeros(50,1);

yyn_nlms=zeros(50,1);

for jj=1:50

yyn_nlms(jj)=wn_nlms'*un(jj+M-1:-1:jj);

yyn_sign(jj)=wn_sign'*un(jj+M-1:-1:jj);

end

figure(1)

subplot(211)

MSE_nlms=MSE_nlms/TT;

semilogy(MSE_nlms)

title(sprintf('NLMS--幅度失真量W=%2.3f',W))

subplot(212)

MSE_sign=MSE_sign/TT;

semilogy(MSE_sign)

title(sprintf('符号LMS--幅度失真量W=%2.3f',W))

figure

MSE_blms=MSE_blms/TT;

semilogy(MSE_blms)

axis([0 2000 10^(-4) 10])

title(sprintf('BLMS--M=%d L=%d W=%2.3f',M,L,W))