블로그 이미지
Salt n Light

calendar

        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30  

Notice

Recent Comment

Recent Trackback

Archive

2008.03.15 16:32 Season#2 - M.S./Programming
본 강의의 자세한 설명은 곧 추가될 예정입니다.

 당초 강의 목표는 FIR 필터의 개념을 잡고 BPSK, QPSK, QAM 의 개념, 그리고 더 나아가서는 CDMA 방식을 시뮬레이션을 통하여 보여드리는 것이었습니다. 그러나, 이미 이들에 대한 자료는 인터넷 상이나 서적을 통하여 충분히 소개되어왔습니다. 그래서 이번 강의에서는 예전부터 연구는 되어 왔지만 최근들어 부각되고 있는 OFDM 시스템을 주제로 잡고자 합니다. 오늘은 OFDM 시스템 시뮬레이션에 대한 좋은 자료가 있어 소개하도록 하겠습니다. 본 자료는 원래 조지아텍의 Smart Antenna Research Laboratory 에 계시는 Mary Ann Ingram 교수팀 주도하에 2000년도 8월에 만들어진 자료로서 매트랩을 이용하여 OFDM 시스템의 수신단과 송신단을 시뮬레이션한 자료입니다. OFDM이라는 방식을 시뮬레이션을 통하여 체계적으로 설명한 유일한 자료 같아 소개합니다. 원 자료에 있는 약간의 코딩에러를 수정하고 설명을 덧붙여서 설명해 나가도록 하겠습니다. 이 자료 이외에 참고할 만한 책들은 Artech House 출판사에서 나온 Hiroshi Harada, Ramjee Prasad 저 "Simulation and Software Radio for Mobile communications" 과 Kluwer 출판사에서 나온 Michel C. Jeruchim, Philip Balabn, K. Sam Shanmugan 저 "Simulation of Communication Systems" 그리고 Prentice Hall 에서 나온 William H. Tranter, K. Sam Shanmungan, Theodore S. Rappaport, Kurt L. Kosbar 저 "Principles of Communication Systems Simulation with Wireless Applications" 입니다. 이 책들은 구지 OFDM 뿐만 아니라 여러가지 통신방식에 대한 고찰을 해보고 시뮬레이션을 해볼 수 있는 책들이므로 권장해드립니다.



 최근들어 광대역 통신을 위해서 고속 데이터 전송이 일반화되고 있습니다. 그러나 고속 데이터 전송 방식을 채택하다 보니 인접 심볼끼리 영향을 미치는 ISI (intersymbol interference)가 문제점으로 부각되고 있습니다. 고속 데이터 전송시에는 다중경로 페이딩 현상으로 생기는 채널 임펄스 응답 지연시간이 대상 심볼의 폭을 넘어가다 못해 아예 그 다음 심볼의 영역까지 침범해버리는 현상이 발생하게 됩니다. 이러한 문제를 해결하는 방법 중 하나는 수신단에 adaptive equalizer 를 사용하는 것이지만 고속 DSP 칩을 하드웨어적으로 구현해야 하기 때문에 가격대가 만만치 않게 됩니다. 그래서 고안된 무선통신 변조방식이 바로 OFDM 기술입니다. OFDM은 기본적으로 병렬 데이터 전송 방식으로 Multi-Carrier Modulation 을 구현한 기술이기 때문에 다중경로 페이딩을 줄일 수가 있고 결국 수신단에서의 equalizer 구성이 좀 더 수월하게 됩니다. OFDM은 무선 LAN (WLAN)에 쓰이며 미국 같은 경우 IEEE 802.11 에 적용되고 있습니다. 최근에는 WiBro 의 통신 방식으로 연구되고 있죠. (HSDPA 시스템의 기술로도 쓰일 수 있다는 이야기도 있지만 아직까지 구체적인 계획은 없습니다.) 자, 그럼 병렬 데이터 방식이 무엇인지부터 알아보도록 합시다. 그림 1의 (a)에서 볼 수 있듯이 1 채널로 데이터를 직렬전송하게 되면 임펄스 응답이 다음 심볼에까지 영향을 미치게 됩니다. 그러므로 그림 1의 (b) 처럼 이를 여러 채널로 대체하게 되면 다음 심볼에 임펄스 응답의 효과를 줄일 수가 있습니다. 더 나아가서 OFDM 심볼 사이에 Guard Interval 을 주면 그림 3에서 볼 수 있는 것처럼 임펄스 응답 효과를 최소화 할 수 있습니다. 이런 방식을 병렬 데이터 전송 방식이라고 하는 것입니다. 그런데 그림 4에서 볼 수 있듯이 병렬 데이터 전송 방식을 주파수 도메인에서 보게 되면 각 채널들이 인접하게 되는 양상을 보입니다. 그러므로 각각의 채널들을 구분할 수 있는 멀티플렉싱이 필요하게 되며 이를 효과적으로 구현할 수 있은 방식이 바로 OFDM(직교 주파수 분할 멀티플렉싱) 방식인 것입니다. 물론 OFDM 방식이라고 장점만 있는 것은 아닙니다. 구현방식상 주파수 오차에 상당히 민감하고 신호의 PAR(peak to average ratio)가 상당히 큰 단점이 있습니다. PAR 가 크면 수신단에서는 선형성 개선에 문제가 발생할 수 있으며 High Power Amplifier 단에서는 효율문제가 발생할 수 밖에 없습니다. 요즘엔 송신단에서 OFDM신호가 응용되고 있는 상황이기 때문에 High Power Amplifier 를 연구하시는 분들(특히 기지국쪽)에겐 OFDM 신호입력에 대한 증폭기의 효율을 개선하는 것이 가장 큰 골치거리일 것입니다.



사용자 삽입 이미지
 
 
그림 1. (a) 직렬 전송 (b) 병렬 전송 [직교주파수(OFDM)방식]
 
 

사용자 삽입 이미지
 

그림 2. 송신단에서의 Guard Interval 삽입 (a) 삽입 전 (b) Guard Interval 삽입 (c) 삽입 후 신호의 주기 연장

 
 


 

그림 3. 주파수 도메인에서 본 Guard Interval 효과

사용자 삽입 이미지
그림 4. 채널 인접 현상



 이제 본론으로 들어가서 실제 필드에 쓰이는 OFDM 방식의 시스템을 살펴보도록 하겠습니다. 아래 그림에 나와 있는 시스템은 유럽에서 표준으로 쓰이는 디지털 비디오 방송(DVB-T) 송신기의 구조입니다.


 

사용자 삽입 이미지

그림 5. 디지털 비디오 방송 송신기





 일반적으로  OFDM 신호는 다음 식과 같이 정의됩니다.



수식 (1)



여기서 di 는 모듈레이션 심볼(원칙적으로 복소수)을 나타내며 Ns 는 부 캐리어의 숫자,  T는 심볼 주기. fc 는 캐리어 주파수를 나타냅니다. 그런데 DVB-T 와 같은 특정 방식에 사용되는 OFDM 신호는 아래와 같이 정의될 수 있습니다.
 

사용자 삽입 이미지

수식 (2), (3)






표 1. 위 수식들에 쓰이는 일반적인 값들

 



우리가 수식 (2)를 t=0부터 t=Ts까지로 보기로 하고 다시 적어주면 수식 (4)를 도출할 수가 있습니다

사용자 삽입 이미지
. 그런데 여기서 주의해서 보아야 할 것은 아래에서 볼 수 있듯이 수식 (4)와 IFFT 수식인 수식 (5)가 유사한 형태를 지니고 있다는 것입니다.

수식 (4)
 
 
 
 


수식 (5)



사용자 삽입 이미지

자, 이제부터는 송신부와 수신부를 각각 나누어 시뮬레이션 하는 과정에 대해서 단계별로 설명하도록 하겠습니다. 우선 송신부를 보도록 하겠습니다.





송신부




 

OFDM 송신단

사용자 삽입 이미지


 본격적인 코딩에 앞서서 Matlab에서 우선 기본적인 변수값들을 다음과 같이 정의해줍니다.


%DVB-T 2K Transmission
%The available bandwidth is 8 MHz
%2K is intended for mobile services

clear all;
close all;


%DVB-T Parameters

Tu=224e-6;       %useful OFDM symbol period
T=Tu/2048;       %baseband elementary period
G=0;               %choice of 1/4. 1/8, 1/16, and 1/32
delta=G*Tu;      %guard band duration
Ts=delta+Tu;     %total OFDM symbol period
Kmax=1705;       %number of subcarriers
Kmin=0;
FS=4096;          %IFFT/FFT length
q=10;              %carrier period to elementary period ratio
fc=q*1/T         %carrier frequency
Rs=4*fc;         %simulation period
t=0:1/Rs:Tu;




A 지점 (4 QAM Symbol Generation)


 A 지점에서는 1705 개의 4QAM 심볼을 발생시킵니다. 코드는 다음과 같습니다.


%Data generator (A)

M=Kmax+1;
rand('state',0);
a=-1+2*round(rand(M,1)).'+i*(-1+2*round(rand(M,1))).';
A=length(a);
info=zeros(FS,1);
info(1:(A/2))=[a(1:(A/2)).'];   %Zero padding
info((FS-((A/2)-1)):FS)=[a(((A/2)+1):A).'];




B 지점 (Sub-carrier Generation)


B 지점에서는 4096의 길이를 가지는 IFFT 연산을 수행하여 subcarrier 를 발생시킵니다. 코드와 그림은 다음과 같습니다.



%Subcarriers generation (B)

carriers=FS.*ifft(info,FS);
tt=0:T/2:Tu;
figure(1);
subplot(211);
stem(tt(1:20),real(carriers(1:20)));
subplot(212);
stem(tt(1:20),imag(carriers(1:20)));
figure(2);
f=(2/T)*(1:(FS))/(FS);
subplot(211);
plot(f,abs(fft(carriers,FS))/FS);
subplot(212);
pwelch(carriers,[],[],[],2/T);



 
 
Time response

사용자 삽입 이미지
 
Frequency response
사용자 삽입 이미지



B 지점 이후로는 D/A 변환 작업이 있어야 합니다. 그래서 우선적으로 Pulse shaping 을 하게됩니다. 코드와 그림은 다음과 같습니다.


% D/A simulation

L=length(carriers);
chips=[carriers.';zeros((2*q)-1,L)];
p=1/Rs:1/Rs:T/2;
g=ones(length(p),1);  %pulse shape
figure(3);
stem(p,g);
dummy=conv(g,chips(:));
u=[dummy(1:length(t))];   % (C)
figure(4);
subplot(211);
plot(t(1:400),real(u(1:400)));
subplot(212);
plot(t(1:400),imag(u(1:400)));
figure(5);
ff=(Rs)*(1:(q*FS))/(q*FS);
subplot(211);
plot(ff,abs(fft(u,q*FS))/FS);
subplot(212);
pwelch(u,[],[],[],Rs);


B 지점 => C 지점 사이의 Pulse

사용자 삽입 이미지
 
Pulse shape
 
 
 
 
C 지점(Pulse Shaping)

사용자 삽입 이미지
 
Time response

사용자 삽입 이미지
 
Frequency response
 
 
 
D 지점에서는 완벽한 아날로그 신호를 생성하기 위하여 reconstruction filter 를 거치는 작업을 수행하게 됩니다. 코드와 그림은 다음과 같습니다.
 
[b,a]=butter(13,1/20); %reconstruction filter
[H,F]=FREQZ(b,a,FS,Rs);
figure(6);
plot(F,20*log10(abs(H)));
uoft=filter(b,a,u);   
%baseband signal (D)
figure(7);
subplot(211);
plot(t(80:480),real(uoft(80:480)));
subplot(212);
plot(t(80:480),imag(uoft(80:480)));
figure(8);
subplot(211);
plot(ff,abs(fft(uoft,q*FS))/FS);
subplot(212);
pwelch(uoft,[],[],[],Rs);
 
 
D 지점 (Reconstrucion Filtering)

 
 
Time response

사용자 삽입 이미지
사용자 삽입 이미지
Frequency response
 
 
 
 
 
 
이 상태에서 모듈레이션을 수행하게 되면 다음 수식과 같이 신호를 정의할 수가 있을 것입니다.
사용자 삽입 이미지
 
 앞에서도 언급했듯이 우리가 최종신호를 도출하는 방식은 수식(4)와 수식(5)의 두가지 방식이 있습니다. IFFT 방식인 (5)식을 다시 자세히 쓰면 다음 수식과 같이 전개됩니다.
 

사용자 삽입 이미지

 
모듈레이션 신호를 다시 다음과 같이 재정의해보겠습니다.
 
사용자 삽입 이미지
 
 
위 신호를 시간영역과 주파수 영역에서 보도록 하겠습니다. Direct 방식과 IFFT 방식 사이의 차이를 아래 그림에서 보실 수 있을 것입니다. 두 방식의 차이는 보시다시피 그렇게 차이가 나지 않습니다. Direct 방식은 시간상으로도 Pentium IV 2.6GHz 컴퓨터에서 약 3분의 시간이 걸린 반면 IFFT 방식은 0.25 초 밖에는 걸리지 않으므로 IFFT 방식이 얼마나 효율적인 방식인지를 알 수가 있습니다. 또한 우리가 눈여겨 보아야 할것은 시간영역 신호를 보시면 알 수 있듯이 신호의 PAR상당히 크다는 것입니다. Direct 방식과 IFFT 방식의 비교를 위한 코드와 그림은 아래와 같습니다.
 
 
%DVB-T 2K signal generation Eq. (4) vs. 2N-IFFT
clear all;
close all;
tic
Tu=224e-6;  
  %useful OFDM symbol period
T=Tu/2048;     %baseband elementary period 
G=0;              %choice of 1/4, 1/8, 1/16. and 1/32 
delta=G*Tu;  
%guard band duration
Ts=delta+Tu;  
%total OFDM symbol period
Kmax=1705;     %number of subcarriers
Kmin=0;
FS=4096;       
%IFFT/FFT length
q=10;            %carrier period to elementary period ratio
fc=q*1/T;      %carrier frequency
Rs=4*fc;       %simulation period
 
M=Kmax+1;
rand('state',0);
a=-1+2*round(rand(M,1)).'+i*(-1+2*round(rand(M,1))).';
A=length(a);
info=[a.'];
tt=0:1/Rs:Ts;
TT=length(tt);
k=Kmin:Kmax;
for t=0:(TT-1);        
  % Eq. (4)
    phi=a(k+1).*exp((1j*2*(((t*(1/Rs))-delta))*pi/Tu).*((k-(Kmax-Kmin)/2)));
    s(t+1)=real(exp(1j*2*pi*fc*(t*(1/Rs))).*sum(phi));
end
toc
tic
infof=zeros(FS,1);
infof(1:(A/2))=[a(1:(A/2)).'];
infof((FS-((A/2)-1)):FS)=[a(((A/2)+1):A).'];
carriers=FS.*ifft(infof,FS);       % IFFT
 
%Upconverter
L=length(carriers);
chips=[carriers.';zeros((2*q)-1,L)];
p=1/Rs:1/Rs:T/2;
g=ones(length(p),1);
dummy=conv(g,chips(:));
u=[dummy(1:TT)];
[b,a]=butter(13,1/20);
uoft=filter(b,a,u);
s_tilde=(uoft.').*exp(1i*2*pi*fc*tt);
sf=real(s_tilde);
toc
figure(1);
plot(tt,sf,'b');
axis([0 1.4*10^-6 -150 150]);
figure(2)
plot(tt,s,'r');
axis([0 1.4*10^-6 -150 150]);
figure(3);
pwelch(s,[],[],[],Rs);
hold on;
pwelch(sf,[],[],[],Rs);
 
 
 
 

E 지점(IFFT 방식)

 
Time response

사용자 삽입 이미지
 
Frequency response
 
 
 
 
E 지점(Direct 방식)
 
 
 
Time response
 
 
 
 
Direct Simulation Vs IFFT
 
사용자 삽입 이미지
IFFT vs (2.1.4) 비교





수신부




이제는 수신부를 보도록 하겠습니다.

사용자 삽입 이미지

 

OFDM 수신단




수신단 시뮬레이션 이전에 r(t) 를 정의하기 위해 간단한 송신단 시뮬레이션 코드를 아래와 같이 먼저 작성합니다.


%DVB-T 2K Reception

clear all;
close all;


Tu=224e-6;       %useful OFDM symbol period
T=Tu/2048;       %baseband elementary period
G=0;              
%choice of 1/4, 1/8, 1/16, and 1/32
delta=G*Tu;     
%guard band duration
Ts=delta+Tu;     %total OFDM symbol period
Kmax=1705;       %number of subcarriers
Kmin=0;
FS=4096;        
%IFFT/FFT length
q=10;             
%carrier period to elementary ratio
fc=q*1/T;        %carrier frequency
Rs=4*fc;         %simulation period
t=0:1/Rs:Tu;
tt=0:T/2:Tu;

%Data generator
sM=2;
[x,y]=meshgrid((-sM+1):2:(sM-1),(-sM+1):2:(sM-1));
alphabet=x(:)+1i*y(:);
N=Kmax+1;
rand('state',0);
a=-1+2*round(rand(N,1)).'+i*(-1+2*round(rand(N,1))).';
A=length(a);
info=zeros(FS,1);
info(1:(A/2))=[a(1:(A/2)).'];
info((FS-((A/2)-1)):FS)=[a(((A/2)+1):A).'];
carriers=FS.*ifft(info,FS);

%Upconverter
L=length(carriers);
chips=[carriers.'; zeros((2*q)-1,L)];
p=1/Rs:1/Rs:T/2;
g=ones(length(p),1);
dummy=conv(g,chips(:));
u=[dummy; zeros(46,1)];
[b,aa]=butter(13,1/20);
uoft=filter(b,aa,u);
delay=64;                  
%Reconstruction filter delay
s_tilde=(uoft(delay+(1:length(t))).').*exp(1i*2*pi*fc*t);
s=real(s_tilde);



 자 이제는 수신된 신호를 Down conversion 한 후 F지점에서 확인하는 코드와 그림을 보도록 하겠습니다.


%OFDM RECEPTION

%Downconversion
r_tilde=exp(-1i*2*pi*fc*t).*s; 
figure(1);
subplot(211);
plot(t,real(r_tilde));
axis([0e-7 12e-7 -60 60]);
grid on;
figure(1);
subplot(212);
plot(t,imag(r_tilde));
axis([0e-7 12e-7 -100 150]);
grid on;
figure(2);
ff=(Rs)*(1:(q*FS))/(q*FS);
subplot(211);
plot(ff,abs(fft(r_tilde,q*FS))/FS);
grid on;
figure(2);
subplot(212);
pwelch(r_tilde,[],[],[],Rs);


F 지점
 

 
 
Time response

사용자 삽입 이미지
 
Frequency response
사용자 삽입 이미지
 
 
 
 
 
  이제는 다시 reconstruction filtering 을 수행하여 Baseband 신호를 추출하는 코드와 그림을 보도록 하겠습니다.
 
%Carrier suppression
[B,AA]=butter(3,1/2);
r_info=2*filter(B,AA,r_tilde);
%Baseband signal continuous-time (G)
figure(3);
subplot(211);
plot(t,real(r_info));
axis([0 12e-7 -60 60]);
grid on;
figure(3);
subplot(212);
plot(t,imag(r_info));
axis([0 12e-7 -100 150]);
grid on;
figure(4);
f=(2/T)*(1:(FS))/(FS);
subplot(211);
plot(ff,abs(fft(r_info,q*FS))/FS);
grid on;
subplot(212);
pwelch(r_info,[],[],[],Rs);
 
 
 
G 지점 (Analog Baseband Signal)

사용자 삽입 이미지
 
Time response
 

사용자 삽입 이미지
 
Frequency response
 
 
 
  다음 단계는 추출된 Analog Baseband 신호를 샘플링하여서 Discrete 한 신호를 만들어주는 것입니다. 코드와 그림은 다음과 같습니다.
 

%Sampling

r_data=real(r_info(1:(2*q):length(t)))...           %Baseband signal, discrete-time
    +1i*imag(r_info(1:(2*q):length(t)));            % (H)

figure(5);
subplot(211);
stem(tt(1:20),(real(r_data(1:20))));
axis([0 12e-7 -60 60]);
grid on;

figure(5);
subplot(212);
stem(tt(1:20),(imag(r_data(1:20))));
axis([0 12e-7 -100 150]);
grid on;
figure(6);
f=(2/T)*(1:(FS))/(FS);
subplot(211);
plot(f,abs(fft(r_data,FS))/FS);
grid on;
subplot(212);
pwelch(r_data,[],[],[],2/T);

 
 
 
 
 
H 지점 (Discrete Baseband Signal)

 
Time response

사용자 삽입 이미지
 
 
Frequency response
 
 
  이제 마지막 작업은 FFT 를 통하여 원래 심볼을 최총추출하고 그 Constellation 을 확인하는 것입니다. 코드와 그림은 아래와 같습니다.
 
%FFT
info_2N=(1/FS).*fft(r_data,FS);               % (I)
info_h=[info_2N(1:A/2) info_2N((FS-((A/2)-1)):FS)];
%Slicing
for k=1:N,
    a_hat(k)=alphabet((info_h(k)-alphabet)==min(info_h(k)-alphabet));  
% (J)
end;
figure(7)
plot(info_h((1:A)),'.k');
title('info-h Received Constellation');
axis square;
axis equal;
figure(8)
plot(a_hat((1:A)),'or');
title('a_hat 4-QAM');
axis square;
axis equal;
grid on;
axis([-1.5 1.5 -1.5 1.5]);
 
 
I 지점 (Constellation)

사용자 삽입 이미지
 
 
J 지점 (Constellation)

사용자 삽입 이미지

 
출처 HEART!! | 하루살이
원본 http://blog.naver.com/eajnis/100026140682
posted by Salt n Light