SNR에 따른 QPSK 변조 신호의 신호점(Signal Constellation) 그리기순서1) 사용 프로그램2) 목적3) 변조방식4) 결과 그래프5) 코드 설명 및 수정 방법6) 프로그램 코드1) 사용 프로그램: 매틀랩2) 목적- QPSK 심볼의 신호점(signal constellation)을 SNR에 따라서 어떻게 변화하는지 확인한다.- QPSK의 BER 그래프를 확인한다.3) 변조방식- QPSK4) 결과 그래프- SNR에 따른 신호점(Signal Constellation)그림 SNR=0dB 인 경우의 신호점그림 SNR=2dB 인 경우의 신호점그림 SNR=4dB 인 경우의 신호점그림 SNR=6dB 인 경우의 신호점그림 SNR=8dB 인 경우의 신호점그림 SNR=10dB 인 경우의 신호점그림 SNR=12dB 인 경우의 신호점그림 SNR=14dB 인 경우의 신호점그림 SNR=16dB 인 경우의 신호점그림 SNR=18dB 인 경우의 신호점그림 SNR=20dB 인 경우의 신호점- QPSK의 BER 곡선그림 QPSK의 BER 곡선5) 코드설명 및 수정방법- Initiation부분- clc 명령어: command 창을 깨끗이 지우는 명령어- clf 명령어: 현재 열려있는 그림창을 닫아주는 명령어- clear all: 매틀랩안에 있는 변수들을 삭제→ clear all을 사용하지 않으면 이전에 실행했던 변수들이 매틀랩 안에 남아 있어서, 현재 실행했던 변수들과 엉켜버리는 경우가 생긴다. 여러 번 실행을 할 경우 이전 변수들을 삭제하기 위한 명령어이다. 이 초기화 부분에서 사용한 clc, clf, clear all은 변경하지 않는 것을 권장한다.- SNR설정 및 data 수SNR = [0 : 2 : 25];data = 1e5;관측하고 싶은 SNR 구간과 data 수 결정a) SNR의 경우 현재 0dB부터 25dB까지 2dB마다로 설정이 되어있다. 만약 1dB마다 설정을 하고 싶은 경우 SNR을 아래와 같이 수정한다.SNR = [0 : 1 : 25];관측하고 싶은 SNR 구간이 1dB, 2dB, 3dB ...25dB인 경우b) datat 수 결정- data 수는 현재 1e5=100000로 되어있다.- data 수가 많으면 시뮬레이션 시간이 길어지므로 1e4~1e5로 하는 것이 좋다.- data 수는 사용자가 원하는 대로 결정해도 되지만 BER의 그래프를까지 확인 하고자 한다면로 설정하는 것을 권장 한다.→ BER 그래프를 그릴 때 에러가 튀는 부분이 생길 수 있기 때문이다. 즉, BER 그래프가 부드럽게 나오지 않는 경우가 생긴다. 이럴 때는 시뮬레이션을 다시 실행하는 것도 방법 중 하나이다.- QPSK modulation 부분- 현재 아래의 그림과 같이 Gray coding을 기준으로 QPSK심볼을 매핑을 했다.- 심볼 패턴을 바꾸려면 코드안의 table을 수정하면 가능하다. 주의해야할 사항은 패턴을 바꾸면 demodulation부분도 같이 수정해야한다. 현재의 demodulation방법은 아래의 QPSK demodulation부분을 참고하길 바란다.- QPSK demodulation 부분- QPSK심볼은 한 개의 심볼당 2개의 비트를 나타낸다. 현재 2개의 비트 중 앞의 비트는 X축, 뒤의 비트는 y축을 기준으로 한다.- 예를 들어 1사분면과 4사분면의 앞의 비트는 0을 나타내고 2사분면과 3사분면의 앞의 비트는 1을 나타낸다. 즉, 앞의 비트는 x축을 기준으로 음수이면 1에 해당되고, 양수이면 0에 해당된다.- 코드 안에서 bit0은 앞의 비트를 나타내고, bit1은 뒤의 비트를 나타낸다.%% demodulationbit0 = real(rx_symbols) < 0; % '0' --> -1, '1' --> 1bit1 = imag(rx_symbols) < 0;→ bit0: x축을 기준으로 음수이면 1이 되고 양수이면 ‘0’이 된다.→ bit1: y축을 기준으로 음수이면 1이 되고 양수이면 ‘0’이 된다.- 그래프 그리기 참고%% SNR에 따른 QPSK 신호점 그리기current_snr = SNR(snr_idx);scatter(real(rx_symbols),imag(rx_symbols),'.');axis squaregrid onaxis([-1.5 1.5 -1.5 1.5]);current_snr = SNR(snr_idx);title(['SNR = ',num2str(current_snr)]);pause(1);- 프로그램을 실행시키면 그림이 하나씩 자동으로 나오고 맨 마지막엔 BER곡선이 나올 것이다.- 멈추게하는 명령어가 pause()함수인데 안에 들어가는 숫자는 몇 초 동안 멈출것에 대한 파라미터이다. 현재는 1이므로 1초 동안 멈추고 자동으로 넘어간다.- 만약에, “(1)”을 삭제하고 “pause;”만 넣게 되면 사용자가 스페이스바를 누를 때까지 신호점 그림이 멈출 것이다. (프린트스크린할 시 사용하길 바란다.)- 참고로 title이라는 명령어는 말 그대로 그래프의 제목을 넣는 부분이다. 현재는 SNR 값을 문자로 변환(num2str)하여 입력을 해 놓은 상태이다. 자세한 내용은 command창에 help title 이라고 입력하면 자세한 사용법이 나온다.6) 매틀랩 코드(QPSK)?표 안의 내용을 매틀랩에 그대로 복사해서 사용하시면 됩니다.% QPSK Signall constellation% 1) Purpose:% - QPSK의 신호점이 SNR에 따라 어떻게 변화하는 지 확인% - QPSK의 BER을 그래프로 나타낸다%% 2) Specification% a) Modulation type : QPSK% b) Channel : AWGN%% 3) 주요 변수 설명% - SNR% - data_bits : information data bit sequences% - mod_symbols : 변조된 심볼, (1 x N) row vector, complex% - table : mapping table%% 4) Revision history:%%%Initiationclc;clf;clear all%% ParametersSNR = [0 : 2 : 25];num_data = 1e5;for snr_idx = 1:length(SNR)%% Generaton of data bitsdata_bits = randint(1,num_data); % generation of databits%% QPSK modulationtable = exp(j/4*pi*[1 -1 3 -3]); % [1+j 1-j -1+j -1-j]tmp_mod_symbols = reshape(data_bits,2,num_data/2); % generation of tx_symbols (2 x (data/2) matrix)mod_symbols = table([2 1]*single(tmp_mod_symbols)+1); % mapping to table%% AWGN channelrx_symbols = awgn(mod_symbols,SNR(snr_idx),'measured');%% SNR에 따른 QPSK 신호점 그리기current_snr = SNR(snr_idx);scatter(real(rx_symbols),imag(rx_symbols),'.');axis squaregrid onaxis([-1.5 1.5 -1.5 1.5]);current_snr = SNR(snr_idx);title(['SNR = ',num2str(current_snr)]);