2016년 1월 15일 금요일

파동방정식과 그 해(풀이)

수학도 언어라고 생각한다. 수학을 통해 자연현상에 대한 통찰을 아름답게 표현하고, 정확하게 전달할 수 있기 때문이다. 이 언어는 인류의 유산으로 계속해서 누적되고, 세련되게 진화할 것이다. 나는 이 언어를 이해하는 과정이 너무 길고 힘겹다. 이 언어를 능수능란하게 다루는 솜씨 좋은 대가들이 엄청 질투나고 부럽다!ㅎㅎ
한편 아름답게 표현한다는 것에서는 예술과 일맥상통하는 부분이 있는 것 같다. 어떤 때는 놀랍고 경이롭기까지 하니까.

어쨌든 잡설이 길었으나,,, 이번 블로그의 주제는 파동방정식이다.
줄의 진동을 통해 물리적 현상을 파동방정식으로 표현해보고, 그 해를 찾아 특징을 살펴보는 과정은 전자기학에 필수적이고, 더 나아가 통신공학 응용에도 많은 도움이 될 것이다. 설사 그렇지 않더라도 파동방정식의 표현은 참 멋지고, 파동은 일상이다.

먼저,,, 파동방정식의 증명이 필요한데, 이미 깔끔하게 블로그하신 분들이 많다. 그래서 나는 그냥 인용을 하기로 한다.

http://joonyoungsun.tistory.com/261

증명을 조금 더 정리하면,,,



초기속도 g(x)=0 이면, u(x, t)=ΣBn cos(cnπt/L) sin(nπx/L)

→  u(x, t)=1/2 ΣBn sin(nπ/L(x-ct)+1/2 ΣBn sin(nπ/L(x+ct)

→  u(x, t)=1/2[f*(x-ct)+f*(x+ct)]  

여기서 f* 는 2L주기를 가진 f의 기수주기확장(Odd periodic extension) 이다.
 ∵ u(x,t)는 연속함수이고, wave equation , boundary condition(u(0,t)=0 , u(L,t)=0 for all t) , inital condition(u(x,0)=f(x) , du/dt=g(x)) 만족한다.

 


그럼,,, 이제 이렇게 구한 파동방정식과 그 해를 실제적인 예로 시뮬레이션해보자!

<문제> 초기 휨이 삼각함수인 현의 진동

 
 

초기 휨이 삼각함수인 현의 진동 의 해를 실제로 시뮬레이션해보면,
증명으로 유도한대로 파동은 양방향으로 진행하는 함수의 기수주기확장의 합과 동일하다는 것을 알 수 있다.


L=2; T=10; N=10; k=1; c=1;
x=0:.1:L;
ux0=zeros(N,length(x)); uxt=zeros(N,length(x));
h=plot(x, sum(uxt));

for t=0:.1:T;
for n=1:N;
bn(n)=8*k/n^2/pi^2*sin(n*pi/2);
ux0(n,:)=bn(n)*sin(n*pi/L*x);
uxt(n,:)=cos(n*pi*c/L*t)*ux0(n,:);
end
% uxt=(8/pi^2)*[1/1^2*cos(pi/2*t)*sin(pi/2*x)-1/3^2*cos(3*pi/2*t)*sin(3*pi/2*x)...];
set(h, 'xdata', x, 'ydata', sum(uxt))
drawnow
axis([0 2 -1 1]);
pause(.1)
end

 

2014년 12월 28일 일요일

매트랩을 이용한 파일명 일괄 변경


이번에는 개인적인 필요에 의해서 매트랩을 활용해 만들어봤다.

문제는,,,

D:\2014\ 폴더안에 약 400개의 mp3 파일명 '001. XXX.mp3' 을

'XXX.mp3' 으로 파일명을 일괄 변경하는 것이다.



 
cd d:\2014
fn=ls('*.mp3');
n=length(fn);


for i=1:n
index=strfind(fn(i,:),' ');
nfn(i,:)=fn(i,index(1)+1:end);
movefile(fn(i,:), nfn(i,:))
end

 
 

이제,,, 엄청 빨라졌다. 거의 바로된다^^;



다음 문제는,,,

C:\Down 폴더안에 약 400개의 그림파일의 파일명 'imageXXX.jpg' 을

만든 날짜 즉 '2012-09-06 HHMMSS.mp3' 으로 파일명을 일괄 변경하는 것이다.


 
cd c:\Down
d=dir('*.jpg');
n=length(d);

for i=1:n
t = datetime(num2str(d(i).date),'InputFormat','dd-MM-yyyy HH:mm:ss')
movefile(d(i).name, strrep([char(t) '.jpg'], ':',''))

% movefile(d(i).name, strrep([num2str(d(i).date) '.jpg'], ':',''))

end

 


아주 편하게 노가다 안해도 된다.^^;

2014년 11월 29일 토요일

매트랩으로 배우는 행렬

매트랩을 이용하여 행렬을 나름대로 정리해보려고 한다!


1. 행렬식

임의의 행렬 A에 대해 A의 행렬식(determinant)이라 불리는 수가 대응된다.


 
A=[1 2 -3; -4 0 3; 5 -2 4];

U=det(A)


결과) U=44
 


이 행렬식은 나중에 다룰 역행렬을 구할때, 연립방정식의 해를 구할 때 중요하게 사용된다.

어떤 행렬 A의 행렬식 값 det(A) = 0 이면 행렬 A는 역행렬을 갖지 않고 det(A)≠0이면 A의 역행렬이 존재한다. 즉, 행렬식(determinant)은 어떤 행렬의 역행렬 존재여부에 대한 판별값 역할을 한다.

도형 P가 선형변환 A에 의해 P'으로 변환되었을 경우, det(A)는 선형변환의 스케일(scale) 성분을 나타내는 값이다. 또한 determinant의 부호가 det(A)>0이면 도형의 방향(orientation)이 보존되고 det(A)<0이면 도형의 방향이 보존되지 않는 기하학적인 의미가 있다.



2. 역행렬



syms a b c d;

A=sym([a b; c d]);

inv(A)

결과) inv(A)=               [ d, -b]
                      1/(ad - bc)[ -c, a]
 
pretty(inv(A)*A)

pretty(A*inv(A))
결과) [1 0]
          [0 1]

 


행렬 A의 원소들에 대한 여인수들로 구성된 행렬의 전치행렬을 수반행렬(adjoint)이라 하고,

A의 역행렬을 구하는 공식은 다음과 같다.

inv(A) = 1/det(A)*adj(A)





3. 고유값(eigenvalue)과 고유벡터(eigenvector)

고유값은 특성값(characteristic value)라고도 한다.

고유값, 고유벡터는 기하학적으로 AV=λV 이므로 벡터 AV 와 벡터 V=[v1; v2]의 방향이 같다.

다만 벡터의 크기는 고유값 λ에 의해 좌우된다.

다음은 고유값 응용의 예(질량-스프링 시스템)이다.


이것이 질량-스프링 시스템의 진동하는 애니메이션이다.




% 질량-스프링 시스템
p1=[-3 1 2 2];
p2=[1 1 2 2];
p3=[-3 -3 2 2];
p4=[1 -3 2 2];


r1=rectangle('Position',p1,'facecolor','r');
r2=rectangle('Position',p2,'facecolor','g');
r3=rectangle('Position',p3,'facecolor','r');
r4=rectangle('Position',p4,'facecolor','g');

l1=line([-5 p1(1)],[2 2]);
l2=line([p1(1)+2 p2(1)],[2 2]);
l3=line([-5 p3(1)],[-2 -2]);
l4=line([p3(1)+2 p4(1)],[-2 -2]);


axis([-5 5 -5 5]);
txt=text(-1, 4, ['시간 :  초'],'EraseMode','normal');
nFrames = 0;

for t=0:.1:10
nFrames = nFrames +1;
up1=p1+[0.8507*cos(1.6180*t) 0 0 0];
set(r1,'Position',up1);
set(l1,'XData',[-5 up1(1)]);

up2=p2+[0.5257*cos(1.6180*t) 0 0 0];
set(r2,'Position',up2);
set(l2,'XData',[up1(1)+2 up2(1)]);

up3=p3+[0.5257*cos(0.6180*t) 0 0 0];
set(r3,'Position',up3);
set(l3,'XData',[-5 up3(1)]);

up4=p4+[0.8507*cos(0.6180*t) 0 0 0];
set(r4,'Position',up4);
set(l4,'XData',[up3(1)+2 up4(1)]);

pause(.01)
set(txt,'Position',[-1 4],'String',['시간 : ', num2str(t), ' 초']) % (x,y) 위치에 문자열 갱신
drawnow
mov(nFrames) = getframe(gcf);
end
movie2avi(mov,'eigen','compression','None');
 



4. 분산(variance), 공분산(covariance), 상관계수(correlation coefficient)





Fs=8000;
n=Fs;
beep
x=wavrecord(Fs,Fs); % 비프음후 1초간 Fs로 샘플녹음
 
beep
y=wavrecord(Fs,Fs); % 비프음후 1초간 Fs로 샘플녹음
plot(1:n,x, 1:n, y)


variance=var(x)                               % 분산

sum((x-mean(x)).^2)/n

sum(x.^2)/n-mean(x)^2


covariance=cov(x,y)                             % 공분산

sum((x-mean(x)).*(y-mean(y)))/n

sum(x.*y)/n-mean(x)*mean(y)


correlation_coefficient=corrcoef(x,y)                    % 상관계수

o=[1/std(x)/std(x) 1/std(x)/std(y); 1/std(y)/std(x) 1/std(y)/std(y)];

cov(x,y).*o
 


평균(m=[3 5])과 공분산(s=[1 1; 1 2])를 따르는 가우시안 분포를 플롯하기

  
N=2^10;

m=repmat([3, 5], N,1);

s=[1 1; 1 4];

x=randn(N,2)*sqrtm(s)+m;    % sqrtm(s)*sqrtm(s)=s

plot(x(:,1),x(:,2),'d');
 

검증)  ss=cov(x)
 


2014년 10월 29일 수요일

매트랩을 활용한 벡터의 내적과 외적

고등학교부터 벡터의 내적과 외적을 배웠었다.
학부때도 마찬가지인데, 기억도 흐릿하고 의미도 의심스럽다.
이번 기회에 다시 한번 공부도 할겸 정리해 보려고 한다.

1. 회전행렬을 이용한 막대 회전



x=[-.1 -.1 .1 .1]';
y=[-1 1 1 -1]';
box=fill(x,y,'r','erasemode','normal');
axis([-2 2 -2 2]);

 

for i=1:32
t=0.25*i/4;
ts=t*pi;
rot=[cos(ts)  -sin(ts); ...
        sin(ts)  cos(ts)];
uc=rot*[x,y]';
ux=uc(1,:)';
uy=uc(2,:)';
set(box,'xdata',ux,'ydata',uy);
% pause(1)
drawnow
end

 

회전행렬을 통해 삼각함수의 덧셈정리가 헷갈리지 않을 수 있다. 반대일 수도 있고,,,


2. 내적의 증명



BH²+AH²=AB²
a²-2ab·cosθ+b²cos²θ+b²sin²θ=c²
a²+b²(cos²θ+sin²θ)-2ab·cosθ=c²
a²+b²-2ab·cosθ=c

A(x₁,y₁,z₁) , B(x₂,y₂,z₂), O(0,0,0) 일때,
AB²=OA²+OB²-2|OA||OB|cosθ 에서
AB²=(x₁-x₂)²+(y₁-y₂)²+(z₁-z₂)²
OA²=x₁²+y₁²+z₁²
OB²=x₂²+y₂²+z₂²
대입하고 정리하면,
a·b=|OA||OB|cosθ=x₁x₂+y₁y₂+z₁z₂

이렇게 구하는 내적의 물리적 의미는
일정한 크기의 힘 F가 지면과 θ각도로 비스듬하게 물체에 작용하여 지면의 방향으로 d 만큼 이동시켰다면, 힘 F가 물체에 한 일은 W=Fcosθ·d 이다.


3. 외적의 증명

외적의 정의는 a×b=(|a||b|sinθ)v
v는 a와 b가 이루는 평면과 직교하는 단위벡터이다.

 
위와 같이 구해지는 외적은 기하학적으로 아래와 같이 의미가 일치한다.


따라서 주어진 벡터 a,b,c를 세변으로 갖는 평행육면체의 부피는 ? c·(a×b)


4. 내적, 외적을 이용하여 3점을 포함한 평면함수 구하기


 
p1=[1 0 0];

p2=[0 1 0];

p3=[0 0 1];

 
v=cross(p1-p3,p2-p3);

s=dot(p1-p3,p2-p3);

 
c=v(1)*p1(1)+v(2)*p1(2)+v(3)*p1(3);  % v(1)*x+v(2)*y+v(3)*z=c

t=c/(v(1)^2+v(2)^2+v(3)^2); t=v*t;

 
[x y]=meshgrid(-1:.1:1,-1:.1:1);

z=(c-v(1)*x-v(2)*y)/v(3);

 
quiver3(0,0,0, v(1),v(2),v(3),'r')

hold on

surf(x,y,z)

px=[0 p1(1) p2(1) p3(1) t(1)];

py=[0 p1(2) p2(2) p3(2) t(2)];

pz=[0 p1(3) p2(3) p3(3) t(3)];

xlabel('x')

ylabel('y')

plot3(px,py,pz,'o')

hold off

 



5. 구좌표계에서 법선과 접선벡터 그리기
 
[x,y,z] = sphere(16);
surf(x, y, z)  % sphere centered at origin
hold on
r=sqrt(x.^2+y.^2+z.^2);
p=sqrt(x.^2+y.^2);
th=atan(y./x);
phi=atan(z./p);
[TH,PHI,R] = cart2sph(x,y,z);
 
quiver3(x,y,z, x, y, z,'r')
quiver3(x,y,z, -y./p,x./p,zeros(size(z)),'g')
quiver3(x,y,z, (x./p).*z, (y./p).*z, -(y./p).*y-(x./p).*x, 'b')
 
hold off
xlabel('x')
ylabel('y')
zlabel('z')
colormap(gray)
 
for x = -10:1:10
    campos([x,2,2])
    drawnow;
    pause(0.2)
end
 
 

6. 발산의 정리

먼저 그린의 정리는 http://hypertimespace.tistory.com/119 를 참고하였다.
모두 엄밀한 증명은 아니고, 간략하고 특수한 경우를 바탕으로 감을 잡기가 목표이다.


이어서 가우스 발산정리는 아래와 같고,,,

 ds : 곡선에 대한 호의 길이 변화량 , dS : 곡면의 변화량, dA : 평면의 변화량



문제T가 x²+y²+z²=4 로 둘러싸인 영역일 때,
벡터장 F=[x,y,z]에 대해 가우스 발산의 정리 성립확인? 32π


7. 벡터의 라플라시안(∇²F)

∇×(∇×F)=∇(∇·F)-∇²F 을 매트랩으로 검증해 보자!



% DcDcF=DDdF-DDF

syms P Q R;

syms dx dy dz;

F=[P Q R];

D=[1/dx 1/dy 1/dz];

DcF=cross(D, F)

DcDcF=cross(D,cross(D, F))

 

DdF=D*F.';

DDdF=[DdF/dx; DdF/dy; DdF/dz;].'

DF=D*[F; F; F]

DDF=D.^2*[F; F; F]

% DcDcF=DDdF-DDF

 

이제 맥스웰의 방정식과 전자기파 파동방정식을 이해하기 위한 기본적인 도구들은

다 준비가 된것 같다.

2014년 10월 4일 토요일

자유공간 전파 손실 모델(Friis)

그동안 너무 넋 놓고 살았다고 할까.
금쪽같은 시간을 무의미하게 그냥 흘려 보낸것 같아 속상하다.
블로그를 나름 알차게 운영하려고 했는데,
다른 블로거 처럼 내용 좋고 글빨 있는 블로그를 다작할 재주가 내게는 확실히 없나 보다.ㅎ
그래서 리프레쉬를 위해 블로그를 옮기거나 폐쇄할까 생각했지만,
블로그 초기 취지를 고려해서 개선하는 쪽으로 생각을 바꿔 먹었다.
또한 몇 안되는 독자를 위해(?)ㅎㅎ
앞으로는 주제도 한정하지도 않을 생각이다.

그럼 이제 마음을 다잡고,
다작은 어렵겠지만, 내 블로그는 쭈욱 계속 될 것임을 밝힌다~!!

오늘의 주제는 자유공간 전파 손실 모델(Friss)이다.
이쩌면 이 주제가 그 기나긴 통신전공 여정의 최종목적지가 아닐까 생각해본다.
가장 직관적이고, 실용적인 표현들이 많이 나온다.
엔지니어뿐아니라 일반인도 안테나의 특성을 파악하고 전달하는데
유용하게 활용할수 있는 식일 것읻다.
그럼,,, 이제 시작~~!!


     -  P  : 송수신 방사 전력
     - G : 송수신 안테나 이득
     -  d  : 송수신 간 거리
     -  Ae : 송수신 안테나 실효개구면적

이 그림이 모든 상황을 다 설명해 준다.
나머지는 문제 중심으로 체감해 보자!

1. 송신전력 100W의 5dBi의 이득을 가진 안테나를 사용하
고 있다. 이 때 10km 거리에서 EIRP와 전력 밀도를 계산하라?

<풀이> 안테나이득 10·log10(x)=5, ∴ x=3.16
EIRP=Pt·Gt =100W×3.16(=log-1(5/10))=316[W]
전력밀도 PD=EIRP/4πr²=316/4π(10·10³)²=251.5[nW/㎡]

2. 만약 5W 송신전력, 400MHz의 송신 주파수,  2[dBi] 이득 안테나로 송신될 때, 안테나로부터 100m의 자유공간 거리에서
수신 전력(dBm)을 구하고 이를 이용하여 (10Km)의 수신전력을 구하라. 또한, 수신 안테나는 2[dBi] 이득을 가졌고 시스템 손실은 없다고 가정한다.

<풀이> Pt=10·log10(5000mW/1mW)= 37[dBm]
안테나이득 10·log10(x)=2, ∴ x=1.58
Pr=5·(1.58)²·(3/4)²/(4π·100)²=4.44·10^-6[W] = 4.44·10^-3[mW] = -23.5[dBm]
10km에서의 수신전력 Pr(100)+20·log10(100/10000)=-23.5[dBm]-40[dB]=-63.5[dBm]

3. 마찬가지로, 만약 5W 송신전력, 400MHz의 송신 주파수,  2[dBi] 이득 안테나로 송신될 때, 안테나로부터 100m의 자유공간 거리에서 전계강도를 구하라!
단 케이블 손실은 없고, 50 Ω 부하에 수신안테나 Gr= 2[dBi] ,  
PD·Ae = Pr = V²/R 이고, E²=377PD 이라 가정한다!

<풀이> AF=E/V  ↔   AF[dB/m]=20·log10(E/V) , AF[dB/m]=E[dBμV/m] - V[dBμV]
AF=E/V=9.73/(λ·sqrt(G))=9.73/(3/4·sqrt(1.58))=10.321 
                                            ↔ AF[dB/m]=20·log10(10.321)=20.274[dB/m]
50 Ω : dBm=dBμV-107 이므로 E[dBμV/m]=83.5[dBμV]+20.274[dB/m]=103.774[dBμV/m]


In electromagnetics, the antenna factor is defined as the ratio of the electric field strength to the voltage V (units: V or µV) induced across the terminals of an antenna. The voltage measured at the output terminals of an antenna is not the actual field intensity due to actual antenna gain, aperture characteristics, and loading effects.
For an electric field antenna, the field strength is in units of V/m or µV/m and the resulting antenna factor AF is in units of 1/m:
       AF= E/V
For a magnetic field antenna, the field strength is in units of A/m and the resulting antenna factor is in units of A/(Vm). For the relationship between the electric and magnetic fields, see the impedance of free space.
For a 50 Ω load, knowing that PD·Ae = Pr = V²/R 이고, E²=377PD the antenna factor is developed as:
       AF= sqrt(377PD)/sqrt(50PDAe) = 2.75/sqrt(Ae)= 9.73/(λ·sqrt(G))
 



<전력환산방법>
 50 Ω : dBm=dBμV-107
 75 Ω : dBm=dBμV-108.75

검증해 보면,,, P =-23.5[dBm] = 83.5[dBμV]
전계강도(E[V/m])는 P=V²/R을 이용한다.(R=50Ω)
만약 E가 단위길이당 V이면(E=V)이고, P=-23.5[dBm]이면,
4.44·10^-6[W]·50Ω=V² , ∴ V=0.015[V]
∴ 20·log10(0.015·10^6)=83.5[dBμV]
 

참고로 내 휴대폰의 신호의 세기는 어떻게 구할까?
[설정]→[휴대전화 정보]→[상태]→[신호강도]: (ex) -97dBm , 43 asu

마지막으로,,,
실효 개구면적 (Effective Aperture Area)  Ae
(수신 안테나 부근에 도래되는 입사파의 전력 밀도에 대비한 안테나의 부하로 흡수되는 전력의 비)의 유도과정을 공부하면서 요약해 본다.

먼저, 정현파 전류가 흐르는 매우 짧은 길이의 도선에 대하여 고찰하자
미소길이 도선에 흐르는 전류에 의한 벡터 자기퍼텐셜 A로 부터 H_Φ를 구하고
그 다음 맥스웰의 회전식을 사용하여 E_θ를 구한다.
평균복사전력밀도 Pav=|E_θ(1/r)||H_Φ(1/r)| , Pav=1/2·I²·Rrad 를 정리하면
복사저항 Rrad_rad=80π·(dz)² /λ² 이다.
수신기 종단 전력 Pr=E²·(dz)²/4Rrad=Ae·Pav 정리하면, Ae=3λ²/8π 이고,
결론적으로 일반화하면 Ae=(λ²/4π)·G

이 특성으로 말미암아 안테나의 이득이나 유효면적은 서로의 나머지로 정의할 수 있다.


참고로 위 계산식을 엑셀로 만들어 봤으니 참고하길 바란다.(단위변환 및 Friis 공식)

----------------------------------------------------------------------------------------------
블로그를 이전하여,,, 소스코드는 

https://with1.tistory.com/16

에서 다운로드할 수 있습니다!

2013년 2월 12일 화요일

무선랜 기술

IEEE 802.11은 흔히 무선랜, 와이파이(Wi-Fi)라고 부르는 좁은 지역(Local Area)을 위한 컴퓨터 무선 네트워크에 사용되는 기술로, IEEE의 LAN/MAN 표준 위원회 (IEEE 802)의 11번째 워킹 그룹에서 개발된 표준 기술을 의미한다.

IEEE 802.11은 현재 주로 쓰이는 유선 LAN 형태인 이더넷의 단점을 보완하기 위해 고안된 기술로, 전파(RF)나 빛(적외선) 등을 이용하여서 무선으로 랜(근거리통신망) 환경을 구축하는 것이다.


전송방식표준


종류(승인연도)
속도
접속/변조방식
주파수대역
특징

802.11b

(1999)

11 Mbps

CSMA/CA DSSS(Direct Sequence Spread Spectrum)

ISM대역

2.4GHz

가장 많이 사용되고 있음

전송 속도가 느림

802.11a

(1999)

54 Mbps

CSMA/CA OFDM

5 GHz

주파수 대역이 구별되어 전파간섭이 적은 편

주파수 대역이 달라 호환성 없음

802.11g

(2003)

54 Mbps

CSMA/CA OFDM

ISM대역 2.4GHz

802.11b와 호환 가능

2.4GHz 기기들로부터 간섭이 있을 수 있음

802.11n

(2009)

600 Mbps

CSMA/CA OFDM

2.4GHz/

5GHz

다중 안테나 기술과 채널본딩을 통한 성능 증가
 

















 

※ ISM 대역(Industrial Scientific Medical band)
이 주파수 대역을 사용하는 통신 장비는 ISM 기기들과 이 대역을 사용하는 통신 장비 간에 간섭을 용인한다는 조건에서 사용할 수 있다. 특히 2.4GHz 대역은 공중 무선 LAN 서비스, 블루투스, 무선 식별 시스템(RFID), 디지털 코드 없는 전화 등 다양한 통신에 사용되고 있다.

※ CSMA/CA - Carrier sense multiple access with collision avoidance
블루투스 - 무선 랜(802.11b/g)과 같이 2.4Ghz대의 주파수를 사용한다. 첫째, 블루투스는 저렴한 가격에 저전력(100㎽)으로 사용할 수 있다는 점이 장점이다. 둘째, 블루투스는 주파수 대역을 나누기 때문에 데이터 전송을 여러 주파수에 걸쳐서 분할해 보낼 수 있다.(주파수 도약 확산 스펙트럼, FH-SS) 그렇기 때문에 무선 전송에 따른 보안 위협에서도 상대적으로 안전하다.
무선랜과 블루투스 두 기능을 동시에 가지고 있는 기기의 경우에는 두 장비가 하나의 안테나를 사용하게 되는데, 서로 번갈아가며 데이터를 전송하는 사용하는 방식을 이용하여 애초부터 그 간섭을 최대한 줄이게끔 되어 있다.
블루투스 3.0은 2009년 4월 21일에 발표되었다. 전송속도는 24Mbps로 향상되었다.

적외선 통신 - 전파 대신 파장이 수 ㎜부터 수 100㎚까지의 적외선을 사용하여 수행하는 통신. 적외선의 투과율은 가시광선에 비해 훨씬 좋고, 파장은 마이크로파에 비해 훨씬 짧으므로 초다중 회선을 만들 수 있다. 적외선의 증폭이나 발진에는 적외선 영역의 메이저를 사용하는데 이것은 현저하게 저잡음이고, 주파수 안정도가 좋으며, 또 단방향으로만 집중하여 강력한 방사를 할 수 있는 등의 이점이 있다. 적외선 통신은 빛(光)을 매체로 이용하므로 제품 생산 시 주파수 사용 허가를 받을 필요가 없고 소비 전력이 적은 것이 특징이다.
1993년에 IBM, HP, 마이크로소프트 등이 주축이 되어 ‘IrDA(Infrared Data Association)’라는 규격 단체를 설립, 적외선 통신의 표준 규격을 정함. IrDA DATA 1.4 규격을 준수하는 기기끼리는 1미터 이내의 거리에서 최대 16Mbps의 속도로 무선 데이터 통신이 가능하다.

※ Zigbee - 저속 전송 속도를 갖는 홈 오토메이션 및 데이터 네트워크를 위한 표준 기술. 버튼 하나로 하나의 동작을 잡아 집안 어느 곳에서나 전등 제어 및 홈보안 시스템 VCR on/off 등을 할 수 있고, 인터넷을 통한 전화 접속으로 홈 오토메이션을 더욱 편리하게 이용하려는 것에서부터 출발한 기술이다. IEEE 802.15.4에서 표준화가 진행되며, 듀얼 PHY 형태로 주파수 대역은 2.4GHz, 868/915MHz를 사용하고, 모뎀 방식은 직접 시퀀스 확산 스펙트럼(DS-SS)이며, 데이터 전송 속도는 20~250kbps이다.


802.11a


OFDM 방식의 통신시스템에서는 OFDM신호의 직교성이 유지되어 ISI와 ICS가 방지되도록 정확한 carrier recovery(잡음과 무관하더라도 송수신기간의 거리와 발진기주파수의 차이, 전력계통/송전선로 주파수의 영향)와 symbol synchronization(time recovery)가 이루어져야 한다.

carrier recovery는 주로 정기적으로 삽입된 pilot symbol이나 PRS(Phase Reference Symbol)를 이용한 correlator, PLL 및 협대여필터, tuner 등으로 구성된 장치에 의해 반송주파수 및 위상을 추적하는 것으로 수행되고,

symbol synchronization(time recovery)는 preamble이라 불리우는 trainingg symbol(훈련심볼) 나 CP(Cyclic Prefiz) 또는 null symbol을 이용해서 구현하기도 한다.







이외에 동기화가 잘 수행되기 위해서는 STO(Symbol Timing Offset, δ)와 CFO(Carrier Ferquency Offset, ε)를 잘 보상해주어야 한다. CFO가 발생하는 이유는 발진기의 특성이 안정적이지 못하여 발생되는 위상잡음과 단말의 이동에 따라 도플러주파수 천이(파원이 다가오는 경우 주파수가 높아지는 것)가 발생하기 때문이다.
수신단에서 동기가 이루어지지 않은 경우 이산시간에서 기저대역 신호는 다음과 같이 주어진다.

y[n]=Σ(k=0~N-1) H[k]X[k]exp(j2π(k+ε)(n+δ)/N)+z[n]

※ z는 채널 임펄스응답

초기동기를 위한 OFDM심벌에서, the initial 4.0 µs interval is the idle time when the transmitter sends no signal, and follows the short preamble(8.0 µs), long preamble(8.0 µs), SIGNAL, and DATA fields.

 

 <802.11a 프리앰블 구조>


프리앰블에는 주기가 각각 16(short 훈련심볼), 64(long) 샘플인 두 종류의 훈련심볼이 정의되어 있다. 한 샘플의 주기는 50ns이므로 프리앰블 전체 주기는16us 의 길이를 갖는다.
※ 1 OFDM 심볼(80샘플)=T_gaurd_interval(16샘플)+T_fft(64샘플)


1. CFO 동기
훈련심볼의 반복주기가 D로 주어질 경우에 수신된 시간영역 신호 y[n]와 y[n+D]사이에는 반송파 주파수 옵셋에 의해 각각 exp(j2π*ε*n/N), exp(j2π*ε*(n+D)/N) 만큼의 위상변화가 발생한다. 이경우 두 신호의 위상차이와 반송파 주파수 옵셋의 추정범위는 다음과 같이 주어진다.

∠2π(n+D)/N-∠2πn/N=2πD/N
|2πD/N|=π

짧은 훈련심볼을 사용할 경우에 N=64, D=16 이므로 1FFT주기에 신호가 4번 반복하게 되어 추정할 수 있는 주파수 옵셋 범위가 부반송파 간격의 4배가 되며(|ε|<2),
긴 훈련심볼을 사용할 경우 N=D=64이므로 부반송파 간격 이내의 주파수 옵셋만 추정할 수 있다.(|ε|<0.5).
따라서 IEEE 802.11a에서는 추정 범위를 넓히기 위하여 짧은 훈련심볼을 한 후, 긴 훈련심볼을 이용하여 정확하고 미세한 주파수 추정을 하게된다.

x[n+D]*x[n]=X*exp(2πεD/N)


2. STO 동기
수신단에서 알고 있는 short 훈련신호와 수신신호의 correlation을 취해서 그 크기가 임게치보다 큰 시점으로부터 16 샘플포인트 전의 시점을 심볼의 시작시점으로 인식하는 과정

2013년 1월 21일 월요일

아두이노 시리얼통신

전파를 이용한 통신과 같이 이론적인것만 공부하다보니,

보여지고 체감할 수 있는,

통신이후에 전송된 정보를 처리하는 밑바닥의 하드웨어 원리가 궁금해졌다.

또한 기기들간의 통신에서 가장 기초가되는 시리얼통신 과정도 궁금했다.

그러던 와중에 우연히 인터넷을 통해 '아두이노'에 대해서 알게되었다.

마이크로프세서와 마이크로콘트롤러는 학부시절 갈피를 못 잡고 어렵게 느껴졌는데,

저렴한 가격에 보드와 간단한 키트(약 5만원)를 구입하여 이것저것 만들다 보니 하드웨어에 대해서 조금 알게 되었다.

몇일만에 책한권을 다 뗄수 있을 정도로 쉽게 접근할 수 있고, 쉬운 것도 최고의 장점이라 생각한다.

어두곳에 한 줄이 빛을 발견했다고 할까?ㅎ

그럼 내가 공부했던것을 정리해보자!!

먼저 위키백과를 인용해서 용어 정리부터,,,



 
마이크로컨트롤러(Microcontroller) 위의 컴퓨터를 말한다. PC에 쓰이는 일반 목적의 마이크로프로세서와는 반대로 높은 집적, 낮은 전력 소비, 비용 절감, 자동 처리를 강조하는 마이크로프로세서의 일종이다. 일반 목적의 마이크로프로세서의 일반 산술, 논리 요소뿐 아니라 데이터 저장을 위한 읽기 쓰기 메모리, 코드 저장을 위한 플래시와 같은 읽기 전용 메모리, 계속적인 데이터 저장을 위한 EEPROM, 주변 기기, 입출력 인터페이스 등의 부가 요소를 통합한다. 마이크로컨트롤러는 현대에 쓰이는 마이크로프로세서보다 매우 낮은 속도로 동작하며 일반적인 응용 프로그램들에 적절한 편이다.

마이크로컨트롤러는 자동차 엔진 제어 시스템, 리모컨, 사무 기기, 전자 기기, 전원 도구, 장난감과 같은 자동 조정 제품과 장치에 쓰인다.



 
아두이노(Arduino)는 오픈소스를 기반으로 한 피지컬 컴퓨팅 플랫폼으로, AVR을 기반으로 한 보드와 소프트웨어 개발을 위한 통합 환경(IDE)를 제공한다. 아두이노는 많은 스위치나 센서로부터 값을 받아들여, LED나 모터와 같은 것들을 통제함으로써 환경과 상호작용이 가능한 물건을 만들어낼 수 있다. 또한 플래시, 프로세싱, Max/MSP와 같은 소프트웨어를 연동할 수 있다.
아두이노의 가장 큰 장점은 마이크로컨트롤러를 쉽게 동작시킬 수 있다는 것이다. 일반적으로 AVR 프로그래밍이 WinAVR로 컴파일하여, ISP장치를 통해 업로드를 해야하는 등 번거로운 과정을 거쳐야하는데 비해,  
아두이노는 USB를 통해 컴파일 및 업로드를 쉽게 할 수 있다. 또한 아두이노는 다른 모듈에 비해 비교적 저렴하고, 윈도를 비롯해 맥 OS X, 리눅스와 같은 여러 OS를 모두 지원한다. 아두이노 보드의 회로도가 CCL에 따라 공개되어 있으므로, 누구나 직접 보드를 직접 만들고 수정할 수 있다.


1. 먼저 아두이노의 기본 설정과 매트랩과의 연동을 잘 설명한 사이트를 소개한다.

http://www.matlabinuse.com/index.php?mid=Arduino_with_MATLAB&document_srl=2395


2. 아두이노 LED, 써미스터, 광센서의 회로를 구성하라!
(최대 I/O핀 당 DC 전류 40㎃, Vcc와 GND 핀들 DC 전류 200㎃)



< 회로도 >
 
 [아두이노 GND] --- [330Ω] --- [LED] --- [아두이노 12]
 
 
 
 [아두이노 Power GND] --- [10KΩ] --- [Thermistor] --- [아두이노 Power 5V]
                      ㄴ[아두이노 A0]
 
 

 [아두이노 Power GND] --- [10KΩ] --- [광센서] --- [아두이노 Power 5V]

                      ㄴ[아두이노 A0]



 
// Arduino Sketch //

//  Thermistor //
int sensor = A0;
void setup()
{
Serial.begin(9600);
}
void loop()
{
int reading = analogRead(sensor);
float srV = reading*5.0/1024.0;    //   float srV = map(reading,0,1023,0,5);
float srR = (( 5.0 * 10000.0 )/ srV ) - 10000.0;
float kT = 1.0 / ((1.0 / (273.15 + 25.0)) + (1.0 / 4200.0) * log (srR / 10000.0));
float temp = kT-273.15;
Serial.println(temp);
delay(500);
}

//  광센서 //
const int lightPin = A0;
int lightValue;
int brightness;

void setup() {
  Serial.begin(9600);
}
void loop() {
  lightValue = analogRead(lightPin);
  Serial.println(lightValue);
  //0~1023값을 0에서 255값으로 환산한다.
}
 


3. 써미스터 온도 측정값을 1602 IIC I2C LCD로 출력하라!

가지고 있는 LCD 모듈은 IIC & I2C(Inter-Integrated Circuit) 모듈이 추가된 제품으로
기존의 16핀이 아닌 4핀으로 사용가능한 대신에 I2C 라이브러리를 추가해야한다!
그 다음 LCD의 GND, VCC, SDA(Serial Data Line), SCL(Serial CLock) 를 순서대로
아두이노의 GND, 5V, A4, A5 에 연결한다.

 
// Arduino Sketch //

#include <Wire.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27,16,2);  // set the LCD address to 0x20 for a 16 chars and 2 line display

void setup()
{
  lcd.init();                      // initialize the lcd

  // Print a message to the LCD.
  lcd.backlight();
  lcd.print("Hello, Friends!");
}

void loop()
{
   int a = analogRead(A0);
   float srV = a*5.0/1024.0; 
   float srR = (( 5.0 * 10000.0 )/ srV ) - 10000.0;
   float kT = 1.0 / ((1.0 / (273.15 + 25.0)) + (1.0 / 4200.0) * log (srR / 10000.0));
   float temp = kT-273.15;
   lcd.setCursor(0, 1);
   lcd.print("Temp:");
   lcd.setCursor(6, 1);
   lcd.print(temp);
   delay(500);
}
 


4. 다음으로,,,
 가변저항의 전압을 시리얼통신으로 전송하고,
수신한 데이터를 매트랩에서 실시간 Plot 하자!


< 가변저항 회로도 >
 
 [아두이노 Power GND] --- [가변저항] --- [아두이노 Power 5V]
  |
[아두이노 A0]
 


 
// Arduino Sketch //

int LED = 13; // LED 핀번호
int VR = A0; // 가변저항

void setup() {
  Serial.begin(9600);
  pinMode(LED, OUTPUT);
  pinMode(VR, INPUT);
}
void loop() {
  int v = analogRead(VR);
  Serial.println(String(v));
  delay(100);
}
 


% Matlab %
 
a=serial('COM4','BaudRate',9600);
fopen(a);
n=0; x=300;
for i=1:x
n(i)=fscanf(a,'%d');
plot(n)
axis([1 x 0 1024]);
drawnow
end
 


5. 마지막으로,,,
PC의 매트랩에서 모스부호를 시리얼통신으로 전송하고,
수신한 모스부호에 따라 아두이노의 피에조와 LED를 켜보자!


< 피에조 회로도 >
 
 [아두이노 Power GND] --- [피에조] --- [아두이노 A0]



 
// Arduino Sketch //
 
int led = 13;
int speaker=A0;
char code[10];
 
int duration=120;
char strValue[10];
int index = 0; // 수신된 숫자를 저장할 배열의 인덱스
 
void setup()
{
Serial.begin(9600);
pinMode(led, OUTPUT);    
pinMode(speaker, OUTPUT);
}
 
void loop()
{
if( Serial.available()){
  char ch = Serial.read();
 
  if(ch==10){
    strValue[index] = 0; // 0을 추가하여 문자열을 종료한다.
    morse(strValue);
    index = 0;
  }
 
  else{
    strValue[index] = ch; // ASCII 문자를 문자열에 추가한다.
    index++;
  }
}
}
 
void morse(char *code)
{
  int codeLen=strlen(code);
  Serial.println(code);
  for (int i=0; i<codeLen; i++)
  {
    if (code[i]=='-')
    {
    digitalWrite(led, 1); 
    tone(speaker, 2000,3*duration);
    delay(3*duration);
    }
    if (code[i]=='.')
    {
    digitalWrite(led, 1); 
    tone(speaker, 2000,duration);
    delay(duration);
    }
    digitalWrite(led, 0); 
    delay(duration);
  }
}
 


다음으로 매트랩에서 모스코드 입력(예 '-.-.....')


% Matlab %
 
a=serial('COM3','BaudRate',9600);

fopen(a);

fprintf(a,'%s\n','-.-....');   % 매트랩에서 아두이노로 모스코드 전송

out = fscanf(arduino, '%s');  % 아두이노에서 전송한 모스코드 되 얻음

fclose(a);   % end communication with arduino

 결과 동영상을 촬영했는데, 소리도 거의 안들리고 너무 허접하다.ㅋㅋㅋㅋ



나중에 공부해서 라디오키트도 붙이고, wifi도 연결해 보면 재밌겠다.