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).'); %
Received signal vector
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.