ofdm.m
上传用户:m_sun_001
上传日期:2014-07-30
资源大小:1115k
文件大小:3k
源码类别:

matlab例程

开发平台:

Matlab

  1. % Program 4-1
  2. % ofdm.m
  3. %
  4. % Simulation program to realize OFDM transmission system
  5. %
  6. % programmed by T.Yamamura and H.Harada
  7. %
  8. %********************** preparation part ***************************
  9. para=128;   % Number of parallel channel to transmit (points)
  10. fftlen=128; % FFT length
  11. noc=128;    % Number of carrier
  12. nd=6;       % Number of information OFDM symbol for one loop
  13. ml=2;       % Modulation level : QPSK
  14. sr=250000;  % Symbol rate
  15. br=sr.*ml;  % Bit rate per carrier
  16. gilen=32;   % Length of guard interval (points)
  17. ebn0=3;     % Eb/N0
  18. %************************** main loop part **************************
  19. nloop=100;  % Number of simulation loops
  20. noe = 0;    % Number of error data
  21. nod = 0;    % Number of transmitted data
  22. eop=0;      % Number of error packet
  23. nop=0;      % Number of transmitted packet
  24. for iii=1:nloop
  25. %************************** transmitter *********************************
  26. %************************** Data generation **************************** 
  27. seldata=rand(1,para*nd*ml)>0.5;  %  rand : built in function
  28. %****************** Serial to parallel conversion ***********************
  29. paradata=reshape(seldata,para,nd*ml); %  reshape : built in function
  30. %************************** QPSK modulation ***************************** 
  31. [ich,qch]=qpskmod(paradata,para,nd,ml);
  32. kmod=1/sqrt(2); %  sqrt : built in function
  33. ich1=ich.*kmod;
  34. qch1=qch.*kmod;
  35. %******************* IFFT ************************
  36. x=ich1+qch1.*i;
  37. y=ifft(x);      %  ifft : built in function
  38. ich2=real(y);   %  real : built in function
  39. qch2=imag(y);   %  imag : built in function
  40. %********* Gurad interval insertion **********
  41. [ich3,qch3]= giins(ich2,qch2,fftlen,gilen,nd);
  42. fftlen2=fftlen+gilen;
  43. %********* Attenuation Calculation *********
  44. spow=sum(ich3.^2+qch3.^2)/nd./para;  %  sum : built in function
  45. attn=0.5*spow*sr/br*10.^(-ebn0/10);
  46. attn=sqrt(attn);
  47. %***************************  Receiver  *****************************
  48. %***************** AWGN addition ********* 
  49. [ich4,qch4]=comb(ich3,qch3,attn);
  50. %****************** Guard interval removal *********
  51. [ich5,qch5]= girem(ich4,qch4,fftlen2,gilen,nd);
  52. %******************  FFT  ******************
  53. rx=ich5+qch5.*i;
  54. ry=fft(rx);    % fft : built in function
  55. ich6=real(ry); % real : built in function
  56. qch6=imag(ry); % imag : built in function
  57. %***************** demoduration *******************
  58. ich7=ich6./kmod;
  59. qch7=qch6./kmod;
  60. [demodata]=qpskdemod(ich7,qch7,para,nd,ml);   
  61. %**************  Parallel to serial conversion  *****************
  62. demodata1=reshape(demodata,1,para*nd*ml);
  63. %************************** Bit Error Rate (BER) ****************************
  64. % instantaneous number of error and data
  65. noe2=sum(abs(demodata1-seldata));  %  sum : built in function
  66. nod2=length(seldata);  %  length : built in function
  67. % cumulative the number of error and data in noe and nod
  68. noe=noe+noe2;
  69. nod=nod+nod2;
  70. % calculating PER
  71. if noe2~=0  
  72.    eop=eop+1;
  73. else
  74.    eop=eop;
  75. end   
  76.    eop;
  77.    nop=nop+1;
  78.    
  79. fprintf('%dt%et%dn',iii,noe2/nod2,eop);  %  fprintf : built in function
  80.    
  81. end
  82. %********************** Output result ***************************
  83. per=eop/nop;
  84. ber=noe/nod;
  85. fprintf('%ft%et%et%dtn',ebn0,ber,per,nloop);
  86. fid = fopen('BERofdm.dat','a');
  87. fprintf(fid,'%ft%et%et%dtn',ebn0,ber,per,nloop);
  88. fclose(fid);
  89. %******************** end of file ***************************