ICIS 학부 연구생/통신시스템 설계

[ 통신시스템설계 ] 02. BPSK/QPSK 변조기법

hanol02 2023. 7. 11. 16:25

 

02 QPSK.zip
0.04MB
통신시스템설계 개념정리.pdf
2.87MB

 

01. 서론

  • 0,1과 같은 디지털 신호를 무선파를 이용해 전송하는 가장 쉬운 방법은 주파수 fc의 반송파에 정보를 실어서 보내는 것
  • 변조 = 정보data를 반송파에 싣는 행위
  • 일반적으로 주파수 fc의 반송파는 다음과 같이 표현

 

1. AM 변조 방식

: 진폭에 정보를 싣는 방식. RFID, NFC(Near Field Communication)에 사용된다. 무선이동통신에 불리하다.

2.  FM 변조 방식 / FSK

: 주파수의 변화에 정보를 싣는 방식. 생활무전기에 사용되며 무선이동통신에 유리하다.

 

3. PM 변조 방식

: 위상에 정보를 싣는 방식. 위성/이동통신 시스템에 사용되며 무선이동통신에 유리하다.

 


 

 

 

 

02. BPSK / QPSK 변복조

1. BPSK

  • BPSK(Binary Phase Shift Keying)란?: 위상에 정보를 싣는 방식으로 다음과 같이 정의

  • dI(t): 전송 bit를 심볼로 변환한 값 
  • { 0, 1 } 비트   → { 1, -1 } 심볼 = dI(t)

이 신호를 BPSK 심볼로 변환하면 -1 1 1 -1 -1 1 -1 1

 

 

2. QPSK

  • QPSK란 Cos/Sin 신호의 위상에 정보를 싣는 방식으로, sin과 cos에 각각 1bit씩 실어 보내는 방식.
  • sin/cos 신호는 서로 직교하는 특성이 있음  → 수신기에서 sin 을 복원할 때 cos은 사라지고 반대도 마찬가지.→ cos 과 sin에 독립적으로 정보를 실어 보낼 수 있다. 
  • { 0 0 1 0 0 1 1 0 }    →    { 1 1 -1 1 1 -1 -1 1 }
  • BPSK는 2가지 신호(1bit) 구분 , QPSK는 4가지 신호(2bit) 구분
  • 두 신호의 내적( Inner Product)가 0이면 두 신호는 직교한다.

 

  • 실제 세상에서는 복소수 신호가 존재할 순 없지만, 복소수의 실수와 허수의 특성은 cos과 sin의 특성과 매우 유사하다.

cos은 복소수의 실수부(I), sin은 복소수의 허수부(Q)로 표현한다!

 

 

 

 

즉, 보내고자하는 정보 비트를 복소수 신호로 변환하는 과정디지털 변조라고 한다. 

 

 

 

3. BPSK / QPSK 변조 블록도 비교

  • BPSK   binary data를 1bit씩 읽어 BPSK 심볼로 mapping

 

  • QPSK   binary data를 2bit씩 읽어 QPSK 심볼로 mapping

  • Gray encoding을 통해 심볼 에러가 2bit 이상 발생하지 않도록 한다.  

 

 


 

 

03. AWGN

  • AWGN이란?     통신 시스템에서 열잡음이 시스템을 훼손시키는 특성을 가진 잡음
  • SNR 이란?        신호 대 잡음 비. 
  • BER이란?         Bir Error Rate. 전송 비트수 중 에러난 비트 수 / 전송 비트수
BER은 작을수록 좋고, SNR은 클수록 좋다!

 

 

 

 


 

4. MATLAB으로 QPSK 변복조 알고리즘 구현하기

 

# funtions

1. QPSK_mapper

: 정보 Data를 2bit씩 잘라서 1개의 QPSK 심볼로 mapping

function y = QPSK_mapper(x)

% L = x의 길이
L=length(x);

% 2비트씩 잘라 심볼을 만들어서 y에 넣을거임
% 따라서 크기가 정보data 크기 x의 반절
y=zeros(1,L/2);
for n=1:1:L/2
    two_bit=[x(2*n-1) x(2*n)];      % 두 비트씩 자르기
    if two_bit == [ 0 0 ]           % x에서 읽어들인 data가 00 이면
        y(n)=sqrt(0.5)+j*sqrt(0.5); % QPSK mapping 규칙에 따라 복소수 심볼 y(n) 지정
    elseif two_bit == [ 0 1 ]
        y(n)=-sqrt(0.5)+j*sqrt(0.5);
    elseif two_bit == [ 1 1 ]
        y(n)=-sqrt(0.5)-j*sqrt(0.5);
    else
        y(n)=sqrt(0.5)-j*sqrt(0.5);
    end


end

 

2. AWGN

function r = AWGN(y,SNR)
    % L=length(y);
    z=sqrt(0.5*10^(-SNR/10))*(randn(1, length(y))+1j*randn(1,length(y)));
    r=y+z;

end

 

3. QPSK_demepper

: 수신신호 - 복소수 1개 = 2bit의 정보 담고있으므로 복조신호 담을 x_hat 배열 크기 2*L

function x_hat= QPSK_demapper(r)

L=length(r);
x_hat=zeros(1,2*L);

for n=1:L
    if real(r(n)) >= 0 && imag(r(n)) >= 0
        x_hat(2*(n-1)+1:2*n)=[0 0];
    elseif real(r(n)) < 0 && imag(r(n)) >= 0
        x_hat(2*(n-1)+1:2*n)=[0 1];
    elseif real(r(n)) < 0 && imag(r(n)) < 0
        x_hat(2*(n-1)+1:2*n)=[1 1];
    else
        x_hat(2*(n-1)+1:2*n)=[1 0];
    end
end  
end

 

 

 


 # 실습1    AWGN 채널 통과 전 후 신호 성상도 비교하기

- 1000개의 데이터 비트 생성하여 송신 신호 x 생성

- 잡음 채널(AWGN) 통과 전 송신 신호 성상도 그리기

- x를 AWGN 채널(SNR=10)에 통과시킨 수신 신호 y의 성상도 그리기

%% 실습1
% 전송할 데이터 비트 수
N=1000;

% 길이가 1000인 이진 벡터 data
% data=randint(1,N);
data=randi([0 1], N);

% x = 길이가 500인 수신 복소수 벡터
x=QPSK_mapper(data);

% 송신신호 x plot
subplot(1,2,1);
plot(x, 'bo');

y=awgn(x,10);

% 수신신호 y plot
subplot(1,2,2);
plot(y, 'b.');

 

[ 결과 ]

(왼쪽) noise 추가 전 송신 신호 x

(오른쪽) AWGN 채널 통과 후 수신 신호 y

 

 

 

 

 # 실습2    Demodulation(복조)

- 1000개의 데이터 비트 생성하여 송신 신호 x 생성

- 잡음 채널(AWGN) 통과 후 demepper 함수로 신호 복조하기

- 처음 binary data와 복조한 신호 y를 비교하여 잘 복조되었는지 확인

%% 실습 2
% QPSK demodulation

% 전송할 데이터 비트 수
N=1000;

% 길이가 1000인 이진 벡터 data
data=randi([0 1], N);

% x = 길이가 500인 수신 복소수 벡터
x=QPSK_mapper(data);

% AWGN 잡음 삽입
r=awgn(x,10);

% 수신기 함수 호출
y=QPSK_demapper(r);

 

[ 결과 ]

binary data 첫 10자리와 복조한 신호 y의 첫 10자리가 일치함을 확인.

복조가 성공적으로 이루어졌음.

 

 

 # 실습3    BER Curve

- 실습 1,2에서 진행한 변복조의 BER Curve를 그려본다.

%% 실습 4
% BER 곡선 그리기

% 전송할 데이터 비트 수
N=10000;

% 길이가 1000인 이진 벡터 data
data=randi([0 1], N, 1);

% Generate BER curve
SNR_dB = 0:10; % Range of SNR values in dB
SNR=10.^(SNR_dB/10);

BER_curve = zeros(size(SNR));

for i = 1:length(SNR)
    % QPSK 변조
    x = QPSK_mapper(data);

    % AWGN 잡음 삽입
    r = awgn(x, SNR(i));

    % QPSK 복조
    y = QPSK_demapper(r);

    % BER 계산
    % bit_errors = sum(data(:) ~= y(:));
    bit_errors = sum(xor(data(:), y(:)));
    BER_curve(i) = bit_errors / N;
end

% Plot the BER curve
semilogy(SNR, BER_curve, 'bo-');
xlabel('SNR (dB)');
ylabel('Bit Error Rate (BER)');
title('QPSK Bit Error Rate');
grid on;

 

[ 결과 ]