본문 바로가기
programming language/MATLAB

MATLAB 16 QAM BER Simulation

by __observer__ 2014. 4. 4.
반응형

오늘은 MATLAB 을 이용한 16 QAM BER Simulation코드에 대해 소개해 보려 합니다.

 

예전에 제가 작성했던 코드들도 있지만~

 

아래 주소를 보니 16 QAM 의 Gray coding 부터 이론적인 BER 성능 까지 자세히 설명되어 있더군요.

   

http://www.dsplog.com/2008/06/05/16qam-bit-error-gray-mapping/

   

코드는 위 블로그의 약간 아래 쪽을 보시면~ 링크가 되어 있습니다.

 

못찾으실 분들을 위해 링크를 걸죠, 아래 주소를 오른쪽 클릭한 후에 파일로 다운로드 받거나 그냥 클릭하고 들어가서 전체 선택후에 m 파일에 붙여넣기 해도 됩니다.

 

http://www.dsplog.com/db-install/wp-content/uploads/2008/06/script_16qam_gray_mapping_bit_error_rate.m

 

혹시 못 찾으실 분들을 위해 코드도 넣습니다. 다시 한번 밝히지만 아래 코드는 Krishna Pillai, http://www.dsplog.com 님이 작성하신 겁니다.

 

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% All rights reserved by Krishna Pillai, http://www.dsplog.com

% The file may not be re-distributed without explicit authorization

% from Krishna Pillai.

% Checked for proper operation with Octave Version 3.0.0

% Author    : Krishna Pillai

% Email        : krishna@dsplog.com

% Version    : 1.0

% Date        : 05 June 2008

% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

 

% Bit Error Rate for 16-QAM modulation using Gray modulation mapping

 

clear

N = 10^5; % number of symbols

M = 16; % constellation size

k = log2(M); % bits per symbol

 

% defining the real and imaginary PAM constellation

% for 16-QAM

alphaRe = [-(2*sqrt(M)/2-1):2:-1 1:2:2*sqrt(M)/2-1];

alphaIm = [-(2*sqrt(M)/2-1):2:-1 1:2:2*sqrt(M)/2-1];

k_16QAM = 1/sqrt(10);

 

Eb_N0_dB = [0:15]; % multiple Es/N0 values

Es_N0_dB = Eb_N0_dB + 10*log10(k);

 

% Mapping for binary <--> Gray code conversion

ref = [0:k-1];

map = bitxor(ref,floor(ref/2));

[tt ind] = sort(map);

 

for ii = 1:length(Eb_N0_dB)

 

% symbol generation

% ------------------

ipBit = rand(1,N*k,1)>0.5; % random 1's and 0's

ipBitReshape = reshape(ipBit,k,N).';

bin2DecMatrix = ones(N,1)*(2.^[(k/2-1):-1:0]) ; % conversion from binary to decimal

% real

ipBitRe = ipBitReshape(:,[1:k/2]);

ipDecRe = sum(ipBitRe.*bin2DecMatrix,2);

ipGrayDecRe = bitxor(ipDecRe,floor(ipDecRe/2));

% imaginary

ipBitIm = ipBitReshape(:,[k/2+1:k]);

ipDecIm = sum(ipBitIm.*bin2DecMatrix,2);

ipGrayDecIm = bitxor(ipDecIm,floor(ipDecIm/2));

% mapping the Gray coded symbols into constellation

modRe = alphaRe(ipGrayDecRe+1);

modIm = alphaIm(ipGrayDecIm+1);

% complex constellation

mod = modRe + j*modIm;

s = k_16QAM*mod; % normalization of transmit power to one

 

% noise

% -----

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_16QAM; % real part

y_im = imag(y)/k_16QAM; % imaginary part

 

% rounding to the nearest alphabet

ipHatRe = 2*floor(y_re/2)+1;

ipHatRe(find(ipHatRe>max(alphaRe))) = max(alphaRe);

ipHatRe(find(ipHatRe<min(alphaRe))) = min(alphaRe);

ipHatIm = 2*floor(y_im/2)+1;

ipHatIm(find(ipHatIm>max(alphaIm))) = max(alphaIm);

ipHatIm(find(ipHatIm<min(alphaIm))) = min(alphaIm);

 

% Constellation to Decimal conversion

ipDecHatRe = ind(floor((ipHatRe+4)/2+1))-1; % LUT based

ipDecHatIm = ind(floor((ipHatIm+4)/2+1))-1; % LUT based

 

% converting to binary string

ipBinHatRe = dec2bin(ipDecHatRe,k/2);

ipBinHatIm = dec2bin(ipDecHatIm,k/2);

 

% converting binary string to number

ipBinHatRe = ipBinHatRe.';

ipBinHatRe = ipBinHatRe(1:end).';

ipBinHatRe = reshape(str2num(ipBinHatRe).',k/2,N).' ;

 

ipBinHatIm = ipBinHatIm.';

ipBinHatIm = ipBinHatIm(1:end).';

ipBinHatIm = reshape(str2num(ipBinHatIm).',k/2,N).' ;

 

% counting errors for real and imaginary

nBitErr(ii) = size(find([ipBitRe- ipBinHatRe]),1) + size(find([ipBitIm - ipBinHatIm]),1) ;

 

end

simBer = nBitErr/(N*k);

theoryBer = (1/k)*3/2*erfc(sqrt(k*0.1*(10.^(Eb_N0_dB/10))));

 

close all; figure

semilogy(Eb_N0_dB,theoryBer,'bs-','LineWidth',2);

hold on

semilogy(Eb_N0_dB,simBer,'mx-','LineWidth',2);

axis([0 15 10^-5 1])

grid on

legend('theory', 'simulation');

xlabel('Eb/No, dB')

ylabel('Bit Error Rate')

title('Bit error probability curve for 16-QAM modulation')

 

실행 시키고 조금만 기다려 보면~~ Krishna Pillai의 블로그에 있는것과 같이 다음과 같은 시뮬레이션 결과를 확인 할 수 있습니다.

 

 

위 코드를 배포 하실 때는 원저자를 명시하셔야 합니다.


반응형

댓글