%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Creative Commons % Attribution-Noncommercial 2.5 India % You are free: % to Share — to copy, distribute and transmit the work % to Remix — to adapt the work % Under the following conditions: % Attribution. You must attribute the work in the manner % specified by the author or licensor (but not in any way % that suggests that they endorse you or your use of the work). % Noncommercial. You may not use this work for commercial purposes. % For any reuse or distribution, you must make clear to others the % license terms of this work. The best way to do this is with a % link to this web page. % Any of the above conditions can be waived if you get permission % from the copyright holder. % Nothing in this license impairs or restricts the author's moral rights. % http://creativecommons.org/licenses/by-nc/2.5/in/ % Script for simulating M-QAM (4-QAM, 16-QAM, 64-QAM, 256QAM, 1024QAM) % transmission and reception and compare the simulated and theoretical % symbol error probability % Checked for proper operation with Octave Version 3.0.0 % Author : Krishna Pillai % Email : krishna@dsplog.com % Version : 1.0 % Date : 28 April 2008 % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% clear N = 7*10^5; % number of symbols M = 64; % number of constellation points k = sqrt(1/((2/3)*(M-1))); % normalizing factor m = [1:sqrt(M)/2]; % alphabets alphaMqam = [-(2*m-1) 2*m-1]; Es_N0_dB = [0:30]; % multiple Es/N0 values ipHat = zeros(1,N); % init for ii = 1:length(Es_N0_dB) ip = randsrc(1,N,alphaMqam) + j*randsrc(1,N,alphaMqam); s = k*ip; % normalization of energy to 1 n = 1/sqrt(2)*[randn(1,N) + j*randn(1,N)]; % white guassian noise, 0dB variance y = s + 10^(-Es_N0_dB(ii)/20)*n; % additive white gaussian noise % demodulation y_re = real(y)/k; % real part y_im = imag(y)/k; % imaginary part % rounding to the nearest alphabet % 0 to 2 --> 1 % 2 to 4 --> 3 % 4 to 6 --> 5 etc ipHat_re = 2*floor(y_re/2)+1; ipHat_re(find(ipHat_re>max(alphaMqam))) = max(alphaMqam); ipHat_re(find(ipHat_re 1 % 2 to 4 --> 3 % 4 to 6 --> 5 etc ipHat_im = 2*floor(y_im/2)+1; ipHat_im(find(ipHat_im>max(alphaMqam))) = max(alphaMqam); ipHat_im(find(ipHat_im