본문 바로가기

카테고리 없음

QPSK 변복조 및 신호 대 잡음 비(SNR) 발표자료 및 소스코드(matlab)

 

012345678

 

 

프로그래밍3_기말_프로젝트.ppt

 

% Program 'qpsk_team4_31.m' (ver. 1.0)

% 이 프로그램은 100000개의 이진신호를 QPSK변·복조를 거쳐 전송 할 때 AWGN의 영향으로 인한
% SNR에 따른 에러율을 나타내는 그래프를 생성한다.

% 강의명 : 프로그래밍3, 담당교수 : 백명선 조교님, 조이름 : 4조

% 문의 : noota@daum.net

disp('--------------------------------------------------------------------------------------')
disp('Program qpsk_team4.m (ver. 1.0)')
disp('--------------------------------------------------------------------------------------')
disp('QPSK변조 프로그램을 시작합니다.')
disp('--------------------------------------------------------------------------------------')

% 프로그램에서 사용할 변수,행렬들 초기화.
disp('각종 변수와 행렬들을 초기화합니다.')
a=0;, b=0;, c=0;, d=0;, e=0;, f=0;, g=0;, h=0;, i=0;% 변수들 초기화.
QMDS=zeros(1,50000); % 디지털 신호를 QPSK 변조해서 넣을 공간 영행렬로 생성.

for a=1:31
AWGNSNR=zeros(a,50000); % (1행은 SNR=0, SNR을 1간격으로, 31행은 SNR=30)
end % AWGN에 오염된 신호를 SNR에 따라 넣을 31*50000 영행렬 생성.

for b=1:31
QDMDS=zeros(b,100000); % (1행은 SNR=0, SNR을 1간격으로, 31행은 SNR=30)
end % AWGN에 오염된 신호를 QPSK 복조해서 디지털신호를 넣을 공간 31*100000 영행렬 생성.

for b=1:31
ERROR=zeros(b,100000); % (1행은 SNR=0, SNR을 1간격으로, 31행은 SNR=30)
end % AWGN에 오염된 신호를 SNR에 따라서 에러율을 구하기 위한 31*100000 영행렬 생성.
disp('각종 변수와 행렬들의 초기화가 완료되었습니다.')
disp('--------------------------------------------------------------------------------------')

% 100000개의 디지털 신호생성.
disp('100000개의 디지털신호 생성을 시작합니다.')
DS=randint(1,100000,2); % 디지털신호(Digital Signal) 100000개 생성. (행벡터로 생성)
DS31=[DS;DS;DS;DS;DS;DS;DS;DS;DS;DS;DS;DS;DS;DS;DS;DS;DS;DS;DS;DS;DS;DS;DS;DS;DS;DS;DS;DS;DS;DS;DS]; % 에러율 측정용으로 만들어놓음.
disp('100000개의 디지털신호 생성이 완료되었습니다.')
disp('--------------------------------------------------------------------------------------')

% 디지털신호를 QPSK변조함.
disp('QPSK 변조를 시작합니다.(약간의 시간이 소요됩니다.)')
disp('QPSK 변조 진행상황 단위(%) - 대략적인 수치임.')
for c=1:2:99999
    if DS(1,c)==1
        if DS(1,c+1)==1
            QMDS(1,(c+1)/2)=1+i;
        else
            QMDS(1,(c+1)/2)=1-i;
        end % (2)번if문 : 앞신호1로결정됨. 뒷신호 1이면 1+i, 아니면 1-i값 줌.
    else
        if DS(1,c+1)==1
            QMDS(1,(c+1)/2)=-1+i;
        else
            QMDS(1,(c+1)/2)=-1-i;
        end % (2)번if문 : 앞신호-1로결정됨. 뒷신호 1이면 -1+i, 아니면 -1-i값 줌.   
    end % (1)번if문 : 디지털신호를 두개씩 짝지어서 앞신호가1이면 (2)번if문으로 1이아니면 (3)번if문으로 보냄.
    
    for d=9999:10000:89999
    if d==c
    disp(c/99999*100)
    end % QPSK 변조 진행상황을 정해진 간격마다 백분율로 표시한다.
    end % 진행상황을 일정간격마다 표시하도록 수시로 비교하게 수치를 넣어준다.

end % 3개의 if문을 반복사용해서 100000개의 디지털신호를 QPSK변조함. 50000개로 줄여짐.
disp('QPSK 변조가 100% 완료되었습니다.')
disp('--------------------------------------------------------------------------------------')

% AWGN을 통과시킴. SNR에 따라서 에러율을 얻어내야하므로 반복문 사용.
disp('AWGN을 통과시킵니다. (오랜시간이 소요됩니다.) 펜티엄4 1.5GHz 36분 50초 정도 소요')
disp('AWGN 통과 진행상황 단위(%) - 대략적인 수치임.')
for e=1:31
    for f=1:50000
        AWGNSNR(e,f)=awgn(QMDS(1,f),e-1);
    end % 모든값을 AWGN통과시킴.
    disp(e/31*100) % 진행상황 백분율로 간단하게 표시.
end % SNR을 변화시켜가면서 AWGN통과 시킴.
disp('AWGN을 통과가 완료되었습니다.')
disp('--------------------------------------------------------------------------------------')

% QPSK 복조.
disp('QPSK 복조를 시작합니다.(약간의 시간이 소요됩니다.)')
disp('QPSK 복조 진행상황 단위(%) - 대략적인 수치임.')
for g=1:31
    for h=1:2:99999
    if real(AWGNSNR(g,(h+1)/2))>=0
        if imag(AWGNSNR(g,(h+1)/2))>=0
            QDMDS(g,h)=1;
            QDMDS(g,h+1)=1;
        else
            QDMDS(g,h)=1;
            QDMDS(g,h+1)=0;
        end % (5)번if문 : 앞신호1로결정됨. 허수부가 x축보다 위쪽이거나 x축위에 있으면 뒷신호1줌.
    else
        if imag(AWGNSNR(g,(h+1)/2))>=0
            QDMDS(g,h)=0;
            QDMDS(g,h+1)=1;
        else
            QDMDS(g,h)=0;
            QDMDS(g,h+1)=0;
        end % (6)번if문 : 앞신호0으로결정됨. 허수부가 x축보다 위쪽이거나 x축위에 있으면 뒷신호1줌.   
    end % (4)번if문 : 실수부가 y축보다 오른쪽이거나 y축위에 있으면 (5)번if문으로 아니면 (6)번if문으로 보냄.
end % 3개의 if문을 반복사용해서 QPSK복조 과정을 시행. 100000개의 디지털 신호 얻어냄.
disp(g/31*100) % 진행상황 백분율로 간단하게 표시.
end % SNR에 따라서 값을 얻어냄.
disp('QPSK 복조가 완료되었습니다.')
disp('--------------------------------------------------------------------------------------')

disp('에러율을 측정합니다.')
% 에러율 측정
ERROR=xor(QDMDS,DS31); % EXCLUSIVE OR이 두 값이 다를 때 1을 갖는 것을 이용해서 에러를 1로 표시한다.
ERROR=(sum(ERROR.')); % 1로 표시된 에러는 더하는데 행에따라서 SNR을 구분했으므로 전치를 이용해 계산한다.
% 1행 31열의 에러갯수를 갖는 행렬이 생성된다. (행벡터생성됨.)
ERROR=ERROR/100000; %10만으로 나눠서 에러율을 구한다.
disp('에러율을 측정이 완료되었습니다.')
disp('--------------------------------------------------------------------------------------')

disp('그래프를 작성합니다.')
%그래프작성
x=[0:30];
y=ERROR(1,x+1);
plot(x,y,'o',x,y),xlabel('SNR'),ylabel('BER'),...
    title('신호 대 잡음 비에 따른 에러율 그래프'),
    
disp('그래프를 작성이 완료되었습니다.')

disp('--------------------------------------------------------------------------------------')
disp('QPSK변조 프로그램이 완료되었습니다. -end-')
disp('--------------------------------------------------------------------------------------')