Weitere ähnliche Inhalte
Ähnlich wie matlab code for channel estimation for ofdm (20)
Kürzlich hochgeladen (20)
matlab code for channel estimation for ofdm
- 1. Matlab code for ofdm channel
estimation(pn sequence as cyclic
prefix)
blocks = 200;
%OFDM¿éÊý
%ÓëchanestnewÏà±È£¬Êǽ«ÏßÐÔÏà¹Ø¸ÄΪԲÖÜÏà¹Ø
%Êá×´µ¼ÆµÓë±¾ÎÄ·½·¨£¨µü´úÇ°ºÍµü´úºó£©×÷±È½Ï
% |--cp--|----PN----|------OFDM------|
tic;
fc = 2000;
%MHz,ϵͳÔز¨ÆµÂÊ
N = 512;
%×ÓÔز¨Êý
L = 32;
%Ñ-»·Ç°×º³¤¶È
Nf3 = 6;
%µ¼ÆµÂÊΪ
M = 26;
%¶à¾¶Êý%%%%%%%%%%%%%%
%generate transmitted signal
DN = blocks*N;
for j = 1:DN
temp = rand;
if (temp<0.25)
s(j) = 1;
elseif (temp<0.5)
s(j) = sqrt(-1);
elseif (temp<0.75)
s(j) = -1;
else
s(j) = (-1)*sqrt(-1);
end
end
%generate pn code
pns
pn = genpncode(6);
pL = length(pn)+L;
pns = [pn pn(1:L)];
PNS = fft(pns,N)/sqrt(N);
1*pL
s
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%transmit & receive
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
for n = 1:blocks
for k = 1:N
TR(n,k) = s(N*(n-1)+k);
%convert series to parallel
end
end
for n = 1:blocks
tr1(n,:) = [pns ifft(TR(n,pL+1:N))*sqrt(N-pL)];
end
tr1 = [tr1(:,(N-L+1):N) tr1];
%blocks*(N+L)
for j = 1:blocks
ss1((j-1)*(N-pL)+1:j*(N-pL)) = s((j-1)*N+pL+1:j*N);
%±¾ÎÄËùÌá·½·¨µÄ´«ÊäÐźÅ
end
pfc = sqrt(-1)*ones(blocks,1);
TR3 = TR;
for j = 1:Nf3:N-2%%%%%%%%%%%%%
%ƵÓòÊá×´µ¼Æµ·½·¨3·¢ÉäµÄÊý¾Ý
- 2. TR3(:,j) = pfc;
end
TR3(:,end) = pfc;%%%%%%%%%%%%%%%%%%%%%%%%%%
for n = 1:blocks
tr3(n,:) = sqrt(N)*ifft(TR3(n,:))
end
tr3 = [tr3(:,(N-L+1):N) tr3];
%blocks*(N+L)
j = 1;
Npc = round(N/Nf3)+1;
%Êá×´µ¼ÆµÊý Npc = (N-1)/Nf3+1;%%%%%%%%%%%%%%
%for k = 1:N
%if (mod(k-1,Nf3)~=0)
%ss3(j:(Npc-1)*(Nf3-1):j+(blocks-1)*(Npc-1)*(Nf3-1)) = TR3(:,k);
%µÃµ½³ýµ¼ÆµÐźÅÍâµÄÊý¾ÝÐźÅ
%j = j+1;
%end
%end
for k = 1:N-1%
if (mod(k-1,Nf3)~=0)%
ss3(j:(Npc-1)*(Nf3-1)+1:j+(blocks-1)*((Npc-1)*(Nf3-1)+1)) = TR3(:,k);
%%µÃµ½³ýµ¼ÆµÐźÅÍâµÄÊý¾ÝÐźÅ
j = j+1;%
end%
end%
ss3(j:(Npc-1)*(Nf3-1)+1:j+(blocks-1)*((Npc-1)*(Nf3-1)+1)) = TR3(:,N-1); %
%delayTime = [0 0.2 0.6 1.6 2.4 5.0]*10^(-6);%%%%%%%%%%%%%%%%%%%
%delayn = delayTime/chipT;%%%%%%%%%%%%%%%%%%%%%
%averPower = %%%%%%%%%%%%%%%%%%
%channel %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
pnss = pns(L+1:pL);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
delayn = 0:25;%[0 1 2 3];%[0 1 3 8 12 25];
%averPower = [0.189 0.379 0.239 0.095 0.060 0.038];[0.575 0.362 0.057 0.006];
snrdB = 0:5:25;
for m = 1:length(snrdB)
%%%%%%%%%%%%%%%%%%%%%%%channel model
h = zeros(N,blocks);%
for k=1:M%
h(delayn(k)+1,:)=randn(1,blocks)+sqrt(-1)*randn(1,blocks);%
end%
for k = 1:M%
h(delayn(k)+1,:) =
h(delayn(k)+1,:)/norm(h(delayn(k)+1,:))*sqrt(blocks);%
%¹éÒ»»¯ÐŵÀ N*blocks
end%
%for k = 1:M
%h(delayn(k)+1,:) = sqrt(averPower(k))*h(delayn(k)+1,:);
%end
for n = 1:blocks
h(:,n) = h(:,n)/norm(h(:,n));%¹éÒ»»¯ÐŵÀ
end
HL = fft(h);
% N*blocks
H(:,:,m) = HL';
Hs = reshape(H(:,:,m),1,N*blocks);
- 3. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
h1 = zeros(blocks,N);
h2 = zeros(blocks,N);%²ÎÊý¼ì²âδ¸Ä½ø֮ǰ
for n = 1:blocks
r1(n,:) = zeros(1,N);
r3(n,:) = zeros(1,N);
for j = 1:M
r1(n,:) = r1(n,:)+h(j,n).*tr1(n,(L+1-(j-1):N+L-(j-1)));%
r3(n,:) = r3(n,:)+h(j,n).*tr3(n,(L+1-(j-1):N+L-(j-1)));%
end
r1(n,:) = AWGN(r1(n,:),snrdB(m));
r3(n,:) = AWGN(r3(n,:),snrdB(m));
R1(n,:) = fft(r1(n,:))/sqrt(N);
%blocks*N
%R12(n,:) = fft(r12(n,:))/sqrt(N);
R3(n,:) = fft(r3(n,:))/sqrt(N);
%blocks*N
Rprw = circlecorr(pnss,r1(n,L+1:pL));
%Ϊ±¾ÎÄ·½·¨1×÷×¼±¸
Rs = Rprw;
for j = 1:M;
Rpp = Rs(pL-L:-1:1);
[a(n,j,m),b(n,j,m)] = max(Rpp);
a(n,j,m) = a(n,j,m)/(pL-L);
pnsd = [pnss(pL-L-b(n,j,m)+2:pL-L) pnss(1:pL-L-b(n,j,m)+1)];
Rppd = circlecorr(pnss,pnsd);
Rs = Rs-a(n,j,m)*Rppd;
h1(n,b(n,j,m)) = a(n,j,m);
%±¾ÎÄËùÌá·½·¨½á¹û
end
H1(n,:) = fft(h1(n,:))/sqrt(N);
Rs2 = Rprw;
%Ϊδµü´ú·½·¨×÷×¼±¸
for j = 1:M;
Rpp2 = Rs2(pL-L:-1:1);
[c(n,j,m),d(n,j,m)] = max(Rpp2);
c(n,j,m) = c(n,j,m)/(pL-L);
Rs2(pL-L-d(n,j,m)+1) = 0;
h2(n,d(n,j,m)) = c(n,j,m);
%±¾ÎÄËùÌá·½·¨½á¹û
end
H2(n,:) = fft(h2(n,:))/sqrt(N);
end
k3 = 1;
for j = 1:N-2;%j = 1:N
if (mod(j-1,Nf3)==0)
H3(:,k3) = R3(:,j)./pfc;
%ƵÓòÊá×´µ¼Æµ¹À¼Æ3½á¹û
k3 = k3+1;
end
end
H3(:,k3) = R3(:,N)./pfc; %%%%%%%%%%%%%%%%%
[X3,Y3] = meshgrid([1:Nf3:N-2 N],1:blocks);%[X3,Y3] =
meshgrid(1:Nf3:N,1:blocks);%%%%%%%%%%%
[X,Y] = meshgrid(1:N,1:blocks);
HH1(:,:,m) = H1*sqrt(N);
%±¾ÎÄ·½·¨1 ²åÖµÍê±Ïblocks¡ÁN
HH2(:,:,m) = H2*sqrt(N);
- 4. HH3(:,:,m) = interp2(X3,Y3,H3,X,Y,'linear');
%ƵÓòÊá×´µ¼Æµ·½·¨4²åÖµÍê±Ï
%¾ùºâ£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½
TRe1 = R1./HH1(:,:,m);
for n = 1:blocks
tre1(n,:) = ifft(TRe1(n,:)-PNS)*sqrt(N);
TRe1(n,:) = [zeros(1,pL) fft(tre1(n,pL+1:N))/sqrt(N-pL)];
TRes1(N*(n-1)+1:N*n) = TRe1(n,:);
%²¢´®×ª»»
end
for j = 1:blocks
TRess1((j-1)*(N-pL)+1:j*(N-pL)) = TRes1((j-1)*N+pL+1:j*N);
%±¾ÎÄËùÌá·½·¨¾ùºâºóµÄƵÓò´«ÊäÐźÅ
end
TRe2 = R1./HH2(:,:,m);
for n = 1:blocks
tre2(n,:) = ifft(TRe2(n,:)-PNS)*sqrt(N);
TRe2(n,:) = [zeros(1,pL) fft(tre2(n,pL+1:N))/sqrt(N-pL)];
TRes2(N*(n-1)+1:N*n) = TRe2(n,:);
%²¢´®×ª»»
end
for j = 1:blocks
TRess2((j-1)*(N-pL)+1:j*(N-pL)) = TRes2((j-1)*N+pL+1:j*N);
%µü´úÇ°±¾ÎÄËùÌá·½·¨¾ùºâºóµÄƵÓò´«ÊäÐźÅ
end
j = 1;
TRe3 = R3./HH3(:,:,m);
%for k = 1:N
%if (mod(k-1,Nf3)~=0)
%TRess3(j:(Npc-1)*(Nf3-1):j+(blocks-1)*(Npc-1)*(Nf3-1)) =
TRe3(:,k);
%
%j = j+1;
%end
%end
for k = 1:N-1
if (mod(k-1,Nf3)~=0)
TRess3(j:(Npc-1)*(Nf3-1)+1:j+(blocks-1)*((Npc-1)*(Nf3-1)+1)) =
TRe3(:,k);
%
j = j+1;
end
end
TRess3(j:(Npc-1)*(Nf3-1)+1:j+(blocks-1)*((Npc-1)*(Nf3-1)+1)) = TRe3(:,N1);
%½âµ÷²¢¼ÆËãÎó±ÈÌØÂÊÎó·ûºÅÂÊ
[ps1(m),pb1(m)] = demanderr(ss1,TRess1);
[ps3(m),pb3(m)] = demanderr(ss3,TRess3);
[ps2(m),pb2(m)] = demanderr(ss1,TRess2);%
HH1s = reshape(HH1(:,:,m),1,N*blocks);
HH2s = reshape(HH2(:,:,m),1,N*blocks);
HH3s = reshape(HH3(:,:,m),1,N*blocks);
cc1(:,:,m) = corrcoef(abs(HH1s),abs(Hs));
cc2(:,:,m) = corrcoef(abs(HH2s),abs(Hs));
cc3(:,:,m) = corrcoef(abs(HH3s),abs(Hs));
- 5. end
simulation_T=toc;
figure;
semilogy(snrdB,pb2,'b-*',snrdB,pb1,'b-d',snrdB,pb3,'b-+');
legend('ʱÓò¹À¼Æ·½·¨','ʱÓò¹À¼Æ·½·¨£¨¸Ä½øÐŵÀ²ÎÊý¼ì²â£©','ƵÓòÊá×´µ¼Æµ·½·¨');
xlabel('ÐÅÔë±È/dB');
ylabel('ÎóÂëÂÊ');
grid on;
axis([0,25,10^(-4),10^0]);
figure;%
plot(1:N,abs(H(1,:,4)),'b-',1:N,abs(HH2(1,:,4)),'b-',1:N,abs(HH1(1,:,4)),'b:',1:N,abs(HH3(1,:,4)),'b-.');%
legend('ÕæʵÐŵÀ','ʱÓò¹À¼Æ·½·¨','ʱÓò¹À¼Æ·½·¨£¨¸Ä½øÐŵÀ²ÎÊý¼ì²â£©','ƵÓòÊá×´
µ¼Æµ·½·¨');%
xlabel('×ÓÔز¨');%
ylabel('ÐŵÀ·ùƵÏìÓ¦');%
axis([1 N 0 2]);