在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和参考信号之间的误差矢量,其中参考信号由训练序列或检测到的符号组成。