[ 통신시스템설계 ] 02. BPSK/QPSK 변조기법
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)
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;
[ 결과 ]