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');