# T/2 -spaced FSE MMSE equalizer, with carrier offset

Started by June 5, 2006
```Hi, here

I am now doing a project about T/2 -spaced FSE MMSE equalizer based on
the stochastic gradient algorithm. I use training symbol method to
update the coefficient.

It seems working well in some channel distortion enviroment. However,
when carrier offset exists, i.e. (the constellation of QAM rotates),
this algorithm doesn't converge, even I force the update coefficient
steps very small.

Is the equalizer with this algorithm capable of comensating for the
carrier frequency offset. I searched some papers, and find someone
prefer to the CMA (constant modulus algorithm) method if carrier offset
exists.

The following is my matlab codes for adaptive equalizer, with
stochastic gradient algorithm. It doesn't converge when there is
carrier offset. Any idea?

% Ak,  we assume a known symbol sequence
% xn, a comples signal, modulated by QAM
% beta, coefficient update steps
% c, coeffiecient for equalizer

%      Carrier offset model
xn = xn.*exp(j*2*pi*delta_f*(0:length(xn)-1) );

%       Equalizer

beta = 0.0005;                        % step-size of the algorithm
eq_len = 33;                           % length of equalizer

c = zeros(eq_len,1);                % equalizer coefficients,
initializations
c((eq_len+1)/2) = 1;                 % the middle componet is 1

equalizer_in = xn(1: T*Fs/2 : end);                                 %
T/2 spaced input equlizer

for i = (eq_len+1)/2 : length(equalizer_in)-(eq_len-1)/2
rk = flipud(equalizer_in(i-(eq_len-1)/2:i+(eq_len-1)/2).'); %
Ek(i) = Ak(i) - c.'*rk;
% Error signal
c = c + beta.*Ek(i).*conj(rk);
eq_out(i-(eq_len-1)/2)=c.'*rk;
end

```
```jia wrote:
> Hi, here
>
> I am now doing a project about T/2 -spaced FSE MMSE equalizer based on
> the stochastic gradient algorithm. I use training symbol method to
> update the coefficient.
>
> It seems working well in some channel distortion enviroment. However,
> when carrier offset exists, i.e. (the constellation of QAM rotates),
> this algorithm doesn't converge, even I force the update coefficient
> steps very small.

Of course it doesn't converge. You are trying to train against a moving
target. You need to despin the constellation before you feed the data to
an equalizer of that type.

> Is the equalizer with this algorithm capable of comensating for the
> carrier frequency offset. I searched some papers, and find someone
> prefer to the CMA (constant modulus algorithm) method if carrier offset
> exists.

CMA is usually used in blind equalizers. It converges more slowly than
LMS, so it won't usually work with formal training sequences - they
aren't long enough. Although you can use CMA to train the equalizer
before you despin the constellation, you would normally need to despin
before you can start decoding the bit stream.

> The following is my matlab codes for adaptive equalizer, with
> stochastic gradient algorithm. It doesn't converge when there is
> carrier offset. Any idea?

If the constellation spins rather slowly, and the equalizer adapts
fairly quickly, you can actually track the constellation's spinning in
the equalizer, and be able to decode the data. This is a *really* nasty
botch, though, and you can't expect to demodulate high order QAM this
way. You can kinda decode 16-QAM at high SNR - interesting for
experimenting, but not much use in a system.

Steve
```
```Hi, Steve:

> If the constellation spins rather slowly, and the equalizer adapts
> fairly quickly, you can actually track the constellation's spinning in
> the equalizer, and be able to decode the data.

you mean the if the frequency offset is really small, and the equalizer
coefficient updates a little bigger. the equqlizer may track the
constellation's spinning?

> This is a *really* nasty botch, though, and you can't expect to demodulate
> high order QAM this way. You can kinda decode 16-QAM at high SNR - interesting for
> experimenting, but not much use in a system.

I rewrite the program in a noiseless channel, with 16-QAM modulation.
However, the equalizer also doesn't work. ^_^ , The |error] seems to be
increase to the time.

------------------------------------------------------

clear all
clc

% % % % % % % % % % % % % % % % % % % % % % % %
%       Parameters Initialization
% % % % % % % % % % % % % % % % % % % % % % % %
Fs = 8;                                % Sampling frequency 8Hz
Ts = 1/Fs;                            % Sampling interval [s]
T = 1;                                   % Symbol time interval [s]
Taps = 2^9;                           % Taps of RC shaping filter
alpha = 0.5;                           % Roll-off factor
num_bits = 1500;                    % Number of information bits

delta_f = 0.00000001;              % Carrier frequency offset

% % % % % % % % % % % % % % % % % % % % % % % %
% 16-QAM modulation
% % % % % % % % % % % % % % % % % % % % % % % %

M = 4;                      % M^2-QAM
temp_M = -(M-1):2:(M-1);    % Generate QAM Alphabet, one possibility
for i=1:M
for k = 1:M
QAM(i,k) = temp_M(i) + j*temp_M(k);
end
end
QAM = QAM(:).';             % Alphabet vector
index = randint(1,num_bits,[1 M^2]);
sym = QAM(index);           % Random QAM symbol sequence

% % % % % % % % % % % % % % % % % % % % % % % %
% Discrete Time Overall Puse-Shaping Filter p
% % % % % % % % % % % % % % % % % % % % % % % %

t = -Ts*Taps/2: Ts : Ts*(Taps/2-1);         % Time vector (sampling
intervals)
t = t+0.00000001;                           % Otherwise, the
denominator would be zero at t=0
p = sinc(t/T).*(cos(alpha*pi*t/T)./(1-(2*alpha*t/T).^2));
% Raised-Cosine FIR filter

% % % % % % % % % % % % % % % % % % % % % % % %
% Using the Designed Pulse-Shaping Filter
% % % % % % % % % % % % % % % % % % % % % % % %
N = length(sym);                            % Number of symbols
r = Fs*T;                                        % Oversampling factor
sym_over(1: r : r*N) = sym;
xn = filter(p,1,sym_over);                  % Pulse Shaping filtering
xn = xn(Taps/2+1:end);                      % delete filter delay
Ak = xn(1: T*Fs/2 : end);                   % Ak for T/2-spaced
Equalizer

% % % % % % % % % % % % % % % % % % % % % % % %
% Carrier offset model
% % % % % % % % % % % % % % % % % % % % % % % %

xn = xn.*exp(j*2*pi*delta_f*(0:length(xn)-1) );
scatterplot(xn(1: T*Fs : end))

% % % % % % % % % % % % % % % % % % % % % % % %
%       Equalizer
% % % % % % % % % % % % % % % % % % % % % % % %

beta = 0.001;            % step-size of the algorithm
eq_len = 33;            % length of equalizer
c = zeros(eq_len,1); % equalizer coefficients, initializations
c((eq_len+1)/2) = 1;

equalizer_in = xn(1: T*Fs/2 : end);     % T/2 spaced input equlizer

for i = (eq_len+1)/2 : length(equalizer_in)-(eq_len-1)/2
rk = flipud(equalizer_in(i-(eq_len-1)/2:i+(eq_len-1)/2).'); %
Ek(i) = Ak(i) - c.'*rk;              % Error signal, we assume a
known symbol sequence
c = c + beta.*Ek(i).*conj(rk);
end

figure; plot(abs(Ek).^2); % Convergence behaviour of the LMS-algorithm.

```
```"Steve Underwood" <steveu@dis.org> wrote in message
news:e62vni\$gut\$1@home.itg.ti.com...
> jia wrote:
> > Hi, here
> >
> > I am now doing a project about T/2 -spaced FSE MMSE equalizer based on
> > the stochastic gradient algorithm. I use training symbol method to
> > update the coefficient.
> >
> > It seems working well in some channel distortion enviroment. However,
> > when carrier offset exists, i.e. (the constellation of QAM rotates),
> > this algorithm doesn't converge, even I force the update coefficient
> > steps very small.
>
> Of course it doesn't converge. You are trying to train against a moving
> target. You need to despin the constellation before you feed the data to
> an equalizer of that type.
>
> > Is the equalizer with this algorithm capable of comensating for the
> > carrier frequency offset. I searched some papers, and find someone
> > prefer to the CMA (constant modulus algorithm) method if carrier offset
> > exists.
>
> CMA is usually used in blind equalizers. It converges more slowly than
> LMS, so it won't usually work with formal training sequences - they
> aren't long enough. Although you can use CMA to train the equalizer
> before you despin the constellation, you would normally need to despin
> before you can start decoding the bit stream.
>
> > The following is my matlab codes for adaptive equalizer, with
> > stochastic gradient algorithm. It doesn't converge when there is
> > carrier offset. Any idea?
>
> If the constellation spins rather slowly, and the equalizer adapts
> fairly quickly, you can actually track the constellation's spinning in
> the equalizer, and be able to decode the data. This is a *really* nasty
> botch, though, and you can't expect to demodulate high order QAM this
> way. You can kinda decode 16-QAM at high SNR - interesting for
> experimenting, but not much use in a system.
>
> Steve

That's correct, you want to use CMA while the constellation is spinning.
Once CMA has adapted it's usually possible to obtain carrier lock so that
you can switch to decision directed adaptation.

In your case, since you have a training sequence you could still try to use
CMA since you know the radius of each symbol in the sequence and it should
adapt faster than blind. However, unless it is a differential QAM signal you
still need to recover the carrier very quickly to get good data, especially
if this is a packet and not a continuous signal.

-Clark

```
```I am still in the fog.

I have checked some paper about  CMA, and didn't find any clue why CMA
can compensate the carrier frequency offset.

What I learned is only that 'Adaptive Complex Gain Control' can
compensate the carrier phase offset. I understand what it really works.

Carrier frequency offset. Could it be 'killed' in the equalizer,
without other device?

Thanks.

```
```jia wrote:
> I am still in the fog.
>
> I have checked some paper about  CMA, and didn't find any clue why CMA
> can compensate the carrier frequency offset.

It can't what it can do is equalise even though the constellation is
spinning. You still need to track the carrier and stop the constellation
spinning. However, with CMA you can do this after the equalisation step.
With most other equalisation adaption schemes you need to stop the
spinning first.

> What I learned is only that 'Adaptive Complex Gain Control' can
> compensate the carrier phase offset. I understand what it really works.
>
> Carrier frequency offset. Could it be 'killed' in the equalizer,
> without other device?

The equaliser can't kill the offset. You need to do that separately.

Perhaps you need to take a step back and try to understand the overall
picture of what the various steps through the receiver are trying to
achieve. It seems like you don't really grasp this right now, and
nothing will make proper sense until you do.

Steve
```
```Thanks, steve.

Yes, I should review the basic knowledge of the receiver.

```
```> spinning. You still need to track the carrier and stop the constellation
> spinning. However, with CMA you can do this after the equalisation step.
> With most other equalisation adaption schemes you need to stop the
> spinning first.

I agree with most of what Steve says here.  I just want to clarify that
when he says that you must "stop the spinning first" for other
adaptation schemes, the spinning is not necessarily stopped at the
input of the equalizer.  Basically, one can use the CMA to lock onto
the signal, then use carrier recovery (CR) following the equaliser.
Once the CR is locked, the CR output can be used to generate the error
signal to be fed back for use by a different adaptation scheme.  If I
remember correctly, you will want to get that error signal spinning the
same way as your equalizer input.  If not, things will go crazy.

I hope that this helps.

Phil

```
```Phil wrote:
> > spinning. You still need to track the carrier and stop the constellation
> > spinning. However, with CMA you can do this after the equalisation step.
> > With most other equalisation adaption schemes you need to stop the
> > spinning first.
>
> I agree with most of what Steve says here.  I just want to clarify that
> when he says that you must "stop the spinning first" for other
> adaptation schemes, the spinning is not necessarily stopped at the
> input of the equalizer.  Basically, one can use the CMA to lock onto
> the signal, then use carrier recovery (CR) following the equaliser.
> Once the CR is locked, the CR output can be used to generate the error
> signal to be fed back for use by a different adaptation scheme.  If I
> remember correctly, you will want to get that error signal spinning the
> same way as your equalizer input.  If not, things will go crazy.
>
> I hope that this helps.
>
> Phil

Hi, Phil

CMA is usually adopted in PSK moduation, for constant amplitude
constellation. However, it can also make sensen in QAM modulation.

So, Phil. If I didn't misunderstand your meaning. You means that
regarding CMA as a pre-equalizer, and get the frequency offset through
CMA.

Then the estimated frequency offset can be used to as a weighted factor
in the coefficient update formula of another equalizer, like SG MME
equalizer.

I don't think it is necessary.

```
```> So, Phil. If I didn't misunderstand your meaning. You means that
> regarding CMA as a pre-equalizer, and get the frequency offset through
> CMA.
>
> Then the estimated frequency offset can be used to as a weighted factor
> in the coefficient update formula of another equalizer, like SG MME
> equalizer.
>
> I don't think it is necessary.

I've attempted to illustrate the system that I was describing.  I don't
know if it applies to your situation, but it seemed to follow earlier
posts.

The lineup is based on a system that I worked on a while back.  It
consists of timing recovery (TR), a dual mode LMS equalizer (CMA then
decision directed (DD)), CR and then the symbol demapper.  This was
meant for a continuous wave system, i.e., not packet based and no
unique words.  Our approach was the following:

1. acquire timing
2. pre-equalize (using your words) using CMA
3. freeze CMA once target error is achieved
3. acquire carrier offset
4. switch equalizer to DD mode.

err
--<---<----<----<--
\/                    |
TR--->EQ--->CR--->DEMAP

Since the CR follows EQ, in DD mode, the carrier offset must be applied
to the err signal.  I just remembered that the EQ that I am describing
was a T-spaced.  Perhaps this will not be as helpful to you as I had
originally thought.

```