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

matlab例程

开发平台:

Matlab

  1. % QAM.m compares OFDM (multicarrier) to multi-level QAM (single carrier)
  2. % when they transmit the same # of bits in a given time period
  3. setup
  4. read % read data for QAM - does not affect OFDM
  5. data_in_pol = bin2pol(data_in); % Converts binary data to polar data
  6. % check to see if num_carriers is a power of 2
  7. is_pow_2 = num_carriers;
  8. temp_do_QAM = 0;
  9. if is_pow_2 ~= 2
  10. while temp_do_QAM == 0
  11. temp_do_QAM = rem(is_pow_2,2);
  12. is_pow_2 = is_pow_2/2;
  13. if is_pow_2 == 2
  14. temp_do_QAM = -99; % it is a power of 2 -> can do QAM
  15. end
  16. end
  17. else
  18. temp_do_QAM = -99; % 2 is a power of 2
  19. end
  20. if temp_do_QAM ~= -99
  21. do_QAM = 0; % don't do it if it's not possible
  22. disp(' '),disp('ERROR: Cannot run QAM because num_carriers is not valid.')
  23. disp('       Please see "setup.m" for details.')
  24. end
  25. if do_QAM == 1
  26. tic % Start stopwatch to calculate how long QAM simulation takes
  27. disp(' '), disp('------------------------------------------------------------')
  28. disp('QAM simulation'), disp('Transmitting')
  29.     
  30. % Pad with zeros so data can be divided evenly
  31. data_length = length(data_in_pol);
  32. r = rem(data_length,num_carriers);
  33. if r ~= 0
  34. for i = 1:num_carriers-r
  35. data_in_pol(data_length+i) = 0; %pad input with zeros to complete last data set
  36. end %speed improve possible
  37. end
  38. data_length = length(data_in_pol); %update after padding
  39. num_OFDM_symbols = ceil(data_length / (2*num_carriers));
  40. % num QAM symbols that represent equal amount of data to one OFDM symbol
  41. num_QAM_symbols = num_carriers / 2;
  42. % num samples per QAM symbol
  43. num_symbol_samples = fft_size / num_QAM_symbols;
  44. % convert polar data [-1, 1] to 4 level data [-3, -1, 1, 3]
  45. data_in_4 = zeros(1,data_length/2);
  46. for i = 1:2:data_length
  47. data_in_4(i - (i-1)/2) = data_in_pol(i)*2 + data_in_pol(i+1);
  48. end
  49.     
  50.     data_in_4
  51. data_len=length(data_in_4)
  52. % define sample points between 0 and 2*pi
  53. ts = 0:(pi/4):(2*pi);
  54.  for   n=1:num_symbol_samples
  55.     xx(n)=cos(ts(n))
  56.     xy(n)=sin(ts(n))
  57. end
  58.     cos_mean=mean(xx)
  59.     sin_mean=mean(xx)
  60.     
  61.     
  62. % Generate 16-QAM data
  63. % total length of 16-QAM transmission
  64. tx_length = num_OFDM_symbols * num_QAM_symbols * num_symbol_samples;
  65. QAM_tx_data = zeros(1,data_length/2);
  66. for i = 1:(data_len/2)
  67. for k = 1:num_symbol_samples
  68. QAM_tx_data((i-1)*num_symbol_samples+k) =data_in_4(2*i-1)*cos(ts(k)) + data_in_4(2*i)*sin(ts(k));
  69. end
  70. end
  71. % Do channel simulation on QAM data
  72. xmit = QAM_tx_data % ch uses 'xmit' data and returns 'recv'
  73. ch
  74. QAM_rx_data = recv; % save QAM data after channel
  75. clear recv % remove 'recv' so it won't interfere with OFDM
  76. clear xmit % remove 'xmit' so it won't interfere with OFDM
  77. disp('Receiving') % Recover Binary data (Decode QAM)
  78. cos_temp = zeros(1,num_symbol_samples); %
  79. sin_temp = cos_temp; %
  80. xxx = zeros(1,data_length/4); % Initialize to zeros for speed
  81. yyy = xxx; %
  82. QAM_data_out_4 = zeros(1,data_length/2); %
  83. for i = 1:2:data_len/2 % "cheating"
  84. for k = 1:num_symbol_samples
  85. % multiply by carriers to produce high frequency term and original data
  86. cos_temp(k) = QAM_rx_data(k+((i-1)/2)*num_symbol_samples) * cos(ts(k));
  87. sin_temp(k) = QAM_rx_data(k+((i-1)/2)*num_symbol_samples) * sin(ts(k));
  88. end
  89. % LPF and decide - we will do very simple LPF by averaging
  90. xxx(1+(i-1)/2) = mean(cos_temp);
  91. yyy(1+(i-1)/2) = mean(sin_temp);
  92. % Reconstruct data in serial form
  93. QAM_data_out_4(i) = xxx(1+(i-1)/2);
  94. QAM_data_out_4(i+1) = yyy(1+(i-1)/2);
  95. end
  96. % Make decision between [-3, -1, 1, 3]
  97. for i = 1:data_len/2
  98. if QAM_data_out_4(i) >= 1, QAM_data_out_4(i) = 3;
  99. elseif QAM_data_out_4(i) >= 0, QAM_data_out_4(i) = 1;
  100. elseif QAM_data_out_4(i) >= -1, QAM_data_out_4(i) = -1;
  101. else QAM_data_out_4(i) = -3;
  102. end
  103. end
  104. % Convert 4 level data [-3, -1, 1, 3] back to polar data [-1, 1]
  105. QAM_data_out_pol = zeros(1,data_length); % "cheating"
  106. for i = 1:2:data_length
  107. switch QAM_data_out_4(1 + (i-1)/2)
  108. case -3
  109. QAM_data_out_pol(i) = -1;
  110. QAM_data_out_pol(i+1) = -1;
  111. case -1
  112. QAM_data_out_pol(i) = -1;
  113. QAM_data_out_pol(i+1) = 1;
  114. case 1
  115. QAM_data_out_pol(i) = 1;
  116. QAM_data_out_pol(i+1) = -1;
  117. case 3
  118. QAM_data_out_pol(i) = 1;
  119. QAM_data_out_pol(i+1) = 1;
  120. otherwise
  121. disp('Error detected in switch statment - This should not be happening.');
  122. end
  123. end
  124. QAM_data_out = pol2bin(QAM_data_out_pol); % convert back to binary
  125. % Stop stopwatch to calculate how long QAM simulation takes
  126. QAM_simulation_time = toc;
  127. if QAM_simulation_time > 60
  128. disp(strcat('Time for QAM simulation=', num2str(QAM_simulation_time/60), ' minutes.'));
  129. else
  130. disp(strcat('Time for QAM simulation=', num2str(QAM_simulation_time), ' seconds.'));
  131. end
  132. end