📄 1.m
字号:
clc
clear all
M=2; %BPSK modulation
w_len=2; % 前馈抽头个数
Fd=10e6; % 信息速率
rolloff = 1; % 滚降系数
up = 4; % samples per symbol
delay = 4; % 升余弦滤波器群延迟大小
Fs=Fd*up;
data_len = 500;
data = randint(1,data_len,M);
m_data = pskmod(data,M);
[NUM1,DEN1]=rcosine(Fd,Fs,'fir/sqrt',rolloff,delay);
[t_data,tc]=rcosflt(m_data,Fd,Fs,'filter',NUM1); % 成形滤波
t_data = t_data.';
%%%%%%%%%%%%%%%%%% Two Path Channel %%%%%%%%%%%%%%%%%
chan_type=input('选择信道(1-15ms delay,2-25ms delay, 3-awgn): ');
gain=[1 1];
if chan_type == 1
t_delay=[0 ceil(1.5*up)];
r_signal= gain(1)*t_data +
gain(2)*[zeros(1,t_delay(2)),t_data(t_delay(2)+1:length(t_data))];
elseif chan_type == 2
t_delay=[0 ceil(2.5*up)];
r_signal= gain(1)*t_data +
gain(2)*[zeros(1,t_delay(2)),t_data(t_delay(2)+1:length(t_data))];
elseif chan_type == 3
r_signal = gain(1)*t_data;
end
snr = input('信噪比大小(dB):');
r_signal = awgn(r_signal, snr, 'measured');
% r_signal = awgn(t_data,10,'measured');
%%%%%%%%%%%%%%%%%%%%%% Receiver %%%%%%%%%%%%%%%%%%%%
[r_data,tr]=rcosflt(r_signal,Fd,Fs,'filter/Fs',NUM1); %匹配滤波
equlz_in=r_data(delay*2*up+1:up:length(r_data)-delay*2*up);
equalizer_type=input('选择均衡器 (1-LMS,2-RLS): ');
if equalizer_type == 1
a(1)=1; a(w_len)=0; %抽头系数初始化
register1(w_len)=0; %数据缓存初始化
rd=0;
for m=1:data_len;
[y,e,rd,register1,a,p]=lms_equalizer(equlz_in(m),a,w_len,register1,M);
equlz_out(m)=p; err(m)=e; redata(m)=y;
end
elseif equalizer_type == 2
a = zeros(w_len, 1); %抽头系数初始化
register1(w_len)=0; %数据缓存初始化
Lambda = 0.99 ; % Set the forgetting factor
Delta = 10 ; % R initialized to Delta*I
rd=0;
for m=1:data_len;
[y,e,rd,register1,R,a,p]=rls_equalizer(equlz_in(m),a,w_len,register1,R,Lambda,M);
equlz_out(m)=p; err(m)=e; redata(m)=y;
end
end
figure;
% plot(10*log10(abs(err).^2));
plot(abs(err));
grid on;
xlabel('symbols');
ylabel('error');
title('qualization');
自适应线性LMS均衡器:
function[y,e,rd,register1,ao,p]=lms_equalizer(x,ai,f_lenth,register1,mindex)
%%% y表示均衡并解调后的输出序列
%%% e表示输出的均方误差
%%% rd表示判决后的复数据
%%% register1为输入数据的缓冲区
%%% ai表示输出前馈滤波器系数
%%% ao表示输出反馈滤波器系数
%%% p表示均衡后输出的复数据
%%% x表示均衡器的输入
%%% f_lenth表示前馈抽头的个数
%%% mindex表示QAM调制的阶数
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
for mm=f_lenth:-1:2 %数据缓冲
register1(mm)=register1(mm-1);
end
register1(1)=x;
p=ai*register1.';
if mindex==2;
mu1=0.008; %前馈滤波器的步长
y=pskdemod(p,mindex);
rd=pskmod(y,mindex);
e=rd-p;
else if mindex==64
mu1=0.00005;
elseif mindex==16;
mu1=0.0005
elseif mindex==4;
mu1=0.005;
end
y=qamdemod(p,mindex);
rd=qammod(y,mindex);
end
e=rd-p;
for ll=1:f_lenth;
ao(ll)=ai(ll)+mu1*e*conj(register1(ll));
end
自适应线性RLS均衡器程序:
function[y,e,rd,register1,Ro,ao,p]=rls_equalizer(x,ai,f_lenth,register1,Ri,Lambda,mindex)
%%% y表示均衡并解调后的输出序列
%%% e表示输出的均方误差
%%% rd表示判决后的复数据
%%% ai表示输出前馈滤波器系数
%%% ao表示输出反馈滤波器系数
%%% Ri表示输入相关矩阵
%%% Ro表示输出相关矩阵
%%% p表示均衡后输出的复数据
%%% x表示均衡器的输入
%%% f_lenth表示前馈抽头的个数
%%% Lambda表示遗忘系数
%%% mindex表示QAM调制的阶数
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
for mm=f_lenth:-1:2 %数据缓冲
register1(mm)=register1(mm-1);
end
register1(1)=x;
u=register1.';
phi = u' * Ri ; % 互相关矩阵
k = phi'/(Lambda + phi * u );
p=ai' * u;
if mindex==2;
y=pskdemod(p,mindex);
rd=pskmod(y,mindex);
else
y=qamdemod(p,mindex);
rd=qammod(y,mindex);
end
e = rd - p ;
ao = ai + k * conj(e) ;
Ro = ( Ri - k * phi ) / Lambda ;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -