2012년 12월 3일 월요일

이동통신 전파분석

드디어 이번 주제는 이동통신기술에 관해서다.

그동안 이 주제에 대해 스스로 경외하며, 언제가는 정리해야할 큰 도전이라고 느껴왔었다.

역시나 내용도 방대하고 능력의 한계도 절감하면서 머뭇거리기만 한참이었다.

이제 그런 부담감을 많이 내려놓으면서, 힘을 빼고,

이 블로그의 취지에 맞게 나만의 요리(?)로 최대한 만들어 볼까 한다.

"CDMA WCDMA 전파분석" 이란 책을 정리해가면서,

매트랩과 강의자료, 인터넷자료를 군데군데 보충하도록 하겠다.



1. 셀룰러 시스템의 개요


<셀룰러 시스템 구성도>

PSTN(public Switched Telephone Network) : 공공 통신 사업자가 운영하는 공중 전화 교환망

MTSO(Mobile Telephone Switching Office, 이동전화교환국) =MSC(Mobile Switching Center) :
 공중전화망과의 신호 연계, 기지국의 제어 및 채널의 관리통제, 사용자의 요금계산,
통화단절의 방지

BTS(Base station Transceiver Subsystem, 기지국) : 유선/무선신호의 상호 변환, 자기 cell내의 이동전화 신호강도 감지, MTSO에 정보 제공

중계기 : 전파음영지역을 개선하기 위한 간이 기지국
               (광 중계기, RF변환 중계기, M/W 중계기)

 
 <광중계기>

MS(Mobile Station, 통상 휴대폰)



2. 이동통신의 진화


 
<이동통신의 진화>

 1세대 AMPS 방식은 1983년 미국에서 상용화되었고, 이후 다른 지역으로 전파되었으며  우리나라에서도 1984년 AMPS 방식의 이동통신 서비스가 시작되었다.주파수 분할 다중 접근 방식(FDMA)을 쓰는 AMPS는 북미에서 셀이라는 공간을 할당해 사용자들로 하여금 통신하도록 하는 아날로그 셀 방식 전화 시스템이었으나 아날로그 음성통신 방식으로 데이터 통신이 불가능 했으며, 잡음이 많이 생기고, FDMA만 써서 각 사용자 마다 주파수를 할당해줘야 하기 때문에 주파수 효율의 문제점과 단순히 FM변조를 썼기 때문에 보안성 문제도 있었다.

 2세대에는 보다 향상된 음질과 저속 데이터 서비스가 디지털 방식으로 제공되었다. 2세대 시스템으로 알려진 디지털 셀룰러 시스템은 TDMA기반 시스템과  CDMA기반 시스템이 있으며 대표적인 TDMA 시스템은 유럽방식의 GSM, 북미의 IS-136, 일본의 PDC방식이 있으며, CDMA 방식으로는 미국  Qualcomm사가 제안한 북미식 IS-95 표준이 있으며, 현재 국내 디지털 셀룰러 이동통신 및 PCS 서비스가 해당되며 2세대 시스템은 완전한 디지털방식의 서비스를 하고 있지만 주로 음성위주의 전화 통화를 위해서 설계되었기 때문에 고속 데이터통신을 지원해 주지는 못했다.

3세대를 IMT-2000(International Mobile Telecommunication-2000) 또는 UMTS(Universal Mobile Telecommunication System)라고 하는데, 2세대 특징인 개인 통신 서비스(PCS)를 넘어서 음성, 동영상, 고속(144Kbps~2Mbps) 데이터 서비스 등을 모두 포함하는 멀티미디어 서비스를 제공 할 수 있는 모바일 컴퓨팅에 적합한 이동통신 시스템이다. 3세대 이동통신 시스템은 GSM과 같은 TDMA를 기반으로 한 EDGE, CDMA를 기반으로 하는 유럽의 W-CDMA, 그리고 북미식인 Qualcomm의 CDMA2000을 중심로 표준화가 진행되었다

4G 서비스 기술은  3G LTE(Long Term Evolution), WiMAX evolution 등이 있으며 각 진영별로 기술 주도권을 위해  경쟁하였으나 LTE가 압도하고 있다.

현재 CDMA 기술의 종료와 OFDM 기술 시대의 개막이 진행되고 있으며,
더 좋은 기술보다는 더 많은 사람이 사용하는 이동통신기술(LTE)이 규모의 경제를 바탕으로 다양한 방송 및 통신분야에 쓰일 것이라고 한다.



<무선데이터 전송속도의 진화>
 
※ 기지국에서의 음성통화 용량
ㅇ 2G IS95A 시스템 3FA(주파수 채널)/3sector + cdma2000 시스템 4FA/3sector
     3*15*2.4 + 4*25*2.4 = 약 348명 동시통화 가능

ㅇ 3G WCDMA 시스템 2FA/3sector
    2*80*2.4 = 약 384명 동시통화 가능



3. 주파수 확산 통신 기술

각 통화자(가입자)별 신호는 확산코드(직교코드, 채널화코드, Walsh 코드 - 64chip)에 의하여 대역 확산이 이루어지며 확산이 이루어진 신호들은 합쳐진 후 기지국을 구분하기 위한 short PN코드가 곱해진다. 따라서 기지국 초기 동기나 핸드오버 등의 동작을 이해하기 위해서는 PN코드에 대한 이해가 요구되며, 무선 테이터 전송을 이해하기 위해서는 직교코드를 명확히 이해하여야 한다. 반대로 상향신호에서는 단말 구분을 위하여 Long PN코드를 사용한다.

 
<1FA에서 CDMA/WCDMA 코드의 역할>

동기식 CDMA에서 모든 기지국들은 동일한 한개의 PN코드를 사용하고, 단지 각 기지국 별로 GPS로부터의 매 짝수 초를 기준으로 각기 코드의 시작 시점을 달리하게 되었다.동기식에서 사용되는 PN코드의 길이는 32,768 chip이며 이를 512개의 PNoffset으로 구분하여 1 PNoffset은 64 chip의 offset time을 의미하게 된다. 기지국간 시간 동기는 GPS절대 시간에 맞추어진다. chip rate는 1.2288 Mcps 이다. (ch 0=Pilot channel, ch 32=Sync, ch 1~7=Paging, ch 8~63=Traffic)


<1FA 채널구조>
 

 
 <1FA에서 CDMA파형>

 비동기WCDMA진영에서는 미국의 GPS 사용에 대한 거부감과 퀄컴의 원천 특허를 피하기 위하여 GPS의 절대시간 정보를 사용하지 않고, 모든 기지국이 512개의 서로 다른 PN코드를 사용한다. 광대역 cdma기술이며, chip rate는 3.84 Mcps 이다.

<CDMA / OFDM 의 랜덤엑세스 절차 비교>

CDMA, WCDMA 에서 단말기가 패킷신호를 전송 후 일정 시간 동안 기지국으로부터 응답 신호를 기다리고 응답 신호가 없으면 기지국에 신호가 도달치 못하였다고 판단하여 임의의 시간을 기다렸다 다시 신호를 송출하고 응답을 기다리는 반복 절차를 수행한다. 단말기 송신을 제어하는 절차를 무작위 접속(Random Access)절차라 하며, 이러한 기능을 수행하는 상향채널을 엑세스 채널이라 한다. 액세스 채널은 단말기에서 통화를 설정할 때, 기지국의 호출에 대하여 응답할때, 위치 등록 시, 상향 링크 문자 메시지 전송 등에 사용된다.



4. 국내 이동통신 주파수 현황

2011년 7월 국내에서 처음 상용 서비스를 시작한 LTE는 현재 1300만명의 가입자를 돌파하는 등 빠르게 확대하고 있다. 유럽의 경우에는 아직도 많은 이동통신사업자와 고객들이 3G에 만족하고 있다. 하지만 올해 말까지는 54개 사업자가 추가로 LTE를 구축할 예정이어서 연말에는 총 159개의 LTE 사업자가 등장할 전망이며, 올해를 기점으로 LTE 사업자가 폭발적으로 늘어나고 날 것이다.

<국내 LTE 주파수현황 - 하향링크 기준주파수표>
 


<이동통신사 주파수 현황>

현재는 국제적으로 LTE주파수가 난립하는 중에 상대적으로 1.8GHz대를 사용하는 이동통신사가 제일 많고 주목받지만, 장기적으로는  2.1GHz가 핵심이 되고 통일될 전망이다.
WCDMA에서는 독립적인 주파수채널 1FA마다 위한 하드웨어 증설이 필요하지만, LTE에서는
하드웨어 증설이 없어도 유연하게 조절가능 하다.


5. CDMA

전파방해(jamming)와 잡음환경에서의 직접대역확산 BER 계산






 
%DS_SS.m
% To simulate a QPSK/DS-SS communication system
clear, clf
gm=[2 5];   % A PN sequence
 
if sum(gm>1)>0, g(gm)=1;            % say, if gm=[1 2 4 5]
 else g=gm;                               % g=[1 1 0 1 1]
end
m=length(g); N=2^m-1;               % m=5, N=31
x=[zeros(1,m-1) 1]; x=x(end:-1:1);   % x=[0 0 0 0 1]→[1 0 0 0 0]
code1=x;
for i=m+1:N
xx(i,:)=[x(2:m) g(1:m-1) x(1)];
code1(i)=x(1); x=[rem(x(2:m)+g(1:m-1)*x(1),2) x(1)];
end
 
Nc=length(code1); % PN code length (Number of chips per message bit)
b=2; M=2^b;              % QPSK
Tb=1; Ts=b*Tb; Tc=Tb/Nc; % Bit/Symbol/Chip time
 
N=4; T=Tc/N;           % Sampling Period (subinterval in Tc)
Ns=b*N*Nc;             % Number of samples in one symbol
 
Es=2; sqEs=sqrt(Es);   % Energy of signal waveform
ss=[0 0; 0 1; 1 1; 1 0]; phases=2*pi/M*[0:M-1];  % Set of symbols
 
wc=2*Nc*pi/Tb;  t=[0:Ns-1]*T;  s2sT=sqrt(2/Ts);         % wc : 2*pi/Tc (Tc 동안 f=1)
SNRbdBt=0:0.1:10; pobet= prob_error(SNRbdBt,'PSK',b,'BER');
SNRbdBs=[3 6 9]; PJ=0.04;  MaxIter=20000;
for i_DS=1:2 % DS coding or not
   if i_DS==1, code1s=ones(1,Ns);                       % No DS
    else  code1s=reshape(ones(b*N,1)*(2*code1-1),1,Ns); % PN-DS coding
   end     
   for m=1:M % (Possibly PN-coded) QPSK signal waveforms
     sw(m,:)=sqEs*s2sT*code1s.*cos(wc*t+phases(m));    % sw=sqrt(E)*su , su^2=1
   end
 
   figure(2)
   R_f=fftshift(fft(sw(1,:)))/Ns; R_f=[R_f R_f(1)];
   subplot(3,1,i_DS); plot(-1/(2*T):1/T/Ns:1/(2*T), abs(R_f));
 
   suT= s2sT*T*[code1s.*cos(wc*t); -code1s.*sin(wc*t)]; 
   for i_SNR=1:length(SNRbdBs) % Range of SNRdB
      SNRbdB=SNRbdBs(i_SNR);  SNRb=10^(SNRbdB/10);
      sigma2=(Es/b)/SNRb;  sgmsT=sqrt(sigma2/T);
      Jamming_amp=sqrt(PJ/T);        %  전파방해 신호
      y= zeros(2,Ns); % Buffer size amounting to 1 symbol time
      r= zeros(1,Ns);
      nobe= 0; % Number of bit errors
      for k=1:MaxIter
         i= ceil(rand*M); s=ss(i,:); % transmitted signal      
         for m1=1:b*Nc % Operation per symbol interval Ts
            for m=1:N % Operation per chip interval Tc
               mi=(m1-1)*N+m; tmp=wc*((k-1)*Ns+mi-1)*T;  % tmp =wct (시간구간)
               intfrnc=cos(tmp+pi/6); bp_noise= randn*cos(tmp)-randn*sin(tmp);    
                                                              % Interference & band pass noise
               rNs= sw(i,mi) +sgmsT*bp_noise +Jamming_amp*intfrnc;         
               r=[r(1,2:Ns) rNs];
               y=[y(:,2:Ns) suT(:,mi)*rNs]; % Inside correlator 
            end
         end
 
         ycsk=sum(y')'; % Sampled correlator output - DTR input
         th= atan2(ycsk(2),ycsk(1));
         if th<-pi/M, th=th+2*pi; end
         [themin,lmin]= min(abs(th-phases)); % Eq.(7.3.9)
         d= ss(lmin,:); % Detected data bits
         nobe=nobe+sum(s~=d); % Number of bit errors in a detected symbol
         if nobe>100, break; end
      end  
      pobe(i_DS,i_SNR)=nobe/(k*b);
   end
end
fprintf('\n SNRbdB= %5.2f   %5.2f   %5.2f (Jamming power=%5.2f)', SNRbdBs,PJ)
fprintf('\n    BER= %6.4f  %6.4f  %6.4f (Without PN coding)', pobe(1,:))
fprintf('\n    BER= %6.4f  %6.4f  %6.4f (With PN coding)\n', pobe(2,:))

figure(1)
subplot(2,2,1); plot(t, sw(1,:)); title(num2str(ss(1,:)));
subplot(2,2,2); plot(t, sw(2,:)); title(num2str(ss(2,:)));
subplot(2,2,3); plot(t, sw(3,:)); title(num2str(ss(3,:)));
subplot(2,2,4); plot(t, sw(4,:)); title(num2str(ss(4,:)));
figure(2)
R_f=fftshift(fft(r))/Ns; R_f=[R_f R_f(1)];
subplot(3,1,3); plot(-1/(2*T):1/T/Ns:1/(2*T), abs(R_f));
figure(3)
semilogy(SNRbdBt,pobet, SNRbdBs,pobe(1,:),'x', SNRbdBs,pobe(2,:),'o')
 

결과> SNRbdB=  3.00    6.00    9.00 (Jamming power= 0.04)
    BER= 0.2730  0.2853  0.3137 (Without PN coding)
    BER= 0.0706  0.0193  0.0023 (With PN coding)






6. OFDM

16-ary QAM coding 과 FFT를 기반으로 한 OFDM 통신시스템




 
%do_OFDM0.m
% simulates an OFDM system with Nfft=128-subcarrier DFT and 2^4=16-QAM
% where a frame (block) carries Nfft/2*4 (message) bits
%Copyleft: Won Y. Yang, wyyang53@hanmail.net, CAU for academic use only
clear, clf
Nfft=128; Nffth=Nfft/2;  % FFT size and its half
b=4; Nblock=Nffth*b; % 2^b QAM and Number of message bits per block
Ng=16; % # of samples of guard interval (consisting of prefix/suffix)
g=[0 0 1 0.1 0]; lc=length(g); % Channel response and its length
[gmax,d1]=max(g); d=d1-1; % Estimate of Channel delay
%d=d-1; % Wrong estimate of channel delay for STO effect
Nsym=Nfft+Ng; % Length of OFDM symbol
lx=Nsym*(1+ceil(lc/Nsym)); % Length of x
% This must be greater than or equal to the effective length of
% channel response g
x=zeros(1,lx); % Buffer of transmitted sequence
ly=lx+Nsym; % Length of y >= x + one OFDM symbol size
y=zeros(1,ly); % Buffer of received vector
SNRbdB=7; SNRb=10^(SNRbdB/10);
sigma=sqrt(1/(SNRb*Nblock));
 
nobe=0;  MaxIter=10000;  Target_no_of_error=10;
for iter=0:MaxIter
 
   msg=randi(2^b-1,Nblock/b,1)';
   msgg=bin2gray(msg,'qam',2^b);
   msgb=dec2bin(msgg)';
   msgb=msgb(:)';
   S=qammod(msg,2^b,0,'gray');
 
   for i=2:Nffth,  X(i)=S(i);  X(Nfft-i+2)=X(i)';  end % Eq.(11.1.2)
   X(1) = real(S(1));  X(Nffth+1) = imag(S(1));
   xn = real(ifft(X,Nfft));  % Eq.(11.1.3)
   % To update the modulated sequence x to be transmitted  
   x = [x(1+Nsym:lx) xn(Nfft-Ng+1:Nfft) xn]; % Add CP  
   % To update the received sequence r
   y(1:ly-Nsym) = y(1+Nsym:ly);
   for n=Nsym:-1:1
      n1 = ly+1-n;
      y(n1) = sigma*randn;     
      for n2=1:min(lx+1-n,lc)
         y(n1) = y(n1) + x(lx+2-n-n2)*g(n2)/gmax; % Eq.(11.1.6)
      end
   end     
   y1=y(lx+d-Nfft+1:lx+d); % Removing/neglect the CP and
   %keps=0.01; y1=y1.*exp(j*2*pi*keps/Nfft*[0:Nfft-1]); % CFO effect
   Y = fft(y1,Nfft); % take the FFT
   Sd=Y; Sd(1)=real(Y(1))+j*real(Y(Nffth+1));
   plot(Sd+j*eps,'.'), hold on  % Received signal constellation
   % QAM demodulation
  
   detected=qamdemod(Sd(1:Nffth),2^b,0,'gray');
   detectedg=bin2gray(detected,'qam',2^b);
   detectedb=dec2bin(detectedg)';
   detectedb=detectedb(:)';
 
   if iter>0
     nobe = nobe + sum(detectedb~=msg0);
     if nobe>Target_no_of_error, break; end
   end
   msg0 = msgb;
end
pobe = nobe/(iter*Nblock);
fprintf('pobe= %1.5f\n',pobe);
figure(2), plot(y)
figure(3), pwelch(y)
 

결과> pobe= 0.00035


6. LTE 주요특징

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 


LTE 주요 특징
1. 다중접속 기술
  ○ 하향링크 : OFDM,
  ○ 상향링크 : SC-FDMA
2. AMC(Adaptive Modulation and Coding)
  ○ 하향링크 : QPSK, 16 QAM, 64 QAM
  ○ 상향링크 : QPSK, 16 QAM
  ○ Turbo 부호 : 1/3부호화율
3. 공간다중화 기술
  ○ 다중 사용자 MIMO 지원



※ 참고사이트
1. www.rfdh.com/tech/cdma.htm
2. 이동통신기술의진화to LTE / MIMO청강문화산업대학모바일아카데미2011년7월


2012년 6월 16일 토요일

자연상수 e 와 증명법

공대생들은 Exponential(자연상수 e) 과 삼각함수와 지겹게 시름해야하는 숙명을 안고있다.

왜 이렇게 자연상수와 삼각함수가 중요하게 자주 다루어질까?

아무래도 자연계현상의 대부분이

미적분과 원운동에 의한 원리로 작동해서가 아닐까 생각해본다.

특히, 파동방정식의 해가 e^i(wt-βz) 이니,,,

문득 확률과정론 수업듣다가 갑자기 궁금해졌다~ 어찌됐건,,, 자연상수 e는 중요하다.

이번 블로그는 e라는 놈은 어떻게 태어났고, 어떤 특징이 있는지 살펴볼 것이다!




e의 위대한 탄생은 위식에서부터 라고 할수 있으며,

신기하게도 결과물은 미적분해도 e^x 그 자신이 된다는 사실이다. 우와~


위 식에서 x=1 두면,,, 자연상수 e값이 2.7~ 정도로 근사화 된다.

그런데,,, 자연상수 e는 무리수일까? 유리수 일까?

지금부터 증명에 들어갑니다~



이상으로 자연상수 e의 관한 소개를 마치며,,,

우리가 알고있던 두가지 증명법(연역법, 귀납법)에 대해서 알아보자!


먼저, 삼단논법과 유사한 바로 위의 증명이 예시가 될것이다.

p(자연상수 e) → q(무리수) , q'(유리수) → p'(자연상수 e 모순)



이미 증명된 하나 또는 둘 이상의 명제를 전제로 하여 새로운 명제를 결론으로 이끌어내는 것을 연역(演繹, deduction)

일반적인 사실들로 부터 구체적인 사실을 끌어내는 것으로 기억하면 쉽다!




개별적인 특수한 사실이나 원리로부터 그러한 사례들이 포함되는 좀 더 확장된 일반적 명제를 이끌어내는 것을 귀납(歸納, induction)

구체적인 사실들로 부터 일반적인 사실을 끌어내는 것으로 기억하면 쉽다!


귀납법으로 증명한 예시이다. 귀납법은 과학에서 추론방법으로 널리 쓰인다.



요즘들어,,, 주변인들에게 잘해야겠다는 생각에 다시 한번 절감했다.

미래를 위해 더 노력하고, 잠시 희생하는 것도 의미있는 일이지만,

미래만큼이나 현재도 중요하다.

더 값지고 멋진인생을 만들 수 있는 것도 바로 지금 이순간의 선택일 것이다!

그런 의미에서 나는 현재 나의 환경들에 더 애정을 쏟을 생각이다.

그리고 장래에는 좋은사람이 되고 싶다.

여러사람들에 소중한 사람이 되어야겠다!^^

2012년 6월 5일 화요일

매트랩을 사용한 부가백색잡음환경에서의 QAM 시스템 BER 계산

개인적으로 외적 환경 변화가 많았던 기간을 지냈기도 했고, 잠시 게임 폐인이 되기도 했다.

한동안 이동통신공부에 탄력받았었는데, 지금은 갈피를 잘 못 잡겠고 정체기인것 같다.

아~ 정말 공부할 양도 많고, 어렵기도 하다~ 또 어떤방향으로 해야하나~

그래도 강박증을 버리되, 호기심으로 조금씩 정리해 보기로 한다!


오늘은 주제는 'Compute BER for a QAM System with AWGN Using MATLAB' 이다

매트랩사이트의 예제문서의 내용을 요약해고, 나름대로 부연설명을 추가해서

전반적인 통신의 절차를 확인해 볼 생각이다.

먼저,,, 원문 링크주소는 http://www.mathworks.co.kr/help/toolbox/comm/gs/a1067963807.html

참고로, 매트랩버전의 차이로 일부 명령어가 다르기도 한데, 대략의 의미는 통할것으로 본다.





문제1.   기저대역의 변조, 채널, 복조로 구성된 통신시스템을 이용한 이진데이터 stream을 처리한다.  시스템의 bit error rate (BER)를 구하고, 또한 전송 및 수신한 신호를 scatter plot에 표시하라!


문제2   송신기와 수신기에 펄스파형성형 및 정합필터를 수행하는 한 쌍의 square root raised cosine filters 를 사용하는 그레이코드된 변조로 수정하라!


문제3   주어진 구속장(constraint lengths)과 생성다항식(constraint lengths and generator polynomials)가진 convolutional coding 과 decoding을 포함할 수 있게 수정하라!



%% Setup  :  Define parameters
% Modified Plot, With Gray Coding
M = 16; % Number of points in constellation
k = log2(M);           % Number of bits per symbol
n = 5e5;                % Number of bits to process
nsamp = 4;            % Oversampling rate 
hMod = modem.qammod('M',M,'SymbolOrder','Gray');   % Modulator object
mapping = hMod.SymbolMapping;                            % Symbol mapping vector
pt = hMod.Constellation;                                         % Vector of all points in constellation
scatterplot(pt);                                                       % Plot the constellation.

% Include text annotations that number the points.
text(real(pt)+0.1,imag(pt),dec2bin(mapping));
axis([-4 4 -4 4]); % Change axis so all labels fit in plot.



%% Signal Source  :  Create a binary data stream as a column vector.

x = randint(n,1); % Random binary data stream



%% Encoder  :  Define a convolutional coding trellis and use it to encode the binary data.

t = poly2trellis([5 4],[23 35 0; 0 5 13]); % Trellis

code = convenc(x,t); % Encode.

coderate = 2/3;



%% Bit-to-Symbol Mapping  :  Convert the bits in x into k-bit symbols.

% B. Do ordinary binary-to-decimal mapping.

xsym = bi2de(reshape(code,k,length(code)/k).','left-msb');



%% Modulation

y = modulate(modem.qammod(M),xsym); % Modulate using 16-QAM.



%% Filter Definition  :  Define filter-related parameters.

filtorder = 40; % Filter order

delay = filtorder/(nsamp*2); % Group delay (# of input samples)

rolloff = 0.25; % Rolloff factor of filter

% Create a square root raised cosine filter.

rrcfilter = rcosine(1,nsamp,'fir/sqrt',rolloff,delay);

% Plot impulse response.

figure; impz(rrcfilter,1);



%% Transmitted Signal  :  Upsample and apply square root raised cosine filter.

ytx = rcosflt(y,1,nsamp,'filter',rrcfilter);

% Create eye diagram for part of filtered signal.

eyediagram(ytx(1:2000),nsamp*2);



%% Channel  :  Send signal over an AWGN channel.

EbNo = 10; % In dB

snr = EbNo + 10*log10(k*coderate)-10*log10(nsamp);

ynoisy = awgn(ytx,snr,'measured');



%% Received Signal  :  Filter received signal using square root raised cosine filter.

yrx = rcosflt(ynoisy,1,nsamp,'Fs/filter',rrcfilter);

yrx = downsample(yrx,nsamp); % Downsample.

yrx = yrx(2*delay+1:end-2*delay); % Account for delay.



%% Scatter Plot  :  Create scatter plot of received signal before and after filtering.

h = scatterplot(sqrt(nsamp)*ynoisy(1:nsamp*5e3),nsamp,0,'g.');

hold on;

scatterplot(yrx(1:5e3),1,0,'kx',h);

title('Received Signal, Before and After Filtering');

legend('Before Filtering','After Filtering');

axis([-5 5 -5 5]); % Set axis ranges.



%% Demodulation  :  Demodulate signal using 16-QAM.

zsym = demodulate(modem.qamdemod(M),yrx);



%% Symbol-to-Bit Mapping  :  Undo the bit-to-symbol mapping performed earlier.

z = de2bi(zsym,'left-msb'); % Convert integers to bits.

% Convert z from a matrix to a vector.

z = reshape(z.',numel(z),1);



%% Decoder  :  Decode the convolutional code.

tb = 16; % Traceback length for decoding

z = vitdec(z,t,tb,'cont','hard'); % Decode.



%% BER Computation  :  Compare x and z to obtain the number of errors and the bit error rate. Take the decoding delay into account.

decdelay = 2*tb; % Decoder delay, in bits

[number_of_errors,bit_error_rate] = biterr(x(1:end-decdelay),z(decdelay+1:end))



awgn 의 함수의 검증은 아래와 같다.


SNR_input=30;
 
         % To specify the power of X to be 0 dBW and add noise to produce
         % an SNR of 10dB, use:
         N=2^10;
         X = sqrt(2)*sin(0:2*pi/N:2*pi-2*pi/N);
         Y = awgn(X,SNR_input,0);


X_pow=X*X'/N                 % =var(X)
Y_pow=Y*Y'/N                 % =var(Y)
plot(1:N, X, 1:N, Y)
noise_pow=sum((X-Y).^2)/N    % =var(X-Y)
SNR_dB=10*log10(X_pow/noise_pow)


먼저, 컨벌루션 코딩를 수행하는 하드웨어와 격자구조를 비교해 보자.

2개 입력에 3개 출력이 나오는 구조이다.



A Rate-2/3 Feedforward Encoder
(trel = poly2trellis([5 4],[23 35 0;0 5 13])


(The ratio of bit energy to noise power spectral density ) k * Eb/N0
= Es/N0 (the ratio of symbol energy to noise power spectral density)

(the signal-to-noise ratio) SNR = (Eb * k * coderate / nsamp) / N0


또한 각 단계별 정보의 변형(예시로 8bit )을 추적해 보자!




위 정보 가공의 과정을 요약하자면, 랜덤이진데이터x에서 채널코딩후 16-QAM변조 시키고

noise를 s/n비로 오염 후 업샘플하여 필터처리하여 송신한다.

수신단에서는 송신신호를 동일한 정합필터를 통하여 심볼을 검출하고 디코딩해서

원 랜덤이진데이터x와 비교하여 BER을 계산하면 끝~





덧붙여 Phase Noise(위상잡음)에 대해서도 알아보자!

'Compute BER for a QAM System with AWGN and Phase Noise Using Simulink' 이다.

원문 링크주소는,,, http://www.mathworks.co.kr/help/toolbox/comm/gs/fp8022.html









Carrier Frequency : 100MHz

Offset Frequency : 1KHz

Carrier/Offset Power : 60dBc 이면,


위상잡음은 -60dBc/KHz = -60-10log(1000) = -90dBc/Hz




중심주파수와 오프셋주파수에서의 전력차이가 클수록(Phase noise ↓)

BER이 우수하다는 것을 알 수 있다.

위상잡음의 영향은 Contellation 이 둥근패턴이 되어 검출의 정확성을 떨어뜨린다.

좀 더 자세한 실험은 원문링크주소를 참고하기 바란다.


이상,,, matlab의 '시작하기'  였다...  헐,,,  

그래도 시작이 반이다.^^





이번 주제에는 RF 주파수천이와 동기화 방법들이 생략되었다.

동기화방법은 짧게 정리하자면,,,




Carrier Recovery - 수신측에서 복조에 사용되는 반송파(local carrier)의 주파수는 물론 그 위상도 수신신호의 carrier 위상에 맞춰져야 한다는 것

Symbol Synchronization(Timeing Recovery) - 수신측의 복조기출력을 한 심볼구간(Ts)마다 샘플링해서 detector로 보내는데, 이 샘플링시점도 신호가 송신기로부터 수신기까지의 전송시간 만큼 지연시켜 심볼구간에 맞도록 동기화

Frame Synchronization - 사전에 약속된 일정 길이의 접두부호(Prefix)를 매 프레임이 시작할 때마다 전송함으로써, 수신측에서 어느 비트가 MSB(Most Significant Bit)이고, 어느 비트가 LSB(Least Significant Bit)인지 구별
 


다음에는 이런것들과 측정방식에 대해서도 정리를 해야겠다.

일단,,, 기말고사 준비나 해야겠다...

2012년 2월 23일 목요일

모스부호(Morse code)와 Tip



간만에 블로그를 올린다.

이번에는 직접 제작한 매트랩 프로그램과 알면 유용한 매트랩 명령어에 대하여 알아보자!



그러기에 앞서, 항상 느끼는 것이지만,,,

매트랩은 공대생들에게 쉽고 유용한 필수도구라고 생각이든다.

짧은코딩으로, 쉽게 목적을 달성할 수 있는지 미리 살필 수 있고, 원리를 파악하기도 쉽다.

하드웨어랑 연결하고 조작도 쉬운것 같은데,,, 아직은 잘 모르겠다.

분명한것은 공부해야할 것들이 무궁무진하게 많고,

쉽게 코딩해서 강력한 기능을 맘대로 사용할 수 있다는 점이다.

수학과 공학 지식의 축적으로 이루어진 거대한 탑...^^

너무 높고, 방대해서 한 사람의 노력으로는 다 이해하기 어려운,,,

아무튼, 멋진 공학의 기초 도구이가 될것이다!ㅎ



그럼 이제, K5 자동차 광고에 이용해서 고급스러움과 신비스러움을 더 해줬던

모스부호의 세계로 빠져봅시다~

아래 광고의 '뚜~ 뚜 뚜~ 뚜 뚜 뚜 뚜 뚜' 의 세련된 음은

모스부호로써  'K5' 를 연속해서 가르키고 있다.


 


아래코드는 자작한 모스부호생성, 모스부호분석하여 변환하는 프로그램이다.</><>

아직 wave 파일 분석은 일반적이지 못해 좀더 수정해 볼 생각이다.



table={'a' '.-';
'b' '-...';
'c' '-.-.';
'd' '-..';
'e' '.';
'f' '..-.';
'g' '--.';
'h' '....';
'i' '..';
'j' '.---';
'k' '-.-';
'l' '.-..';
'm' '--';
'n' '-.';
'o' '---';
'p' '.--.';
'q' '--.-';
'r' '.-.';
's' '...';
't' '-';
'u' '..-';
'v' '...-';
'w' '.--';
'x' '-..-';
'y' '-.--';
'z' '--..';

'1' '.----';
'2' '..---';
'3' '...--';
'4' '....-';
'5' '.....';
'6' '-....';
'7' '--...';
'8' '---..';
'9' '----.';
'0' '-----'};

code=[];
c=input('문자를 입력해주세요!\n', 's'); c=lower(c);
for i=1:length(c)
for j=1:length(table)
if strcmp(c(i), table{j,1}), code=[code table{j,2}]; end
end
code=[code ' '];
end

fs=8000;
l=0.1;
dot_t=0:1/fs:l;      %
dash_t=0:1/fs:3*l;   % -
dot=sin(2*pi*1812.5*dot_t);
dash=sin(2*pi*1812.5*dash_t);
space=zeros(1,length(dot));
 

code
morse=[];
for i=1:length(code)
if strcmp(code(i),'.')
morse=[morse dot];
elseif strcmp(code(i),'-')
morse=[morse dash];
else
morse=[morse space space];
end
morse=[morse space];
end
sound(morse,fs)
% wavwrite(morse,fs,16, c)


% morese=wavread(c)
ev=(abs(hilbert(morse))>0.5);
% s(t)=Re[s_hat(t)·exp(jwt)]=si(t)cos(wt)-sq(t)sin(wt)  ,  s_hat(t)=si(t)+j·sq(t)
evs=downsample(ev,fs*l/8);
re=[]; k=1;
while k~=length(evs)
if length(evs)>=k+23 & sum(evs(k:k+23))==24, re=[re '-']; k=k+24;
elseif length(evs)>=k+23 & sum(evs(k:k+23))==0, re=[re ' ']; k=k+24;
elseif length(evs)>=k+7 & sum(evs(k:k+7))==8, re=[re '.']; k=k+8;
end
k=k+1;
end

id=[1 strfind(re, ' ')+1];
rec=[]; i=1; j=1;
for i=1:length(id)-1
for j=1:length(table)
if strcmp(re(id(i):id(i+1)-2), table{j,2}), rec=[rec table{j,1}]; end
end
end
upper(rec)



별건아니지만, hello world의 순수함으로 만들고, 뿌듯함을 느낀다.ㅎㅎ

다음은 잘 몰랐지만, 알고나면 굉장히 유용한 matlab의 주요한 기능을 살펴보자!



%-----------------------------------------------
% Create a new AVI file
%-----------------------------------------------
   t = linspace(0,2.5*pi,40);
       fact = 10*sin(t);
       fig=figure;
       aviobj = avifile('example.avi')
       [x,y,z] = peaks;
       for k=1:length(fact)
           h = surf(x,y,fact(k)*z);
           axis([-3 3 -3 3 -80 80])
           axis off
           caxis([-90 90])
           F = getframe(fig);
           aviobj = addframe(aviobj,F);
       end
       close(fig)
       aviobj = close(aviobj);
%-----------------------------------------------

%-----------------------------------------------
% Display wait bar
%-----------------------------------------------
h = waitbar(0,'Please wait...');
        for i=1:1000,
            % computation here %
            waitbar(i/1000,h)
        end
%-----------------------------------------------


 
%-----------------------------------------------
% Display legend
%-----------------------------------------------
x = 0:.2:12;
        plot(x,bessel(1,x),x,bessel(2,x),x,bessel(3,x));
        legend('First','Second','Third');
        legend('First','Second','Third','Location','NorthEastOutside')
%-----------------------------------------------


 

%-----------------------------------------------
% meshgrid, surf, contour
%-----------------------------------------------

[X,Y] = meshgrid(-1:.1:1);
        Z = 1-(X.^2 + Y.^2);
        surf(X,Y,Z)
        surfc(X,Y,Z)
[C, h]=contour(X, Y, Z);
clabel(C, h)
save('f.mat', 'X', 'Y', 'Z');
load('f.mat')
%-----------------------------------------------

 
%-----------------------------------------------
% Record and play back 2 seconds of single audio sampled at 8 kHz
%-----------------------------------------------
        Fs = 8000;
        y  = wavrecord(2*Fs, Fs, 'Single');
        wavplay(y, Fs);
%-----------------------------------------------


%-----------------------------------------------
% Calendar
%-----------------------------------------------
calendar(date)
%-----------------------------------------------

 
%-----------------------------------------------
% Capture
%-----------------------------------------------
vid = videoinput('winvideo', 1, 'YUY2_160x120');
src = getselectedsource(vid);
vid.FramesPerTrigger = 1;
start(vid);
vid.ReturnedColorspace = 'rgb';
nicelcw = getdata(vid);
imshow(nicelcw);
%-----------------------------------------------

 
 
%-----------------------------------------------
% Font color
%-----------------------------------------------
a='test';
text(1,1,a,'color','r')
%-----------------------------------------------




이상,,, 블로그에 업로드하기까지 오랜기간이 걸렸다. 그동안 항상 맘에 있었지만,,,

게을렀다고 할까?!ㅎ

한편으로는 허접한 블로그를 업로드하기위해, 나는 지난날을 그렇게 끙끙댔나보다~



올해,,, 만학도로 대학원을 입학했다.

몇일해본 대학원은 해주는 것을 받아먹는게 아니라,

노력하는 만큼 얻어가는 곳이라는 느낌이 확 든다.

공부해서,,, 졸업 쯔음엔 떳떳하고 멋있게 내 논문 발표할 수 있으면 좋겠다^^

그리고 좋은 블로그를 게시하여,

디지털통신 전공생의 가려운 부분을 박박 긁어주고 싶고, 지식도 나누고 싶다.

나 자신을 위하여 파이팅~!!ㅎ