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

📄 1.m

📁 lms/rls的自适应均衡算法仿真源代码,两个函数打包
💻 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 + -