본문 바로가기
programming language/MATLAB

MATLAB FSK(Frequency Shift Keying) BER simulation

by __observer__ 2013. 12. 27.
반응형

MATLAB 을 이용한 통신 시뮬레이션 코드를 찾다 보니 아래 주소의 블로그를 발견했다.

 

http://www.dsplog.com/

 

대단히 자세한 이론 설명과 훌륭한 MATLAB 예제 코드들을 보면 디지털 통신을 공부하는데 정말 부족함이 없어 보인다.

 

학부 시절에 FSK(Frequency Shift Keying)를 공부하면서~ BER(Bit Error Rate) 시뮬레이션 까지는 못해봤던 것 같은데~

 

아래 주소에 Frequency Shift Keying BER 시뮬레이션 코드가 있었다.

 

http://www.dsplog.com/2007/08/30/bit-error-rate-for-frequency-shift-keying-with-coherent-demodulation/

 

이론적 설명도 자세하고 세부 코드까지 포함되어 있어서 굉장히 도움이 많이 되는 포스팅이라는 생각이 든다.

 

아래 코드는 저자의 시뮬레이션 코드에 스펙트럼 확인을 하기 위해 몇 가지 코드를 추가한 예이다. 내가 추가한 부분은 빨간색으로 표시했다.

 

아래 코드에서 T 변수의 주석에 symbol duration 이라고 되어 있어서 약간 헷갈렸지만~ 변수 T 가 Sampling Rate(Fs)이다.

 

암튼 저자의 FSK simulation 코드를 보면 Coherent FSK 복조까지 명확하게 알 수 있어서 FSK 를 공부하는 분들이 참조하기에 대단히 좋은 코드라는 생각이 든다.

 

아래 코드에서 내가 스펙트럼을 확인하기 위해 사용한 pwelch() 함수를 사용하기 위해서는 MATLAB Signal Processing Toolbox 가 있어야 한다.

 

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% All rights reserved by Krishna Pillai, http://www.dsplog.com

% The file may not be re-distributed without explicit authorization

% from Krishna Pillai.

% Checked for proper operation with Octave Version 3.0.0

% Author    : Krishna Pillai

% Email        : krishna@dsplog.com

% Version    : 1.0

% Date        : 05 June 2008

% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

 

% Simple Matlab example of binary Frequency Shift Keying using

% coherent demodulation

 

clear

N = 10^5 % number of bits or symbols

T = 8; % symbol duration

Fs=T; % Sampling Rate

t = [0:1/T:0.99]; % sampling instants

tR = kron(ones(1,N),t); % repeating the sampling instants

 

Eb_N0_dB = [0:11]; % multiple Eb/N0 values

 

for ii = 1:length(Eb_N0_dB)

% generating the bits

ip = rand(1,N)>0.5; % generating 0,1 with equal probability

freqM = ip+1; % converting the bits into frequency, bit0 -> frequency of 1, bit1 -> frequency of 2

freqR = kron(freqM,ones(1,T)); % repeating

x = (sqrt(2)/sqrt(T))*cos(2*pi*freqR.*tR); %generating the FSK modulated signal

 

% noise

n = 1/sqrt(2)*[randn(1,N*T) + j*randn(1,N*T)]; % white gaussian noise, 0dB variance

 

% coherent receiver

y = x + 10^(-Eb_N0_dB(ii)/20)*n; % additive white gaussian noise

op1 = conv(y, sqrt(2/T)*cos(2*pi*1*t)); % correlating with frequency 1

op2 = conv(y, sqrt(2/T)*cos(2*pi*2*t)); % correlating with frequency 2

 

% demodulation

ipHat = [real(op1(T+1:T:end)) < real(op2(T+1:T:end))]; %

nErr(ii) = size(find([ip - ipHat]),2); % counting the number of errors

 

end

simBer = nErr/N;

theoryBer = 0.5*erfc(sqrt((10.^(Eb_N0_dB/10))/2)); %theoretical BER

 

close all

figure

semilogy(Eb_N0_dB,theoryBer,'b-');

hold on

semilogy(Eb_N0_dB,simBer,'mx-');

axis([0 11 10^-4 0.5])

grid on

legend('theory:fsk-coh', 'sim:fsk-coh');

xlabel('Eb/No, dB')

ylabel('Bit Error Rate')

title('Bit error probability curve')

 

 

%%

 

figure

pwelch(y,1024,512,1024,Fs)

 

위 MATLAB 코드를 실행시켜보면 다음과 같이 Coherent Frequency Shift Keying BER 과 FSK Power Spectral Density 그래프를 확인 할 수 있다.


< Coherent Frequency Shift Keying BER >

< Coherent FSK Power Spectral Density >

 

정확히 주파수 1, 2 Hz 에 톤이 뜨는 것을 확인 할 수 있다.


반응형

댓글