声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 1918|回复: 0

[编程技巧] 关于signlms均衡的仿真

[复制链接]
发表于 2016-5-7 09:25 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
来源:matlab帮助文件
%%LeakageFactor) w + (StepSize) u*sgn(Re(e)), for sign LMS
%%(LeakageFactor) w + (StepSize) sgn(Re(u)) Re(e), for signed regressor LMS
%%(LeakageFactor) w + (StepSize) sgn(Re(u)) sgn(Re(e)), for sign-sign LM
这是三种符号LMS算法的权值迭代公式,在程序里只需要选择对应的迭代公式进行权值更新即可
程序如下:
%% SIGNLMS算法 实数基带系统仿真程序
% 功能:实数基带系统SIGNLMS均衡算法仿真-->BER\MSE指标
% 编写:李振兴
% E-Mail:lizhenxing@126.com
% Tel:
% 任何问题以及错误欢迎通过邮箱交流
%%LeakageFactor) w + (StepSize) u*sgn(Re(e)), for sign LMS
%%(LeakageFactor) w + (StepSize) sgn(Re(u)) Re(e), for signed regressor LMS
%%(LeakageFactor) w + (StepSize) sgn(Re(u)) sgn(Re(e)), for sign-sign LM
clc
clear all
close all hidden
%% 初始化参数设置(用户可根据需要修改此处参数)
nFrame = 1;                          % 仿真发送的帧数(可作为蒙特卡洛仿真次数)
nPacket = 2500;                      % 每帧的发送的数据点数
step = 0.01;                        % 学习步长
dB = 25;                             % 信噪比
e = zeros(1,nPacket);                % 瞬时计算误差
E = zeros(1,nPacket);                % 统计均方误差(为平滑用)
h = [0.18,0.3,1,0.18];               %ISI信道参数
h = h/norm(h);
nW = 25;                             % 均衡器阶数
leakfactor = 0.99;
% 注意:当帧数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
        e(i) = W'*X(:,i)-sX(i);          % LMS代价函数      
%         W = leakfactor*W - step*2*sign(e(i))*X(:,i);       % SIGNLMS迭代算法
%         W = leakfactor*W - step*2*e(i)*sign(X(:,i));  
        W = leakfactor*W - step*2*sign(e(i))*sign(X(:,i));
        E(i) = E(i)+e(i)^2;
    end
  
    % 计算误码
    rEx = W'*X;                         % 均衡后信号
%   scatterplot(rEx)                  % nFrame=1时调试用
    sDx = sign(rEx);                  % 判决信号
    sErX = sDx-sX(1:length(sDx));         % 寻找误码
    BER=length(find(sErX~=0))/length(sErX)
end
% 平滑误差
semilogy(E/nFrame)
转自:http://blog.sina.com.cn/s/blog_5def5a660100ic2g.html
回复
分享到:

使用道具 举报

您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-11-17 09:10 , Processed in 0.088651 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表