아래 포스팅에서 MATLAB BPSK BER simulation 에 대해 설명 드린적이 있는데요.

 

2011/03/08 - [통신] - [디지털 통신] BPSK, QPSK

2011/03/19 - [programming language/MATLAB] - MATLAB BPSK BER simulation in AWGN channel

2011/03/27 - [programming language/MATLAB] - MATLAB QPSK BER simulation in AWGN channel


오늘은 어떤 분이 질문을 하셔서 unipolar signaling을 한 경우의 BER simulation 을 해 보려 합니다.

 

일단 시뮬레이션의 Es 는 1 로 정규화하고, unipolar signaling 의 경우 M=2 이므로 최종적인 unipolar signaling 의 잡음 분산 수식은 BPSK 시뮬레이션과 마찬가지로 아래 수식이 됩니다.

 

하지만 unipolar signaling 이므로 비트 0을 0 으로 1 을 sqrt(2) 로 mapping 해야 평균 심볼 에너지가 1이 되게 됩니다.

 

다음으로 Decision Boundary 를 설정해야 는데, BPSK 인 경우에는 -1~1 사이의 딱 중간인 0을 Decision Boundary 설정했었죠~

 

Unipolar Signaling에서는 0 ~ sqrt (2) 사이의 딱 중간인 1/sqrt(2) 가 되겠죠~

 

물론 위에 계산 한 Decision Bound는 비트 1,0의 발생 확률이 같다는 가정하에서 계산되는 겁니다. 1, 0의 발생 확률이 다르다면 Decision Boundary 는 딱 중간이 안 됩니다.

 

다음으로 Unipolar Signaling 의 이론적인 BER 성능을 알아야겠죠~

 

이제 Unipolar Signaling 에 대한 AWGN 환경에서의 BER simulation 을 위한 준비는 다 된 거 같네요.

 

위 포스팅에서 했던 BPSK 시뮬레이션 코드에서 몇 군데만 손을 보면 다음과 같이 됩니다.

 

이미지로 올렸더니 오타 나시는 분들인 많은 것 같아서 코드로 올립니다.


clc

clear

close all 

 

N_bits=7000000; % 생성할 비트 수

Eb_No_dB=0:2:10; % Eb/N0 dB scale

BER_buffer=zeros(size(Eb_No_dB)); % BER 저장할 버퍼

 

 

for n=1:length(Eb_No_dB)

Eb_No_ral_scale= 10 ^(Eb_No_dB(n)/10); % Eb/N0 real scale 값 변환

sigma_v=sqrt(1./(2*Eb_No_ral_scale)); % 잡음의 표준 편차 값 계산

 

bits_v=randi([0 1],N_bits,1); % 비트 생성

Symbols=bits_v* sqrt(2); % symbol mapping

 

noise_v=randn(N_bits,1)*sigma_v; % AWGN 생성

 

tx_signal=Symbols + noise_v ; % 신호 + 잡음

 

demapped_bits= tx_signal > (1/sqrt(2)) ; % 수신단 demapping

 

BER_buffer(n)=sum(bits_v ~= demapped_bits) ./ N_bits; % BER calculation

 

fprintf('Eb/No= %g BER: %g\n',Eb_No_dB(n) ,BER_buffer(n))

end

 

%% 이론적인 Unipolar Signaling BER 계산

 

Eb_N0_theory=0:0.05:10 ;

snr=10.^ (Eb_N0_theory./10);

Ber_value_theory= 0.5*erfc(sqrt(snr)./sqrt(2)); % Theoretical Unipolar Signaling BER

 

%% 그래프 그리기

 

figure(1),semilogy(Eb_No_dB,BER_buffer,'b*',Eb_N0_theory,Ber_value_theory,'r--'), xlabel('Eb/No [dB]'), ylabel('BER')

grid,axis([0 10 0.000001 1]), legend('Simulated result','Theoretical Unipolar Signaling result')

 

결과는 다음과 같이 나오게 되는군요.

  

참조

http://www.mathworks.co.kr/matlabcentral/fileexchange/7458-bpsk-and-ask-simulation



  1. 답변부탁드릴게요 2013.11.19 07:14

    snr 계산에서 식이 snr=10.^(Eb_No_dB/10); 인 이유를 설명 부탁드려도 될까요

    • 남성 2013.11.19 18:12 신고

      DB 스케일을 real 스케일로 변환하는 겁니다.

    • 감사합니다 2013.12.04 19:48

      늦었지만 정말 감사드립니다

    • 남성 2013.12.06 03:11 신고

      도움 되셨다니 다행이네요~ ^^

  2. 통신 2015.01.13 19:52

    noise_v=randn(N_bits,1)*sigma_v 에서 왜 표준편차를 곱하죠?

    • 남성 2015.01.13 23:36 신고

      randn() 함수는 평균이 0 이고 분산 또는 표준편차가 1인 가우시안 랜덤 넘버를 생성하죠.
      위 시뮬레이션 코드에서는 평균이 0 이고 표준편차가 sigma_v 인 가우시안 랜덤 넘버를 생성해야 하니까 sigma_v 값을 곱해 준 겁니다. sigma_v 값을 계산하는 과정은 위 포스팅의 수식을 참조하시면 됩니다.

  3. 통신기사 2015.11.09 22:25

    너무 좋은자료 감사합니다. 그런데 저기 수신단mapping이라는 부분이 이해가 안되서 질문 드립니다.

    • 남성 2015.11.09 23:50 신고

      수신 신호가 1/sqrt(2) 보다 크면 비트 1 그렇지 안으면 비트 0 으로 판단하는 겁니다.

통신 시뮬레이션을 하면서 Root Raised Cosine Filter 는 많이들 사용하실 텐데요.

 

아래 포스팅에서 소개했다시피, Root Raised Cosine Filter Coefficient 는 Communications System Toolbox 의 rcosine() 함수를 통해서 구할 수가 있었습니다.

 

2011/03/02 - [programming language/MATLAB] - [디지털 통신] Raised Cosine Filter

2011/03/09 - [programming language/MATLAB] - [디지털 통신] EYE PATTERN


그런데 최근에 사용해보니 다음과 같이 향후에는 없어질 함수이니 fdesign.pulseshaping 을 사용하라고 나오더군요.

 

MATLAB 을 사용할 수 없는 환경에서는 OCTAVE 를 사용할 때, communications package 는 있지만 rcosfir, rcosflt 와 같은 함수들은 아직 제공되지 않더군요.

 

http://octave.sourceforge.net/communications/overview.html

 

Root Raised Cosine Filter Coefficient 수식을 보고 작성하는 방법도 있겠지만, 이런 코드들은 대부분 인터넷을 찾아보면 나오기 마련이라

 

찾아보니 아래 주소에 있더군요. 

http://www.mathworks.com/matlabcentral/fileexchange/14809-m-qam-modulation-and-demodulation

 

위 주소에서 다음 그림과 같이 QAM.zip 파일을 다운로드 한 후에 압축을 해제 합니다. 파일 이름에서도 알 수 있겠지만, QAM 변복조 함수들이 포함되어 있더군요.

 

 

몇가지 함수 중에 my_rrc.m 함수가 Root Raised Cosine Filter Coefficient 를 생성하는 함수 입니다.

 

함수 원형이 다음과 같으니 네 개의 변수를 넣는다는건 아실테고~ 위에서 설명드린 rcosine() 함수와 비슷하더군요.

 

function f = my_rrc(fd, fs, beta, delay)

% MY_RRC Produces the impulse response of a root raised cosine filter

% F = MY_RRC(Fd, Fs, BETA, DELAY) is the impulse response of a root

% raised cosine FIR filter with rolloff factor BETA and delay DELAY. 


fd 는 원 신호의 sample rate, fs 는 oversample rate, beta 는 Root Raised Cosine Filter 의 rolloff factor, delay 는 말 그대로 filter 의 delay 심볼 수 입니다.

 

제가 테스트 해보니

 

Sqrt_r_filter= rcosine(1e6, 8e6, 'sqrt', 0.2, 3);

Sqrt_r_filter_2=my_rrc(1e6,8e6,0.2,3);

D=Sqrt_r_filter_2(:)-Sqrt_r_filter(:)

plot(D)

 

차이가 10-16 대로 동일한 계수가 나오더군요.

 

간단하게 Root Raised Cosine Filter 를 roll off 에 따라 그려봤습니다.

 

Sqrt_r_filterAll=[];

legCell={};

 

n=1;

for r=0.2:.2:.9

Sqrt_r_filterAll(:,n)=my_rrc(1e6,8e6,r,3);

legCell{n}=num2str(r);

n=n+1;

end

 

figure,

plot(Sqrt_r_filterAll), grid on

legend(legCell)

OCTAVE 에서도 확인해보니 정상적으로 Root Raised Cosine Filter Coefficient 가 나오더군요. 




+ Recent posts