加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

判决反馈LMS均衡仿真

(2010-04-27 18:13:46)
标签:

杂谈

分类: 学术讨论
应网友要求,现在上传DFE-LMS均衡算法仿真程序,参考Matlab 2007b 帮助文档,其DFE-LMS均衡器结构原理如下图:
http://s11/middle/5def5a66hd3413c4b20ca&690

采用10次蒙特卡洛仿真绘制结果,如果想获得更平滑结果,可适当调整nFrame,我将DFE-LMS和横向滤波器LMS
均衡做在了一起比较,如有问题,请留言!
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% DFE-LMS算法 实数基带系统仿真程序
% 功能:实数基带系统判决反馈LMS均衡算法仿真-->BER\MSE指标
% 编写:李振兴
% E-Mail:lizhenxing@126.com
% Tel:
% 任何问题以及错误欢迎通过邮箱交流
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
clc
clear all
close all hidden
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% 初始化参数设置(用户可根据需要修改此处参数)
nFrame = 10;                          % 仿真发送的帧数(可作为蒙特卡洛仿真次数)
nPacket = 2500;                      % 每帧的发送的数据点数
stepa = 0.01;                        % 学习步长
stepb = 0.1;
dB = 25;                             % 信噪比
e = zeros(1,nPacket);                % 瞬时计算误差
E = zeros(1,nPacket);                % 统计均方误差(为平滑用)
h = [0.18,0.3,1,0.18];               %ISI信道参数
h = h/norm(h);
nW = 11;                        % 横向均衡器阶数
nB = 2;                         % 反馈层阶数
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 注意:当帧数nFrame不等于1的时候不要绘制星座图!
% nFrame根据需要可以适当设置,只要使得MSE曲线足够平滑就可以
% 均衡器阶数对结果影响较大,这里给出的是经过实验的最佳阶数
% 学习步长不宜设置过大
%% 算法实现过程
LP = nPacket-nW;                 % 移掉几个数据避免负或零下标
X = zeros(nW+1,LP);              % 组织均衡器输入矩阵
Y = zeros(nB+1,LP);
y = zeros(1,nPacket);
z = zeros(1,nPacket);

% 循环开始(迭代次数=nFrame*nPacket)
for kk = 1:nFrame       % 此处修改蒙特卡洛次数
    W = zeros(nW+1,1);
    B = zeros(nB+1,1);
    sX = round(rand(1,nPacket))*2-1; % BPSK 或 2PAM 信号
    scatterplot(sX);               % nFrame=1时调试用
    rX = filter(h,1,sX);             % 通过信道
    scatterplot(rX);               % nFrame=1时调试用
    vn = randn(1,nPacket);           % 产生噪声数据
    vn = vn/norm(vn)*10^(-dB/20)*norm(rX);  % 根据信噪比调整噪声功率
    SNR = 20*log10(norm(rX)/norm(vn));      % 计算SNR
    rX = rX+vn;                             % 接收信号
    XX = sign(rX);
   [num,rate] = symerr(XX,sX)               % 计算均衡前的误码
    scatterplot(rX);                      % nFrame=1时调试用
    for i=1:LP
         X(:,i)=rX(i+nW:-1:i).';
    end
    for i = 1:LP
        Y(:,i) = y(i+nB:-1:i);
    end
    % 开始均衡器参数调整
    for i = 1:LP
        if i < nB+1
            y(i) = W'*X(:,i);
            for j = 1:LP
            Y(:,i) = sign(y(i+nB:-1:i));
            end   
            temp = B'*Y(:,i);
        else
            y(i) = W'*X(:,i)+temp;
            Y(:,i) = sign(y(i:-1:i-nB));
            temp = B'*Y(:,i);              
        end
        z(i) = W'*X(:,i)+temp;
        e(i) = z(i)-sX(i);          % LMS代价函数
        W = W - stepa*2*e(i)*X(:,i);       % LMS迭代算法
        B = B - stepb*2*e(i)*Y(:,i);
        E(i) = E(i)+e(i)^2;    
end
end
save E;
clc
clear all
close all
 %% 初始化参数设置(用户可根据需要修改此处参数)
nFrame = 10;                          % 仿真发送的帧数(可作为蒙特卡洛仿真次数)
nPacket = 2500;                      % 每帧的发送的数据点数
step = 0.01;                        % 学习步长
dB = 25;                             % 信噪比
e1 = zeros(1,nPacket);                % 瞬时计算误差
E1 = zeros(1,nPacket);                % 统计均方误差(为平滑用)
h = [0.18,0.3,1,0.18];               %ISI信道参数
h = h/norm(h);
nW = 11;                        % 均衡器阶数
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 注意:当帧数nFrame不等于1的时候不要绘制星座图!
% nFrame根据需要可以适当设置,只要使得MSE曲线足够平滑就可以
% 均衡器阶数对结果影响较大,这里给出的是经过实验的最佳阶数
% 学习步长不宜设置过大
%% 算法实现过程
LP = nPacket-nW;                 % 移掉几个数据避免负或零下标
X = zeros(nW+1,LP);              % 组织均衡器输入矩阵

% 循环开始(迭代次数=nFrame*nPacket)
for kk = 1:nFrame       % 此处修改蒙特卡洛次数
    W = zeros(nW+1,1);
    sX = round(rand(1,nPacket))*2-1; % BPSK 或 2PAM 信号
    scatterplot(sX);               % nFrame=1时调试用
    rX = filter(h,1,sX);             % 通过信道
    scatterplot(rX);               % nFrame=1时调试用
    vn = randn(1,nPacket);           % 产生噪声数据
    vn = vn/norm(vn)*10^(-dB/20)*norm(rX);  % 根据信噪比调整噪声功率
    SNR = 20*log10(norm(rX)/norm(vn));      % 计算SNR
    rX = rX+vn;                             % 接收信号
    XX = sign(rX);
   [num,rate] = symerr(XX,sX)               % 计算均衡前的误码
    scatterplot(rX);                      % nFrame=1时调试用
    for i=1:LP
         X(:,i)=rX(i+nW:-1:i).';
    end
    % 开始均衡器参数调整
    for i = 1:LP
        e1(i) = W'*X(:,i)-sX(i);          % LMS代价函数
        W = W - step*2*e1(i)*X(:,i);       % LMS迭代算法
        E1(i) = E1(i)+e1(i)^2;
    end    
end
  % 平滑误差  
  load E.mat;
 semilogy(E/nFrame,'r')
 hold on
 semilogy(E1/nFrame,'k')
 hold off
 legend('DFE','LMS');

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有