详解matlab均衡算法equalize()

在matlab中,有一个常用的均衡器对象来均衡基带信号,它就是equalize()。

先来上一个例子看看具体的功效呗;

源码1:

clc
close all
clear
% Set up parameters.
M = 16; % Alphabet size for modulation
sigconst = step(comm.RectangularQAMModulator(M),(0:M-1)');
                                    % Signal constellation for 16-QAM
chan = [1 0.45 0.3+0.2i]; % Channel coefficients
hMod = comm.RectangularQAMModulator(M); % QAMModulator System object

% Set up equalizers.
eqrls = lineareq(6, rls(0.99,0.1)); % Create an RLS equalizer object.
eqrls.SigConst = sigconst'; % Set signal constellation.
eqrls.ResetBeforeFiltering = 0; % Maintain continuity between iterations.
eqlms = lineareq(6, lms(0.003)); % Create an LMS equalizer object.
eqlms.SigConst = sigconst'; % Set signal constellation.
eqlms.ResetBeforeFiltering = 0; % Maintain continuity between iterations.
eq_current = eqrls; % Point to RLS for first iteration.
% Main loop
for jj = 1:4
   msg = randi([0 M-1],500,1); % Random message
   modmsg = step(hMod,msg); % Modulate using 16-QAM.

   % Set up training sequence for first iteration.
   if jj == 1
      ltr = 200; trainsig = modmsg(1:ltr);
   else
      % Use decision-directed mode after first iteration.
      ltr = 0; trainsig = [];
   end

   % Introduce channel distortion.
   filtmsg = filter(chan,1,modmsg);

   % Equalize the received signal.
   s = equalize(eq_current,filtmsg,trainsig);

   % Plot signals.
   h = scatterplot(filtmsg(ltr+1:end),1,0,'bx'); hold on;
   scatterplot(s(ltr+1:end),1,0,'g.',h);
   scatterplot(sigconst,1,0,'k*',h);
   legend('Received signal','Equalized signal','Signal constellation');
   title(['Iteration #' num2str(jj) ' (' eq_current.AlgType ')']);
   hold off;

   % Switch from RLS to LMS after second iteration.
   if jj == 2
      eqlms.WeightInputs = eq_current.WeightInputs; % Copy final inputs.
      eqlms.Weights = eq_current.Weights; % Copy final weights.
      eq_current = eqlms; % Make eq_current point to eqlms.
   end
end

结果如下图,这是对一个干扰较为严重的基带信号,经LMS均衡后,有极佳的效果。

来吧,刨析一波这个equalize()方法。

以下是matlab2018a中help的解释:

首先,它的使用语法有:

y = equalize(eqobj,x)
y = equalize(eqobj,x,trainsig)
[y,yd] = equalize(...)
[y,yd,e] = equalize(...)

equalize方法用均衡器对象eqobj处理基带信号矢量x,并返回均衡的信号矢量y 。

在进程结束时,eqobj包含更新的状态信息,如均衡器权重值和输入缓冲值。若要构造eqobj,请使用lineareq或dfe函数,如自适应算法中所述。

比如可以这样写:

eq_signal = equalize(lineareq(8, rls(0.99, 1e-2)),baseband_signal, training_signal);

其中上述training_signal是发送端为被干扰的信号,baseband_signal是接收端已被信道干扰,需要被均衡的信号。

均衡器函数假定信号x是按每个符号的nsamp采样进行采样的,其中nsamp是eqobj的nSampPerSym属性的值。对于CMA以外的自适应算法,均衡器使用由eqobj的SigConst属性指定的检测器在判决定向模式下进行自适应。均衡器的延迟为(eqobj.RefTap-1)/eqobj.nSampPerSym,如“来自均衡的延迟”中所述。

请注意,(eqobj.RefTap-1)必须是nSampPerSym的整数倍。对于分数间隔均衡器,抽头在符号周期的分数处间隔。参考抽头属于训练符号,因此必须与所有符号(即每个符号采样的整数)重合。RefTap=1对应于第一个符号,eqobj.RefTap=nSampPerSym+1对应于第二个符号,依此类推。因此(eqobj.RefTap-1)必须是nSampPerSym的整数倍。

如果eqobj.ResetBeforeFilting为0,则Equize在启动均衡操作时使用eqobj中的现有状态信息。因此,equize(eqobj,[x1 x2])等价于[equize(eqobj,x1)equize(eqobj,x2)]。若要手动重置eqobj,请将重置功能应用于eqobj。

如果eqobj.ResetBeforeFilting为1,则在开始均衡操作之前,均衡重置eqobj,覆盖eqobj中以前的任何状态信息。

Y=equalize(eqobj,x,traing)最初使用训练序列来调整均衡器。在对训练序列进行处理后,均衡器在判决引导模式下自适应。traing的向量长度必须小于或等于长度(X)-(eqobj.RefTap-1)/eqobj.nSampPerSym。

[Y,yd]=equalize(...)返回检测到的数据符号的矢量yd。

[Y,yd,e]=equalize(...)返回错误计算中描述的错误计算的结果。对于CMA以外的自适应算法,e是y和参考信号之间的误差矢量,其中参考信号由训练序列或检测到的符号组成。

猜你喜欢

转载自blog.csdn.net/lanluyug/article/details/86545210