QAM.asv
上传用户: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 = linspace(0, 2*pi*QAM_periods, num_symbol_samples+1)
  54. % Generate 16-QAM data
  55. % total length of 16-QAM transmission
  56. tx_length = num_OFDM_symbols * num_QAM_symbols * num_symbol_samples;
  57. QAM_tx_data = zeros(1,tx_length);
  58. for i = 1:2:data_length/2
  59. for k = 1:num_symbol_samples
  60. QAM_tx_data(k+((i-1)/2)*num_symbol_samples) = data_in_4(i)*cos(ts(k)) + data_in_4(i+1)*sin(ts(k));
  61. end
  62. end
  63. % Do channel simulation on QAM data
  64. xmit = QAM_tx_data % ch uses 'xmit' data and returns 'recv'
  65. ch
  66. QAM_rx_data = recv; % save QAM data after channel
  67. clear recv % remove 'recv' so it won't interfere with OFDM
  68. clear xmit % remove 'xmit' so it won't interfere with OFDM
  69. disp('Receiving') % Recover Binary data (Decode QAM)
  70. cos_temp = zeros(1,num_symbol_samples); %
  71. sin_temp = cos_temp; %
  72. xxx = zeros(1,data_length/4); % Initialize to zeros for speed
  73. yyy = xxx; %
  74. QAM_data_out_4 = zeros(1,data_length/2); %
  75. for i = 1:2:data_length/2 % "cheating"
  76. for k = 1:num_symbol_samples
  77. % multiply by carriers to produce high frequency term and original data
  78. cos_temp(k) = QAM_rx_data(k+((i-1)/2)*num_symbol_samples) * cos(ts(k));
  79. sin_temp(k) = QAM_rx_data(k+((i-1)/2)*num_symbol_samples) * sin(ts(k));
  80. end
  81. % LPF and decide - we will do very simple LPF by averaging
  82. xxx(1+(i-1)/2) = mean(cos_temp);
  83. yyy(1+(i-1)/2) = mean(sin_temp);
  84. % Reconstruct data in serial form
  85. QAM_data_out_4(i) = xxx(1+(i-1)/2);
  86. QAM_data_out_4(i+1) = yyy(1+(i-1)/2);
  87. end
  88. % Make decision between [-3, -1, 1, 3]
  89. for i = 1:data_length/2
  90. if QAM_data_out_4(i) >= 1, QAM_data_out_4(i) = 3;
  91. elseif QAM_data_out_4(i) >= 0, QAM_data_out_4(i) = 1;
  92. elseif QAM_data_out_4(i) >= -1, QAM_data_out_4(i) = -1;
  93. else QAM_data_out_4(i) = -3;
  94. end
  95. end
  96. % Convert 4 level data [-3, -1, 1, 3] back to polar data [-1, 1]
  97. QAM_data_out_pol = zeros(1,data_length); % "cheating"
  98. for i = 1:2:data_length
  99. switch QAM_data_out_4(1 + (i-1)/2)
  100. case -3
  101. QAM_data_out_pol(i) = -1;
  102. QAM_data_out_pol(i+1) = -1;
  103. case -1
  104. QAM_data_out_pol(i) = -1;
  105. QAM_data_out_pol(i+1) = 1;
  106. case 1
  107. QAM_data_out_pol(i) = 1;
  108. QAM_data_out_pol(i+1) = -1;
  109. case 3
  110. QAM_data_out_pol(i) = 1;
  111. QAM_data_out_pol(i+1) = 1;
  112. otherwise
  113. disp('Error detected in switch statment - This should not be happening.');
  114. end
  115. end
  116. QAM_data_out = pol2bin(QAM_data_out_pol); % convert back to binary
  117. % Stop stopwatch to calculate how long QAM simulation takes
  118. QAM_simulation_time = toc;
  119. if QAM_simulation_time > 60
  120. disp(strcat('Time for QAM simulation=', num2str(QAM_simulation_time/60), ' minutes.'));
  121. else
  122. disp(strcat('Time for QAM simulation=', num2str(QAM_simulation_time), ' seconds.'));
  123. end
  124. end