MATLAB 을 사용하여 알고리즘을 개발하고 분석하면서 MATLAB 의 다양한 그래프 기능을 사용하실 것이라고 생각합니다. 10 년도 전에 MATLAB 을 학부 시절에 접하고, MATLAB 의 그래프 기능들이 정말 유용하다는 생각을 했던 기억이 있습니다.

오늘은 MATLAB 을 사용하여 그래프의 영역을 나타내는 방법에 대해서 조금 소개를 하려 합니다.

예를 들어 아래 두 그래프로 둘러싸인 영역을 표시하고 싶을 때 MATLAB으로 어떻게 표현해야 되는지에 대해서 소개를 하려 합니다.

y = x+3

y = 2*x-6

위 두개의 그래프로 둘러싸인 영역을 표시하는 간단한 코드는 아래와 같습니다. 아래 코드에서 설명할 부분은 x_, y_ 를 설정하는 부분과 fill() 이라는 함수에 대한 부분이 될 거 같은데~ fill 함수는 이름에서도 알 수 있듯이 다각형 내부의 색을 채워주는 함수입니다. fill 함수가 다각형의 좌표값을 필요로 하다 보니 x_, y_ 값을 아래와 같이 표현해서 닫힌 형태의 다각형으로 만들어 준 것이고 마지막 인자인 ‘r’ 은 red 즉 빨간색으로 표시하라는 뜻입니다.

x=linspace(-10,30,1001);

y1 = x+3;

y2 = 2*x-6;

x_=[x fliplr(x)];

y_= [y1 fliplr(y2)];

figure

fill(x_, y_, 'r')

grid on

그래프는 아래와 같이 표현됩니다.

fill 함수와 유사한 함수로 patch 함수가 있고~ patch 함수는 하나 이상의 채워진 다각형을 만들어 주는 함수입니다. 다각형 한개를 그릴때는 사실 동일하다고 볼 수도 있을 것 같네요. 위 코드에서 fill 을 patch 로 바꿔도 동일한 결과를 얻을 수 있습니다.

fill, patch 함수가 다각형 내부의 색을 채워주는 함수이다 보니 x_, y_ 와 같은 변수들을 만들어서 사용했는데~ 조금 더 쉽게 영역을 표시하는 함수로 area 함수를 사용할 수가 있습니다. 아래 메뉴얼에도 나와 있지만 2차원 그래프에서 그래프 선과 basevalue 로 둘러싸인 부분의 영역을 표시해주는 함수입니다. basevalue 의 디폴트 값은 0 입니다.

https://kr.mathworks.com/help/matlab/ref/area.html?searchHighlight=area&s_tid=doc_srchtitle

area 함수를 사용한 코드는 아래와 같습니다.

x=linspace(-10,30,1001);

y1 = x+3;

y2 = 2*x-6;

x=x(:);

y=[y1(:) y2(:)];

figure

h = area(x, y);

grid on

코드를 표현하는 것은 조금 더 쉬운 듯한데…. 그래프를 확인해 보면 의도와는 뭔가 조금 다른 것 같습니다. 즉 원하지 않는 파란색 영역도 나타낸 것을 확인할 수 있습니다.

파란색 영역을 없애기 위해서 조금 더 코드를 추가해야 될 것입니다. 파란색 영역을 투명하게 만들기 위해서 해당 부분의 색깔을 흰색으로 만들어 준 후에~ alpha 함수를 사용하여 투명도를 조절해 줬습니다~

h(2).FaceColor = [1 0 0];

h(1).FaceColor = [1 1 1];

alpha(h(1),0.1)

이렇게 해서 나타나는 그래프를 보면~ 아래와 같이 원하는 영역만 표시된 그래프를 얻을 수가 있습니다~




MATLAB 을 사용하여 그래프를 그리는 경우 축을 반전해서 보는게 편한 경우가 종종 있습니다.

이런 경우에는 두가지 방법을 사용할 수 있습니다. 



아래 예에 대해 축을 반전하고 싶은 경우


x=1:0.1:10;
y=sin(x);

plot(x,y)
grid on


  • 플롯 툴을 사용하여 변경하는 방법

플롯 툴 아이콘을 클릭하여  플롯 툴을 실행 합니다. 



다음으로 그래프의 Axis 선택한 이후에 반전하고 싶은 축을 선택하고 반전에 체크를 하고 마지막으로 플롯 툴 숨기기를 클릭 합니다.
위 그림과 비교해보면 X 축의 값이 좌우가 바뀐것을 확인 할 수 있습니다.
Y 축 또는 Z 축 값을 반전하고 싶은 경우라면 아래 그림에서 X축 Y축  탭을 선택한 이후에 반전을 체크해 주면 되겠죠~ 

  • 코드 상에서 변경하는 방법

코드에서 반전 설정하는 방법은 아래와 같습니다.

x=1:0.1:10;
y=sin(x);

figure1 = figure; % 그래프 핸들 설정
axes1 = axes('Parent',figure1); % 축 설정
plot(x,y)
grid on
set(axes1,'XDir','reverse'); % axes1 축 반전, 그래프 그리는 코드 뒤에 있어야 함


위 코드에서 주석으로 밝힌 바와 같이 축을 반전 시키는 코드는 그래프 그리는 코드 뒤에 있어야 합니다. Y 축을 반전하고 싶으면 XDir 이라고 된 속성을  YDir 로 변경해 주면 되겠고 Z 축을 반전하고 싶다면 당연히  ZDir 이라고 설정해 주면 됩니다.

X, Y 축을 둘다 반전하고 싶다면 다음과 같이 설정하면 되겠고~ 

set(axes1,'XDir','reverse','YDir','reverse');


다음과 같은 그래프가 나오는 것을 확인 할 수 있습니다.

축 반전은 값이 변하는게 아니라 그래프의 축만 변화 시키는 것이므로 헷갈려서는 안 됩니다.



Simulink 를 사용하다 보면 여러 Scope 를 여는 경우가 종 종 있습니다.

 

이러한 경우 한번에 Scope 를 다 닫는 명령어가 있나 해서 찾아보니 아래 주소에 그 방법이 나와 있더군요.

 

https://kr.mathworks.com/matlabcentral/answers/94334-how-can-i-programmatically-close-simulink-scope-windows-in-simulink-7-1-r2008a

 

위 주소의 코드를 활용하여 아래와 같이 Simulink Scope 를 다 닫는 함수를 만들어서 사용한다면 편리 할 것 같네요.

 

function scopeCloseAll

shh = get(0,'ShowHiddenHandles');

set(0,'ShowHiddenHandles','On');

hscope = findobj(0,'Type','Figure','Tag','SIMULINK_SIMSCOPE_FIGURE');

close(hscope);

set(0,'ShowHiddenHandles',shh);

end


MATLAB 에서 Figure 창에 대해 그림 파일로 저장 할 때는 Figure 의 File → Save As 에 들어가서~~

 

아래 그림과 같이 다양한 포맷으로 그림 파일을 저장 할 수 있습니다.

 

몇 개 안 되는 Figure 창에 대해 그림 파일로 저장할 때는 아래 그림과 같이 수동으로 하겠지만 다수의 Figure 창에 대해 그림으로 저장할 때는 아무래도 명령어를 사용하는 게 편리 합니다.




 

MATLAB 에서 Figure 창을 그림으로 저장 할 때는 saveas 라는 명령어를 사용합니다.

 

http://www.mathworks.co.kr/kr/help/matlab/ref/saveas.html

 

위 주소의 설명에 나와 있듯이 saveas 를 이용하면 다음 확장자의 그림 파일로 저장 할 수 있습니다.

 

ai, bmp, emf, eps, fig, jpg, m, pbm, pcx, pdf, pgm, png, ppm, tif

 

기본적인 사용방법은 다음과 같습니다.

 

saveas(h,'filename.ext')

 

위 기본형에서 h 는 graphic handle 을 말 합니다. graphic handle이 뭔지 잘 모르겠다 하시는 분은 아래 포스팅을 참조 바랍니다. 


2011/05/25 - [programming language/MATLAB] - MATLAB Graphic handle

 

간단하게 현재의 Figure 창에 대해 PDF 파일로 저장하고 싶다면~ 아래와 같이 명령하면 됩니다. 아래 명령어에서 gcf 는 현재 열려 있는 Figure 창에 대한 graphic handle 입니다.

 

saveas(gcf,'Test.pdf')



오늘은 Scilab 에서 figure 창을 닫는 명령어에 대해 소개 하려 합니다.

 

MATLAB 에서는 간단하게 close 를 하면 현재 figure 창이 닫히고 close all 을 하면 현재 열려진 모든 figure 창이 닫힙니다.

 

하지만 Scilab 에서는 그렇지 않더군요. 어떻게 해야 MATLAB 의 close all 과 같은 기능을 할 수 있을 까 찾아보니~

 

아래 주소의 글이 있더군요.

 

http://help.scilab.org/docs/5.3.3/en_US/m2sci_close.html

 

scilab 에서 MATLAB 의 Close all 과 같은 기능은 xdel(winsid()) 라고 명령해야 합니다.

 

여기서 xdel 은 graphics window 를 닫는 함수이고~ winsid 함수는 graphics windows 의 리스트를 반환하는 함수라고 합니다.

 

그래서 xdel(winsid()) 의 뜻은 graphics windows 의 리스트를 반환하고~ 그 반환 값들을 다 닫으라는 뜻이 됩니다.


아래 포스팅에서 MATLAB 을 이용한 logscale 그래프 그리는 방법에 대해 설명 드렸습니다.

  

2013/01/29 - [programming language/MATLAB] - MATLAB 로그 스케일 그래프 그리기 semilogx(),semilogy(), loglog()

MATLAB 에서는 semilogx, semilogy, loglog 와 같은 함수를 사용하여 x, y 축에 대해 로그 스케일 그래프를 그리게 되는데요~

 

Scilab을 이용하여 2차원 평면에서 로그 스케일 그래프를 그릴때는 plot2d 함수를 사용합니다.

 

plot2d([logflag,][x,],y[,style[,strf[,leg[,rect[,nax]]]]])

 

위 plot2d 함수의 원형에서 logflagn 으로 설정하면 normal scale, l (소문자 L) 로 설정하면 log scale 입니다.

 

그래서 xy 축을 둘다 로그 스케일로 설정하고 싶다면 logflag 값을 ll 로 설정하고~

 

X 축은 log 스케일로 y 축은 normal scale 로 설정하고 싶다면 ln, x축은 normal scale, y 축은 log scale 로 설정하고 싶다면 nl 로 설정하면 됩니다.

 

그럼 간단하게 예제를 하나 그려 볼까요?

 

다음과 같은 데이터에 대해~

 

x= 0:0.1:10;

x_10=10.^x;

 

semilogx 예제는 다음과 같습니다.

 

figure()

subplot(211)

plot2d("nn",x_10, x)

xtitle("Normal scale", "x axis", "y axis");

 

subplot(212)

plot2d("ln",x_10, x)

xtitle("Semilogx", "x axis", "y axis");

 

 

semilogy 예제는 다음과 같습니다.

 

figure(1)

subplot(211)

plot2d("nn",x,x_10)

xtitle("Normal scale", "x axis", "y axis");

 

subplot(212)

plot2d("nl",x,x_10)

xtitle("Semilogy", "x axis", "y axis");

 

 

loglog예제는 다음과 같습니다.

 

figure()

subplot(211)

plot2d("nn",x_10, x_10)

xtitle("Normal scale", "x axis", "y axis");

 

subplot(212)

plot2d("ll",x_10, x_10)

xtitle("loglog", "x axis", "y axis");

 


MATLAB contour() 함수를 이용하면 등고선 그래프를 매우 쉽게 그릴 수 있다.

 

다음과 수식에 따른 값에 대해 등고선을 그려 보자.

 

[X,Y] = meshgrid(-2:2); % X,Y 설정

Z = 10*(X/5 - X.^3 - Y.^5).*exp(-X.^2-Y.^2); % Z 계산

 

위 식에 대해 아래 명령으로 등고선을 간단하게 그릴 수 있다.

 

figure, contour(X,Y,Z), colorbar

 

 

등고선 사이의 표면에 색을 입히고 싶다면 contourf() 함수를 이용한다.

 

figure, contourf(X,Y,Z), colorbar

 

 

다음과 같은 등고선 그래프를 얻을 수 있다.

 

 

위 그래프를 보면 간격이 너무 넓어서 등고선이 너무 각진 형태로 나오는 것을 확인 할 수 있다.

 

이럴 때는 interp2() 함수를 이용하여 2차원 면에 대한 보간을 할 수가 있다.

 

interp2() 함수는 기본적으로 linear interpolation 을 수행하므로, 좀더 부드러운 곡선을 얻기 위하여 spline interpolatin 을 하면 다음과 같이 부드러운 형태로 된 등고선을 얻을 수 있다.

 

[XI,YI] = meshgrid(-2:0.1:2);

ZI=interp2(X,Y,Z, XI,YI,'spline');

figure, contourf(XI,YI,ZI), colorbar 

 


오늘은 MATLAB subplot()에 대해 알아본다. subplot()은 하나의 figure 창에 여러 그래프를 표시 할 때 이용한다. 다음 예를 통해 subplot() 에 대해 설명한다.

 

x=1:5;

y=1:5;

y2=(1:5)*2;

 

figure, subplot(3, 2, 1), plot(x,y)

subplot(3, 2, 4), plot(x,y2,'r:.')

 

 

subplot(3, 2, 1) 에서 첫 번째 3은 그래프의 행의 개수를 의미하고, 두 번째 2는 그래프의 열의 개수를 의미한다. 세 번째 숫자 1은 위 그림에서 빨간색 글자로 표시한 1 부분에 그림을 넣겠다는 의미이다.

subplot(3, 2, 4)는 에서 세 번째 숫자 4는 위 그림의 4번 부분에 그래프를 넣겠다는 의미이다.

 

그럼 위 그림을 다른 방식으로 그려 보자.

 

figure, subplot(3, 2, [1 2]), plot(x,y)

subplot(3, 2, [4 6]), plot(x,y2,'r:.')

 

 

subplot(3, 2, [1 2]) 에서 [1 2] 라고 나타냈으므로 figure 창의 1번 2번 칸에 그림을 나타내겠다는 뜻이며 subplot(3, 2, [3 4])은 [3 4] 라고 나타냈으므로 figure 창의 3번 4번 칸에 그림을 나타내겠다는 뜻이다.

 

이상으로 subplot() 에 대한 설명을 마친다.


오늘은 EYE PATTERN 에 대해 알아 보려 합니다. 


학부 때 EYE PATTERN 이란 걸 보고 이게 뭘까 ~ 정말 도무지 감이 안 왔던 기억이 있습니다.


EYE PATTERN 이란 특정 시간 구간 동안 들어오는 신호의 파형을 계속 겹쳐서 나타낸 것뿐입니다.


보통 EYE PATTERN을 그릴 때는 2 심볼 구간 동안 표시를 하곤 하죠.


오늘 EYE PATTERN을 하기 전에 BPSK 에 모르시는 분들은 아래 글을 읽고 오시기 바랍니다.

2011/03/08 - [잡담,잡다] - [디지털 통신] BPSK, QPSK

 

그리고 Raised cosine filter 에 대해서는 아래 글을 참조해 주세요.

2011/03/02 - [MATLAB] - [디지털 통신] Raised Cosine Filter

 


그럼 이제 matlab 코딩을 시작 해 보죠. BPSK 신호의 송수신을 예로 들어서 설명해 보겠습니다. 잡음은 고려하지 않겠습니다.


  • 먼저 Square root raised filter 를 만듭니다. 8 oversamplegroup delay 3심볼, roll off 0.2 인 필터를 만들겠습니다.

Sqrt_r_filter= rcosine(1e6, 8e6, 'sqrt', 0.2, 3);



  • 비트를 만듭니다. 여기선 5000 비트를 만들겠습니다.


bits=randi([0 1], 5000, 1);



  • 비트 0은 -1로 비트 1은 1로 Mapping 해줍니다.


Mapped_signal=bits*2-1;



  • 8 oversample 이므로 8배upsample 을 합니다. upsample 이란 중간에 0을 채워 넣는 겁니다.

Upsampled_signal=upsample(Mapped_signal, 8);


  • Tx filtering 을 수행합니다.

Tx_signal=filter(Sqrt_r_filter,1, Upsampled_signal);



  • 수신 단에서는 Rx filtering 을 수행합니다.


Rx_signal=filter(Sqrt_r_filter,1, Tx_signal);

  

이제 신호의 송수신은 다 됐습니다.

근데 위에서도 말했듯이 EYE PATTERN 을 보기 위해서는 특정 구간으로 겹쳐서 그려야 합니다.

따라서 위의 수신 신호 Rx_signal 을 적절히 구성만 해주면 됩니다.


2 심볼 구간 동안의 EYE PATTERN을 보기 위한 2 심볼은 8*2 = 16 샘플 입니다.

그리고 Rx_signal 의 1부터 48번째까지의 값은 delay 값 일명 쓰레기 값입니다. 이는 필터의 delay 가 3 심볼이니깐 8*3에다 Tx , Rx 필터 통과니깐 또 *2 를 해서 48 이라는 숫자가 나오는 겁니다.


이제 다음과 같이 매트릭스를 구성합니다.

 

Rx_signal1=Rx_signal(49);

Rx_signal_cutted=Rx_signal(50:end);

N_column=floor(length(Rx_signal_cutted)/16);

Rx_signalmatrix=reshape(Rx_signal_cutted(1:16*N_column),16,N_column);

 


아래 코드의 빨간색 부분은 이전 신호의 온 타임 지점을 반복시켜 주기 위한 것입니다.


Rx_signalmatrix_all=[[Rx_signal1 Rx_signalmatrix(end,1:end-1)] ;Rx_signalmatrix];

 

이제 그림을 그려줍니다.


figure, plot(Rx_signalmatrix_all,'b'), grid on

 

결과는 다음과 같습니다.

 

그럼 ~ 맨~ 처음 만들었던 필터에서 roll off 를 바꿔가며 위에서 진행한 실험을 똑같이 해 봅니다.


roll off 가 0.5 일 때

 

roll off 가 0.7 일 때

 

roll off 가 1 일 때

 

쭉~ 보니깐 roll off 가 올라갈수록 그림이 깔끔해 지죠? roll off 가 올라갈수록 EYE 는 점점 더 열리게 되 므로 신호 품질은 더 좋아지는 겁니다.


하지만 공학이란 게 어디까지나 트레이드 오프가 있는 거니깐~ roll off가 높아진다고 무조건 좋은 건 아닙니다. roll off 가 높아질수록 BW(대역폭) 을 더 이용하게 되는 겁니다.

   

EYE PATTERN 이란 게 직접 시뮬레이션 해 보면 별거 아닌데 처음에 보면 이해가 어렵습니다. 이 글을 보시는 분들도 위 코드대로 직접 시뮬레이션 한번 해 보시기 바랍니다.


  1. 김도윤 2012.05.02 12:38

    여쭤볼게 있는데요.
    Upsample을 하면 bit간 간격이 넓어지니까 filter도 그에 따라서 time domain에서 늘려줘야 하지 않나요?
    그리고 마지막에 신호의 온타임 지점을 반복한다는 것이 무슨 말인지 잘 이해 못하겠네요.
    혹시 댓글 보시면 답변해주시면 감사하겠습니다.

    • 남성 2012.05.03 00:03 신고

      upsample 이란게 0 을 끼워 넣어주는것이므로 샘플 간의 간격은 좁아지는 겁니다. 즉 sample rate가 그만큼 증가하는 것이죠.

      위 포스팅에서 아래 코드는 필터 계수를 설계하기 위한 것인데~~

      Sqrt_r_filter= rcosine(1e6, 8e6, 'sqrt', 0.2, 3);

      1e6, 8e6 이므로 8배 upsample 에 대해 filter 계수를 생성하는 겁니다.

      예를 들어 4배 upsample 에 대해 filter 계수를 생성하고 싶다면

      rcosine(1, 4, 'sqrt', 0.2, 3); 하시면 됩니다.


      위 포스팅에서 아이패턴은 2심볼 구간 동안그린건데 17 샘플 마다 그려 주게 됩니다.

      즉 온타임 지점은 8 샘플 마다 오니까 예를 들자면

      1 9 17 를 그린 다음에

      17 25 33 를 그리고

      33 41 49 를 그리고

      49 57 65 를 그립니다.

      위 숫자들을 보면 17 33 49 번째 샘플을 한번씩 더 그린거죠. 그렇게 안 그리면 아이패턴을 그릴때마타 한 샘플씩 어긋나게 그리게 되겠죠.



  2. scac 2012.09.20 17:39

    roll-off가 올라가서 eye pattern이 열리는게 아니라, square root raised cosine의 양 옆 진동하는 부분을 너무 짧게 잡아서 저렇게 눈이 닫히는거 아닌가요? 콘볼루션 연산 하는데 저렇게 짧으면 값이 제대로 안나올텐데요;
    포스팅에는 3개 밖에 없는데 이것을 300개로 늘리고 roll-off는 낮은 값으로 해보십시오.

    • 남성 2012.09.20 17:59 신고

      방문해 주셔서 감사합니다.
      위 포스팅의 경우 raised cosine filter 의 group delay 3 을 줬고 oversample rate 가 8 이므로 8*3*2+1 = 49 tap raised cosine filter 를 사용하게 되거든요. 300 이라는 건 group delay 를 말하는 건가요? 보통 group delay 를 그렇게 크게 주진 않는데 어떤걸 300 을 말씀하시는 건지요? group delay 300 이 되면 filter tap 이 4801 tap 이 되는데... raised cosine filter 로 이렇게 긴 필터를 사용하진 않죠.

  3. scac 2012.09.20 18:11

    비트수가 5000개인데 square root raised cosine 의 양 옆 진동하는 부분(그룹 딜레이라고 하는가요?)이 만약 3이면 그 진동하는 부분이 좀 떨어져 있는 다른 비트에 닿지 않습니다. (간섭이 안 일어난다 하더라도 닿게는 해야한다고 생각하는데;)
    그리고 제가 말한 300이라는 숫자는 그냥 막연히 적은 숫자이구요. 저는 rcosfir를 사용해서 좀 헷갈리네요;;

    교과서의 eye pattern은 roll-off를 낮춘다고 해서 간섭이 일어나지 않고 한 점에서 만나거든요.

    • 남성 2012.09.20 21:42 신고

      group delay 3 이란 이전 3 심볼 구간 동안에 영향을 미친다는 겁니다. 따라서 보통 첫번째 온타임 지점은 3 심볼 만큼의 딜레이 후에 잡게 되죠. 각 심볼의 sidelobe 부분이 이전 3개와 심볼과 나중 3개 심볼에 영향을 주는거죠.

      보통 raised cosine filter 는 송수신단 square root raised cosine 로 나누어져서 matched filter 의 형태로 사용되죠.
      말씀하신 rcosfir() 함수는 raised cosine filter 입니다.
      위에 제가 설명한 것은 square root raised cosine 필터이고 raised cosine filter 의 경우에는 roll off 에 상관 없이 점으로 나오는게 맞습니다.
      위에 함수중 rcosine() 함수의 'sqrt' 부분을 'normal' 로 바꾸면 raised cosine filter 가 됩니다.

  4. scac 2012.09.20 21:57

    본문 포스팅에 roll-off 인자가 0.2인데 수신신호 샘플링 타임 지점이 너무 두껍게 나와서 말씀드린 것입니다. 제가 알기로는 roll-off 인자가 0~1에서 어떤 값을 가지든 수신필터, 송신필터가 각각 square root raised cosine일 경우 한 점에서 만나는 것으로 알고 있어서요. 본문 포스팅 이미지는 너무 두껍지 않나 해서..
    그리고 rcosfir도 'sqrt'를 넣어서 사용하는걸 말씀 안드렸네요.. :)


    이해를 돕기 위해 본문 포스팅에 있는 매트랩에서 숫자만 수정해 보았습니다. 말씀하신 그룹딜레이 3을 100으로 늘렸습니다. 본문포스팅 roll-off 가 0.2인 결과물보다 훨씬 나아보입니다.

    Sqrt_r_filter=rcosine(1e6, 8e6, 'sqrt', 0.2, 100);

    bits=randi([0 1], 5000, 1);

    Mapped_signal=bits*2-1;

    Upsampled_signal=upsample(Mapped_signal,8);

    Tx_signal=filter(Sqrt_r_filter,1,Upsampled_signal);
    Rx_signal=filter(Sqrt_r_filter,1,Tx_signal);



    Rx_signal1=Rx_signal((2*8*100)+1);
    Rx_signal_cutted=Rx_signal((2*8*100)+1+1:end);
    N_column=floor(length(Rx_signal_cutted)/16);
    Rx_signalmatrix=reshape(Rx_signal_cutted(1:16*N_column),16,N_column);


    Rx_signalmatrix_all=[[Rx_signal1 Rx_signalmatrix(end,1:end-1)] ; Rx_signalmatrix];

    figure, plot(Rx_signalmatrix_all,'b'), grid on

    • 남성 2012.09.21 09:42 신고

      네 scac 님이 하신 말씀이 맞습니다.
      교과서에서 말하는 raised cosine filter 는 이론적으로 무한대의 탭을 가지는 필터이므로 당연히 딱 점이 되서 나옵니다.

      제가 얘기하는것은 Sqrt_r_filter=rcosine(1e6, 8e6, 'sqrt', 0.2, 100);
      를 하면 Sqrt_r_filter 의 경우 1601 탭이 나오는데. 이것도 물론 이상적인 것은 아니지만, 구현 불가능 할 정도로 긴 필터 탭이라서 실제로 써 먹기는 어렵다는 거구요.

      즉 위에 말씀 하신 필터 같은 경우엔 이론적으로는 가능한데 실제로 써먹기는 거의 불가능 할 정도로 너무 길다는 겁니다.

      실제로 FPGA 등에서 멀티플라이어 수는 제한이 있으니까요.

      따라서 1601 탭 같이 긴 필터 탭으로 만들면.. 실제로 구현이 안되는, 알고리즘을 위한 알고리즘을 하는 꼴이 되는거죠.

  5. 뽀로리 2013.09.15 13:58

    지금 디지털통신공학및설계 수업때문에 15개의 그래프를 위해서 시뮬레이션 돌리기를 시도중입니다.
    처음 만저보는 프로그램이기도 하면서 통신도 잘 몰라 매트랩 하는데 어려움이 많은데요.
    혹시 4진 eye pattern은 어떻게 만들 수 있을까요?
    책은 Introduction to Analog & digital communications 2nd Simon Haykin/Michale Moher 입니다.
    메일 kkb8594@gmail.com입니다.
    제발 조금 도와주십시오. 부탁드립니다.

    • 남성 2013.09.15 17:29 신고

      4진 아이패턴 이라는게 16 QAM 에대한 아이패턴을 말씀하시는건가요?
      위 포스팅은 BPSK 에 대한 예인데.. 16 QAM 이라면 http://iamaman.tistory.com/205 글 보고 mapping 만 바뀌면 됩니다. 일단 변조 방식에 대한 이해가 필요 하실듯 하네요

MATLAB 에서 그래프를 그려 보자.

x=1:10

x =

1 2 3 4 5 6 7 8 9 10

 

y=1:10

y =

1 2 3 4 5 6 7 8 9 10

 

figure, plot(x, y, 'r*--'), grid on

 

명령어를 치면 아래와 같이 윈도우 창의 중간 부분 그림이 뜬다.

 

 

 

 

저런 그림을 여러 그릴 경우에는 그림이 겹쳐서 한번에 보기에는 곤란한 경우가 많다.

 

이런 경우에 그림의 위치를 설정해 줄수 있다면 굉장히 편리하다.

 

matlab 에서 화면의 크기를 알려면 다음과 같이 명령어를 입력하면 된다.

 

get(0, 'screensize')

ans =

1 1 1680 1050

 

 

모니터는 현재 1680 바이 1050 픽셀 크기를 가지고 있다고 나온다.

 

그럼 이제 화면상의 하단 상단 두개의 그래프를 넣어 보자.

 

figure('units', 'normalized', 'pos',[0.0 0.0 0.5 0.5])

plot(x,y,'r*--'), grid on

 

 

figure('units', 'normalized', 'pos',[0.5 0.5 0.5 0.5])

plot(x,y,'b>--'), grid on

 

 

명렁과 같이 했을 다음과 같은 화면이 보이는 것을 확인 할 수 있다.

 

 

 

그럼 코드에 대해 설명해 본다.

 

figure('units', 'normalized', 'pos',[0.0 0.0 0.5 0.5]) 에서

 

  • 'units', 'normalized' 부분은 화면의 단위를 1 정규화 하겠다는 뜻이다. 픽셀의 개념으로 쓰는 것이 아니라 가로든 세로든 최대 값은 1 정규화 해서 쓰겠다는 것이다.
  • 'pos',[0.0 0.0 0.5 0.5] 그래프가 놓인 위치를 지정하는 것이다.
    • pos position property 표현한 것이다. position 이라고 줘도 되고 구분만 된다면 예와 같이 pos 정도까지만 줘도 position property 라는 것을 알아 듣는다.
    • [0.0 0.0 0.5 0.5] 부분은 [left, bottom, width, height] 나타낸다. 모니터 화면의 왼쪽 아래 모서리가 0, 0 지점이다.

 

 

이상으로 matlab 에서의 그래프 위치 지정에 대한 설명을 마친다.

 

그래프의 위치를 자유 자재로 지정 함으로써 한번에 여러 그래프를 봐야 매우 편리 하게 이용할 있다.

 


  1. 넬핀 2012.01.04 10:05

    좋은 정보 잘 봤습니다. 단순히 figure는 숫자로 구분하는 기능만 있을 줄 알았는데 위치까지 조절해서 깔끔하게 실행할 수 있겠네요 +_+
    감사합니다~!

    • 남성 2012.01.04 10:48 신고

      도움이 되었다니 다행이네요~ 방문해 주셔서 감사합니다. ^^

  2. 백곰사냥꾼 2013.04.06 10:55

    왕 편한 자료입니다 ㅎㅎ
    그래프 띄울때 항상 구석에 가있어서 불편했는데 좋은자료 ㄳ

+ Recent posts