Reply by pado...@libero.it September 23, 20052005-09-23
Hi all!!
I implemented in Matlab some different ZF equalizations, but I should change the input signal froma random [+1/-1] signal to a QPSK or BPSK signal (choosing number of samples, oversampling and so on..), but I have no idea of how doing it.
Could anyone give me some advices or some code-examples?
Thank you all in advance,

Ella

PS:here there is the code I implemented:

close all
clear
clc

L=2; %Lunghezza canale
a=0.2;
h=1/sqrt(1+a^2)*[1 a]'; %Canale a norma unitaria

N=4; %Lunghezza dati trasmessi
Niter00; %Numero simulazioni di Montecarlo
SNRvec=[-10:5:10];
Pnoisevec.^(-SNRvec/10);
BER_ZF=zeros(length(SNRvec),1);
BER_FIR=zeros(length(SNRvec),1);
BER_TRAIN=zeros(length(SNRvec),1);
BER_DD=zeros(length(SNRvec),1);

Leq=5;
f=(-a).^[0:Leq-1]';
mu=0.2; for i=1:length(SNRvec)

for nit=1:Niter
Pnoise=Pnoisevec(i);
x=sign(randn(N,1)); %segnale trasmesso
y=conv(x,h)+sqrt(Pnoise)*randn(N+L-1,1); %segnale ricevuto % Equalizzazione ZF con canale noto

yeq=filter(1,h,y);
xd=sign(yeq(1:N));
BER_ZF(i)R_ZF(i)+sum(xd~=x)/N; % Equalizzazione ZF-FIR con canale noto

yzp=[zeros(Leq-1,1); y]; %aggiunta di zeri (zero padding) al segnale ricevuto per condizioni iniziali
xd=zeros(N,1); %vettori dei simboli decisi
for n=1:N
yeq(n)=f'*yzp(n+Leq-1:-1:n);
xd(n)=sign(yeq(n));
end
BER_FIR(i)R_FIR(i)+sum(xd~=x)/N;

% Equalizzazione ZF (FIR approssimato) con canale non noto: sequenza di training
% Assumiamo ora che il ricevitore non conosca il canale. Poichquesto consta di due parametri (L = 2) ci basterbr /> % trasmettere due simboli di training. Sulla base dei simboli pilota possibile effettuare la stima di canale,
% ad esempio LS, ed usare questa per ottenere lequalizzatore FIR.

% Stima di canale
xt=sign(randn(L,1)); %Sequenza di training
Xt=convmtx(xt,L);
yt=Xt*h+sqrt(Pnoise)*randn(2*L-1,1); %Segnale ricevuto lungo la sequenz di training
hest=pinv(Xt)*yt; %Stima LS
aest=hest(2)/hest(1);
fi=(-aest).^[0:Leq-1]'; %Filtro ZF-FIR stimato
yest=conv(x,h)+sqrt(Pnoise)*randn(N+L-1,1); %segnale ricevuto
yeq=filter(1,fi,yest);
xest=sign(yeq(1:N));
BER_TRAIN(i)R_TRAIN(i)+sum(xest~=x)/N; % EQUALIZZAZIONE ZF (FIR APPROSSIMATO) CON CANALE NON NOTO: SEQUENZA DI TRAINING+DD
% Per allungare virtualmente la sequenza di training, possibile usare i dati decisi istante per istante per aggiornare la stima
% di canale (approccio decision directed, DD). Una possibile scelta br /> % quella di aggiornare la stima di canale con LMS.
% Ci aspettiamo che questo ricevitore, allungando virtualmente la sequenza di training, si avvicini alle
% prestazioni del caso di canale noto.

%Aggiunta di zeri (zero padding) al segnale ricevuto per condizioni iniziali
yzp=[zeros(Leq-1,1); y];
%vettori dei simboli decisi (nessario anche qui zp)
xd=zeros(N+1,1);
for n=1:N
yeq(n)=fi'*yzp(n+Leq-1:-1:n);
xd(n+1)=sign(yeq(n));
hest=hest+mu*xd(n+1:-1:n)*(y(n)-hest'*xd(n+1:-1:n)); %aggiornamento stima di canale
aest=hest(2)/hest(1);
fi=(-aest).^[0:Leq-1]'; %aggiornamento filtro
end
BER_DD(i)R_DD(i)+sum(xd(2:N+1)~=x)/N;

end

end BER_ZF=1/Niter*BER_ZF;
BER_FIR=1/Niter*BER_FIR;
BER_TRAIN=1/Niter*BER_TRAIN;
BER_DD=1/Niter*BER_DD;

figure(1)
semilogy(SNRvec,BER_ZF);
grid;
title('Equalizzatore ZF con canale noto');
xlabel('SNR');
ylabel('BER');

figure(2)
semilogy(SNRvec,BER_FIR);
grid;
title('Confronto tra Equalizzatori ZF');
xlabel('SNR');
ylabel('BER');
hold on
semilogy(SNRvec,BER_TRAIN,'g');
hold on;
semilogy(SNRvec,BER_DD,'r');
legend('ZF FIR con canale noto','ZF Canale non Noto:Seq.Training','ZF Canale non Noto:DD','location','SOUTHWEST');