% 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('--------------------------------------------------------------------------------------')