본문내용
Diagram을 보고 문뜩 실수를 찾아내기까지 많은 시간이 걸렸다. 항상 느끼는 것이지만 코딩은 어렵지만 성취하고 났을 때의 기쁨은 이루 말할 수 없는 것 같다.
5.소스 코드
bit = round(rand(1000000,2)); %2백만개의 임의의 bit 1열은 in-phase 2열은 quadriphase
bit2 = zeros(1000000,2); %gray coding 안할때 비트할당 일단 0으로
m_c = bit(:,1); %in-phase 성분의 비트 행렬
m_s = bit(:,2); %quadri-phase 성분의 비트 행렬
s_c = m_c*2-1; %polar-NRZ 형태
s_s = m_s*2-1; %polar-NRZ 형태
output1=zeros(1000000,2); %gray coding에서 output 초기화
output2=zeros(1000000,2); %gray coding 안할때 output 초기화
Eb=zeros(11,1); %bit energy 초기화
E=zeros(11,1); %symbol energy 초기화
for i=1:1000000 %for 구문으로 Gray coding 안할때 Signal Constellation
%에서의 비트할당
if (s_c(i)>=0) & (s_s(i)>=0) %1사분면 00
bit2(i,:)=[0,0]; %bit2의 i행에 할당
elseif (s_c(i) >=0) & (s_s(i)<0) %4사분면 11
bit2(i,:)=[1,1];
elseif (s_c(i)<0) & (s_s(i)>=0) %2사분면 01
bit2(i,:)=[0, 1];
elseif (s_c(i)<0) & (s_s(i)<0) %3사분면 10
bit2(i,:)=[1, 0];
end
end
scatterplot([s_c,s_s]); %시그널 컨스털레이션
k=1.38*10^-23; %볼쯔만상수
T= 300; %상온27도에서 절대온도
N0=k*T; %N0를 kT로 표현
var_n=0.5*N0; %잡음의 분산
noise_c=randn(1000000,1)*sqrt(var_n); %in-phase AWGN 표현
noise_s=randn(1000000,1)*sqrt(var_n); %quadri-phase AWGN 표현
SNR =[0 1 2 3 4 5 6 7 8 9 10]; %SNR을 0부터 10까지 나타냄
for a= 1:11 %for문을 11번 돌림
Eb(a)=2*var_n*10.^(SNR(a)/10); %SNR에 따른 bit에너지
E(a)=2*Eb(a); %symbol 에너지
signal_c= s_c.*sqrt(E(a)./2); %Polar NRZ에 실제 크기 부여함
signal_s= s_s.*sqrt(E(a)./2);
r_c=signal_c+noise_c; %AWGN 채널을 거친 in-phase신호
r_s=signal_s+noise_s; %AWGN 채널을 거친 quadri-phase 신호
for j = 1:1000000 %gray coding을 통한 판단
if (r_c(j)>=0) & (r_s(j)>=0) %수신신호가 1사분면이면
output1(j,:)=[1,1]; %11로 판단하고
elseif (r_c(j) >=0) & (r_s(j)<0) %수신신호가 4사분면이면
output1(j,:)=[1,0]; %10으로 판단
elseif (r_c(j)<0) & (r_s(j)>=0) %수신신호가 2사분면에있으면
output1(j,:)=[0, 1]; %01로 판단
elseif (r_c(j)<0) & (r_s(j)<0) %수신신호가 3사분면에 있으면
output1(j,:)=[0,0]; %00으로 판단
end
end
for k = 1:1000000 %gray coding을 사용하지 않았을때
if (r_c(k)>=0) & (r_s(k)>=0) %수신신호가 1사분면에 있으면
output2(k,:)=[0,0]; %00로 판단하고
elseif (r_c(k) >=0) & (r_s(k)<0) %4사분면에 있으면
output2(k,:)=[1,1]; %11로 판단
elseif (r_c(k)<0) & (r_s(k)>=0) %2사분면에 있으면
output2(k,:)=[0, 1]; %01로 판단
elseif (r_c(k)<0) & (r_s(k)<0) %3사분면에 있으면
output2(k,:)=[1,0]; %10으로 판단
end
end
compare1= xor(output1, bit);% graycoding 이용했을때 수신신호와 송신신호비교(같으면0 다르면1)
error1=sum(sum(compare1))/2000000; %compare의 합(다른bit의개수)/보낸bits수
BER1(a)=error1; %SNR이 0~12일때 각각의 에러확률을 BER 행렬에 대입
compare2= xor(output2, bit2);% graycoding 이용하지않았을때 수신신호와 송신신호비교(같으면0 다르면1)
error2=sum(sum(compare2))/2000000; %compare의 합(다른bit의개수)/보낸bits수
BER2(a)=error2; %SNR이 0~12일때 각각의 에러확률을 BER 행렬에 대입
end
scatterplot([s_c,s_s]); %시그널 컨스털레이션
subplot(1,2,1);
semilogy(SNR, BER1,'o-',SNR,BER2,'*-'); %동시에 log scale로 플랏
title('BER curves for QPSK system in AWGN channel');
legend('Gray coding','non-Gray coding');
xlabel('Eb/N0');
ylabel('Bit error rate');
subplot(1,2,2);
BER_Theo=qfunc(sqrt(2*10.^(SNR./10))); %이론적인 에러확률
semilogy(SNR, BER_Theo,'-',SNR,BER1,'*') %동시에 log scale로 플랏
title('BER curves for QPSK system in AWGN channel');
legend('Theory','Gray coding');
xlabel('Eb/N0');
ylabel('Bit error rate');
5.소스 코드
bit = round(rand(1000000,2)); %2백만개의 임의의 bit 1열은 in-phase 2열은 quadriphase
bit2 = zeros(1000000,2); %gray coding 안할때 비트할당 일단 0으로
m_c = bit(:,1); %in-phase 성분의 비트 행렬
m_s = bit(:,2); %quadri-phase 성분의 비트 행렬
s_c = m_c*2-1; %polar-NRZ 형태
s_s = m_s*2-1; %polar-NRZ 형태
output1=zeros(1000000,2); %gray coding에서 output 초기화
output2=zeros(1000000,2); %gray coding 안할때 output 초기화
Eb=zeros(11,1); %bit energy 초기화
E=zeros(11,1); %symbol energy 초기화
for i=1:1000000 %for 구문으로 Gray coding 안할때 Signal Constellation
%에서의 비트할당
if (s_c(i)>=0) & (s_s(i)>=0) %1사분면 00
bit2(i,:)=[0,0]; %bit2의 i행에 할당
elseif (s_c(i) >=0) & (s_s(i)<0) %4사분면 11
bit2(i,:)=[1,1];
elseif (s_c(i)<0) & (s_s(i)>=0) %2사분면 01
bit2(i,:)=[0, 1];
elseif (s_c(i)<0) & (s_s(i)<0) %3사분면 10
bit2(i,:)=[1, 0];
end
end
scatterplot([s_c,s_s]); %시그널 컨스털레이션
k=1.38*10^-23; %볼쯔만상수
T= 300; %상온27도에서 절대온도
N0=k*T; %N0를 kT로 표현
var_n=0.5*N0; %잡음의 분산
noise_c=randn(1000000,1)*sqrt(var_n); %in-phase AWGN 표현
noise_s=randn(1000000,1)*sqrt(var_n); %quadri-phase AWGN 표현
SNR =[0 1 2 3 4 5 6 7 8 9 10]; %SNR을 0부터 10까지 나타냄
for a= 1:11 %for문을 11번 돌림
Eb(a)=2*var_n*10.^(SNR(a)/10); %SNR에 따른 bit에너지
E(a)=2*Eb(a); %symbol 에너지
signal_c= s_c.*sqrt(E(a)./2); %Polar NRZ에 실제 크기 부여함
signal_s= s_s.*sqrt(E(a)./2);
r_c=signal_c+noise_c; %AWGN 채널을 거친 in-phase신호
r_s=signal_s+noise_s; %AWGN 채널을 거친 quadri-phase 신호
for j = 1:1000000 %gray coding을 통한 판단
if (r_c(j)>=0) & (r_s(j)>=0) %수신신호가 1사분면이면
output1(j,:)=[1,1]; %11로 판단하고
elseif (r_c(j) >=0) & (r_s(j)<0) %수신신호가 4사분면이면
output1(j,:)=[1,0]; %10으로 판단
elseif (r_c(j)<0) & (r_s(j)>=0) %수신신호가 2사분면에있으면
output1(j,:)=[0, 1]; %01로 판단
elseif (r_c(j)<0) & (r_s(j)<0) %수신신호가 3사분면에 있으면
output1(j,:)=[0,0]; %00으로 판단
end
end
for k = 1:1000000 %gray coding을 사용하지 않았을때
if (r_c(k)>=0) & (r_s(k)>=0) %수신신호가 1사분면에 있으면
output2(k,:)=[0,0]; %00로 판단하고
elseif (r_c(k) >=0) & (r_s(k)<0) %4사분면에 있으면
output2(k,:)=[1,1]; %11로 판단
elseif (r_c(k)<0) & (r_s(k)>=0) %2사분면에 있으면
output2(k,:)=[0, 1]; %01로 판단
elseif (r_c(k)<0) & (r_s(k)<0) %3사분면에 있으면
output2(k,:)=[1,0]; %10으로 판단
end
end
compare1= xor(output1, bit);% graycoding 이용했을때 수신신호와 송신신호비교(같으면0 다르면1)
error1=sum(sum(compare1))/2000000; %compare의 합(다른bit의개수)/보낸bits수
BER1(a)=error1; %SNR이 0~12일때 각각의 에러확률을 BER 행렬에 대입
compare2= xor(output2, bit2);% graycoding 이용하지않았을때 수신신호와 송신신호비교(같으면0 다르면1)
error2=sum(sum(compare2))/2000000; %compare의 합(다른bit의개수)/보낸bits수
BER2(a)=error2; %SNR이 0~12일때 각각의 에러확률을 BER 행렬에 대입
end
scatterplot([s_c,s_s]); %시그널 컨스털레이션
subplot(1,2,1);
semilogy(SNR, BER1,'o-',SNR,BER2,'*-'); %동시에 log scale로 플랏
title('BER curves for QPSK system in AWGN channel');
legend('Gray coding','non-Gray coding');
xlabel('Eb/N0');
ylabel('Bit error rate');
subplot(1,2,2);
BER_Theo=qfunc(sqrt(2*10.^(SNR./10))); %이론적인 에러확률
semilogy(SNR, BER_Theo,'-',SNR,BER1,'*') %동시에 log scale로 플랏
title('BER curves for QPSK system in AWGN channel');
legend('Theory','Gray coding');
xlabel('Eb/N0');
ylabel('Bit error rate');
소개글