matlab code for channel estimation for ofdm

6
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 s %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 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 1*pL %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% pn = genpncode(6); pL = length(pn)+L; pns = [pn pn(1:L)]; PNS = fft(pns,N)/sqrt(N); %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

Transcript of matlab code for channel estimation for ofdm

Page 1: matlab code for channel estimation for ofdm

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 s %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%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); endend %generate pn code pns 1*pL %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%pn = genpncode(6);pL = length(pn)+L;pns = [pn pn(1:L)];PNS = fft(pns,N)/sqrt(N); %transmit & receive %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%for n = 1:blocks for k = 1:N TR(n,k) = s(N*(n-1)+k); %convert series to parallel end endfor n = 1:blocks tr1(n,:) = [pns ifft(TR(n,pL+1:N))*sqrt(N-pL)];endtr1 = [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); %ƵÓòÊá×´µ¼Æµ·½·¨3·¢ÉäµÄÊý¾Ý TR3 = TR;for j = 1:Nf3:N-2%%%%%%%%%%%%% TR3(:,j) = pfc;

Page 2: matlab code for channel estimation for ofdm

endTR3(:,end) = pfc;%%%%%%%%%%%%%%%%%%%%%%%%%%for n = 1:blocks tr3(n,:) = sqrt(N)*ifft(TR3(n,:))endtr3 = [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%endfor 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); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% h1 = zeros(blocks,N);

Page 3: matlab code for channel estimation for ofdm

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); HH3(:,:,m) = interp2(X3,Y3,H3,X,Y,'linear'); %ƵÓòÊá×´µ¼Æµ·½·¨4²åÖµÍê±Ï %¾ùºâ£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½ TRe1 = R1./HH1(:,:,m); for n = 1:blocks

Page 4: matlab code for channel estimation for ofdm

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(:,N-1); %½âµ÷²¢¼ÆËãÎó±ÈÌØÂÊÎó·ûºÅÂÊ [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));endsimulation_T=toc; figure;semilogy(snrdB,pb2,'b-*',snrdB,pb1,'b-d',snrdB,pb3,'b-+');legend('ʱÓò¹À¼Æ·½·¨','ʱÓò¹À¼Æ·½·¨£¨¸Ä½øÐŵÀ²ÎÊý¼ì²â£©','ƵÓòÊá×´µ¼Æµ·½·¨');xlabel('ÐÅÔë±È/dB');

Page 5: matlab code for channel estimation for ofdm

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