SangQ
Matlab을 이용한 간단한 OFDM Signal Simulation 본문
개요
1. OFDM Sequence
2. OFDM Design &Channel & Data Comparison
3. Changion Channel
1. OFDM Sequence
2. OFDM Design
1) Random data = X(K), Y(K)
: 송신신호를 만들기위해서 Random Data를 발생시키는 부분이다.
k=linspace(1,64,64); % 64개의 Sub carrier
n=k;
for K=k
X(K)=round(rand());
if X(K)==0
X(K)=-1;
end
end % Real Part
for K=k
Y(K)=round(rand());
if Y(K)==0
Y(K)=-1;
end
end % Imaginary Part
% X(K), Y(K) 각각 64개의 Random한 data 발생
2) D(K) = X(K)+j(K)
: 랜덤한 신호를 real part 와 imag part 로 만들어 전송데이터를 만든다.
tx_data(n)=(ifft(TX_DATA(k)));
figure(2)
stem(tx_data)
title('시간 영역의 Transmission Data')
3) d(n) = IFFT (D(K))
: 전송데이터를 ifft 를 이용하여 시간영역에서 주파수영역으로 변환 시키다.
tx_data(n)=(ifft(TX_DATA(k)));
figure(2)
stem(tx_data)
title('시간 영역의 Transmission Data')
4) CP(Cyclic Prefix) added
: CP는 딜레이로 인한 신호들간의 간섭으로 인한 오류를 없애주는 구간으로 전송할 데이터의 뒷부분..
1/4정도의 크기를 앞에 붙인다.
CPplus_tx=[tx_data(49:64) tx_data]; % 원래 길이의 1/4
figure(3)
stem(CPplus_tx)
title('CP 첨가 된 Transmission Data')
5) Channel Passage
: 전송데이터를 전송하면서 채널에 통과시키는 부분이다.
n1=1:64;
n0=1;
delta=[(n1-n0)==0];
h=delta(n1)+0.5*[delta(62:64) delta(1:61)]; % 채널생성
figure(4)
stem(fft(h))
title('Channel')
rx_data=conv(CPplus_tx,h);
figure(5)
stem(rx_data)
title('Channel 통과')
6) Remove CP = r(n)
: 채널을 통과하뎌 수신된 신호의 CP부분과 뒤에 필요없는 부분을 잘라내는 부분이다.
CPminus_rx=[rx_data(17:80)];
figure(6)
stem(CPminus_rx)
title('시간 영역에서 CP 제거 된 Receive Data')
7) R(K) = FFT (r(n))
: FFT를 이용하여 송신된 시간영역의 신호를 주파수영역으로 변환하는 부분이다.
RX_DATA=fft(CPminus_rx);
figure(7)
stem(RX_DATA)
title('주파수 영역에서 Receive Data')
8) Channel 보상
: 원래는 처음에 송신신호를 모두가 다 아는 신호로 보내어 채널을 추정하고 원래의 보내고자하는 신호를 보내어 채널보상을 통해 수신신호를 알아내는것인데, 송신한신호를 알고있다고 가정하고 채널을 추정하여 그 추정한 채널을 통해 송신데이터를 알아내는 부분이다.
Estimaion_Channel=RX_DATA./TX_DATA; % 채널 추정
Estimaion_Data=RX_DATA./Estimaion_Channel; % 채널 보상
figure(8)
stem(Estimaion_Channel) % 추정한 채널
hold on
stem(fft(h),'r*') % 원래의 채널
title('추정한 채널')
hold off
figure(9)
stem(Estimaion_Data)
title('추정된 데이터')
axis([0 70 -1 1])
9) ML(Maximum Likelihood) 판정
: ML판정으로 알지못하는 신호들을 정확한 값으로 바꿔주는 부분이다.
그리고 처음 송신한 데이터와 ML판정되어 수신된 데이터를 비교하여보았다.
for L=k
Rml(L)=real(Estimaion_Data(L)); Iml(L)=imag(Estimaion_Data(L));
if Rml(L)>0 Rml(L)=1;
else Rml(L)=-1;
end
if Iml(L)>0 Iml(L)=1;
else Iml(L)=-1;
end
end
Rml(1)=0; Rml(28:38)=0;
Iml(1)=0; Iml(28:38)=0;
ml=Rml+Iml*i;
figure(10)
stem(ml)
hold on
stem(TX_DATA, 'r*')
title('ML 판정을 한 최종데이터')
hold off
3. Changion Channel
: 채널을 변경하여 위와 같이 하여 다시 Sinulation 시켜봤다.
h=delta(n1)+0.2*[delta(64) delta(1:63)]+0.8*[delta(63:64) delta(1:62)]...
+0.5*[delta(62:64) delta(1:61)]; % h 변경
4. 설계를 마치며
: 시뮬레이션된 송신신호와 수신신호가 완전히 일치하는것을 볼수있다. 이는 전송데이터를 잘 알고있다고 가정하고한 시뮬레이션이라서 그런것 같다. 실제로는 noise가 섞여서 모든 신호들이 일치하지는 않는다.
노이즈를 첨가하여 실험해보았으나...결과 값이 제대로 나왔는지 제대로 나오지 않았는지 잘 몰라서 이 글에 올리지 않았다.
이 설계를 통해 OFDM의 데이터 전속방식에해한 이해를 할 수 있었던거 같다 ^0^
1. OFDM Sequence
2. OFDM Design &Channel & Data Comparison
3. Changion Channel
1. OFDM Sequence
2. OFDM Design
1) Random data = X(K), Y(K)
2) D(K) = X(K)+j(K)
3) d(n) = IFFT (D(K))
4) CP(Cyclic Prefix) added
5) Channel Passage
6) Remove CP = r(n)
7) R(K) = FFT (r(n))
8) Channel 보상
9) ML(Maximum Likelihood) 판정
1) Random data = X(K), Y(K)
: 송신신호를 만들기위해서 Random Data를 발생시키는 부분이다.
k=linspace(1,64,64); % 64개의 Sub carrier
n=k;
for K=k
X(K)=round(rand());
if X(K)==0
X(K)=-1;
end
end % Real Part
for K=k
Y(K)=round(rand());
if Y(K)==0
Y(K)=-1;
end
end % Imaginary Part
% X(K), Y(K) 각각 64개의 Random한 data 발생
2) D(K) = X(K)+j(K)
: 랜덤한 신호를 real part 와 imag part 로 만들어 전송데이터를 만든다.
tx_data(n)=(ifft(TX_DATA(k)));
figure(2)
stem(tx_data)
title('시간 영역의 Transmission Data')
3) d(n) = IFFT (D(K))
: 전송데이터를 ifft 를 이용하여 시간영역에서 주파수영역으로 변환 시키다.
tx_data(n)=(ifft(TX_DATA(k)));
figure(2)
stem(tx_data)
title('시간 영역의 Transmission Data')
4) CP(Cyclic Prefix) added
: CP는 딜레이로 인한 신호들간의 간섭으로 인한 오류를 없애주는 구간으로 전송할 데이터의 뒷부분..
1/4정도의 크기를 앞에 붙인다.
CPplus_tx=[tx_data(49:64) tx_data]; % 원래 길이의 1/4
figure(3)
stem(CPplus_tx)
title('CP 첨가 된 Transmission Data')
5) Channel Passage
: 전송데이터를 전송하면서 채널에 통과시키는 부분이다.
n1=1:64;
n0=1;
delta=[(n1-n0)==0];
h=delta(n1)+0.5*[delta(62:64) delta(1:61)]; % 채널생성
figure(4)
stem(fft(h))
title('Channel')
시간영역에서의 채널
주파수영역에서의 채널
figure(5)
stem(rx_data)
title('Channel 통과')
6) Remove CP = r(n)
: 채널을 통과하뎌 수신된 신호의 CP부분과 뒤에 필요없는 부분을 잘라내는 부분이다.
CPminus_rx=[rx_data(17:80)];
figure(6)
stem(CPminus_rx)
title('시간 영역에서 CP 제거 된 Receive Data')
7) R(K) = FFT (r(n))
: FFT를 이용하여 송신된 시간영역의 신호를 주파수영역으로 변환하는 부분이다.
RX_DATA=fft(CPminus_rx);
figure(7)
stem(RX_DATA)
title('주파수 영역에서 Receive Data')
8) Channel 보상
: 원래는 처음에 송신신호를 모두가 다 아는 신호로 보내어 채널을 추정하고 원래의 보내고자하는 신호를 보내어 채널보상을 통해 수신신호를 알아내는것인데, 송신한신호를 알고있다고 가정하고 채널을 추정하여 그 추정한 채널을 통해 송신데이터를 알아내는 부분이다.
Estimaion_Channel=RX_DATA./TX_DATA; % 채널 추정
Estimaion_Data=RX_DATA./Estimaion_Channel; % 채널 보상
figure(8)
stem(Estimaion_Channel) % 추정한 채널
hold on
stem(fft(h),'r*') % 원래의 채널
title('추정한 채널')
hold off
figure(9)
stem(Estimaion_Data)
title('추정된 데이터')
axis([0 70 -1 1])
9) ML(Maximum Likelihood) 판정
: ML판정으로 알지못하는 신호들을 정확한 값으로 바꿔주는 부분이다.
그리고 처음 송신한 데이터와 ML판정되어 수신된 데이터를 비교하여보았다.
for L=k
Rml(L)=real(Estimaion_Data(L)); Iml(L)=imag(Estimaion_Data(L));
if Rml(L)>0 Rml(L)=1;
else Rml(L)=-1;
end
if Iml(L)>0 Iml(L)=1;
else Iml(L)=-1;
end
end
Rml(1)=0; Rml(28:38)=0;
Iml(1)=0; Iml(28:38)=0;
ml=Rml+Iml*i;
figure(10)
stem(ml)
hold on
stem(TX_DATA, 'r*')
title('ML 판정을 한 최종데이터')
hold off
3. Changion Channel
: 채널을 변경하여 위와 같이 하여 다시 Sinulation 시켜봤다.
h=delta(n1)+0.2*[delta(64) delta(1:63)]+0.8*[delta(63:64) delta(1:62)]...
+0.5*[delta(62:64) delta(1:61)]; % h 변경
4. 설계를 마치며
: 시뮬레이션된 송신신호와 수신신호가 완전히 일치하는것을 볼수있다. 이는 전송데이터를 잘 알고있다고 가정하고한 시뮬레이션이라서 그런것 같다. 실제로는 noise가 섞여서 모든 신호들이 일치하지는 않는다.
노이즈를 첨가하여 실험해보았으나...결과 값이 제대로 나왔는지 제대로 나오지 않았는지 잘 몰라서 이 글에 올리지 않았다.
이 설계를 통해 OFDM의 데이터 전속방식에해한 이해를 할 수 있었던거 같다 ^0^
'과제' 카테고리의 다른 글
MATLAB을 이용한 표준정규분포(가우스분포)에 따른 랜덤수 발생기 (5) | 2010.01.26 |
---|---|
AES가 쉽게 설명되어있는 플래쉬 (0) | 2009.12.12 |
C언어를 사용하여 DES 설계 (24) | 2009.12.12 |