요즘 나오는 대부분의 컴퓨터 언어가 그렇지만 패키지 관리자가 있어서 굉장히 쉽게 라이브러리를 설치하거나 삭제할 수 있습니다. 요즘 뜨고 있는 Julia 역시 마찬가지로 패키지 관리자가 있고~ Pkg.add(), Pkg.init(), Pkg.build() 와 같은 명령어를 제공해 줍니다.

julia 설치와 관련해서는 아래 포스팅을 참조하시기 바랍니다.

https://iamaman.tistory.com/2655

최근에 julia 의 그래프 기능을 사용해 보기 위해서 Plots 를 설치하려고 Pkg.add(“Plots”) 을 타이핑 해보니 뭐라 뭐라 에러가 나오더군요. 위 포스팅에서 소개한대로 최신의 JuliaPro 를 설치했는데…. 뭔가 시작부터 안 되는 느낌이라서 조금 짜증이 났습니다. 그래도 궁금한 건 못 참는 성격이기에 검색을 조금 해 보니 업데이트가 안 돼서 그런 것이더군요. 줄리아를 처음 설치했다면 아래 명령어로 일단 업데이트부터 해주는게 좋을 것 같습니다.

Pkg.update()

위 명령으로 패키지를 업데이트 해주고 나니 이후에는 plots package 를 설치할 수 있었습니다.

plots package 를 설치하고 아래 주소에 있는 plots 예제를 실행해 봤습니다.

https://julialang.org/downloads/plotting.html

using Plots

plotly() # Choose the Plotly.jl backend for web interactivity

plot(rand(5,5), linewidth=2, title="My Plot")

처음에는 package 를 로드하는데 시간이 걸리더군요.

pyplot 을 사용하는 예제들은 아직도 동작이 안되는 경우가 있었는데~ 위 코드는 정상적으로 동작을 하더군요~

아래와 같이 브라우저에서 그래프가 나오는 것을 확인할 수 있었습니다.

추가적으로 아직은 julia 초심자이다보니 cheatsheet 가 필요했는데 아래 링크에서 cheatsheet 를 찾을 수 있었습니다.

http://math.mit.edu/~stevenj/Julia-cheatsheet.pdf

아래 포스팅에서 소개했던 Launchy 등에 cheatsheet 를 등록해 놓고 사용한다면 필요할 때마다 편리하게 이용할 수 있을 것 같네요.

https://iamaman.tistory.com/911



Python 사용시 jupyter 를 많이 사용하곤 하는데~

jupyter 를 사용하여 R, Julia 도 코딩 할 수 있더군요.

그래서 오늘은 Julia 를 jupyter notebook 에서 사용하기 위한 방법에 대해 알아보려 합니다.

일단 저 컴퓨터는 Windows 7 64 비트 이고 현재 anaconda 가 설치된 상태 입니다.

anaconda 를 설치하면 Python 과 함께 jupyter 가 설치 됩니다.

다음으로 아래 주소에서 julia 를 설치 합니다. 개발 OS 에 맞게 설치하시면 됩니다.


다음으로 jupyter 에서 julia 를 사용하기 위한 모듈인 IJulia 를 설치합니다. IJulia 설치 방법은 아래 주소 있더군요.


위 조수의 설치 방법 대로 julia 를 실행하고 아래 명령어를 타이핑 합니다.

Pkg.add("IJulia")

IJulia package 가 설치 완료 되면 아래 명령을 통해 IJulia 를 실행 할 수 있습니다.

using IJulia
notebook()

그런데 우리는 jupyter 를 사용할 것이므로 Windows Command Line 에서 jupyter notebook 이라는 명령어를 써 줍니다.


그럼 이렇게 브라우저가 뜨면서 jupyter가 실행 되고 Julia 를 선택 할 수 있습니다.


이런 설치가 부담 스러운 분들은 julia 홈페이지에서 소개하는대로 juliabox 를 사용 할 수도 있으니 참고하시기 바랍니다.


이제 간단하게 사용해 보죠~ 아래 주소에 julia 를 사용하여 그래프 그리는 예제들이 나와 있습니다.


아래 명령어를 통해 PyPlot package 를 설치하고~

Pkg.add("PyPlot") # Install a different backend

다음과 같이 코딩하고 Shift + Enter 를 눌러서 실행하면~

using Plots
plot(rand(5,5),linewidth=2,title="My Plot") # The same plotting command works

이런 결과가 나옵니다.




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');


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

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



다음과 같이 간단한 그래프를 하나 그리고 title 을 설정해 보자.

 

x=1:10;

plot(x)

title('X_Y') 

 

위 코드를 실행 시키면 아래와 같은 그래프가 나온다. 그래프에서 확인 할 수 있는 바와 같이 title XY 로 즉 underscore(_) 로 인해 Y 라는 텍스트가 아래 첨자로 된 것을 확인 할 수 있다.

 

 

 

underscore 로 인한 아래첨자 효과를 없애 주려면 underscore 앞에 \ escaping 하면 된다. 다음과 같이 코딩하면

 

title('X\_Y')

 

이런 결과가 나온다. 

 


그런데 이런 식으로 모든 underscore  escaping 을 하는 것도 귀찮은 경우에는 다음과 같이 underscore 와 같은 문자들을 Interpretering 하지 않도록 설정할 수 있다.

 

t=title('X_Y_A_B_C');

set(t,'Interpreter','none');  



신호 처리에서 convolution은 필터링의 기본이 되는 만큼 매우 자주 사용하게 되는데요~

 

아래 글에서는 MATLAB conv() 함수를 사용하는 게 아닌 for 문을 사용해서 Convolution 을 수행하는 방법에 대해 소개한 적이 있고~

 

http://iamaman.tistory.com/317

 

아래 글에서는 FFT 를 활용하여 convolution 을 하는 방법에 대해 소개한 적이 있습니다.

 

http://iamaman.tistory.com/131

 

오늘은 convolution 수행 시 인덱스를 계산하는 방법에 대해 소개하려 합니다.

 

보통 conv() 함수는 convolution을 수행한 결과만 나오게 됩니다.

 

그런데 신호 및 시스템이나 DSP 등의 과목에서 convolution을 배울 때는 인덱스도 나오게 되죠~

 

다음과 같은 신호 x(n), h(n) 에 대해 convolution 을 수행해 보면~

 

x=ones(1,11);

nx = -5:5;

 

h=linspace(0,5,10);

nh = 0:9;

 

plot(nx,x,nh,h),grid on

legend('x','h','Location','northwest')

axis([-10 10 0 10])

 

 

다음과 같이 인덱스를 포함한 convolution 수행 코드를 작성 할 수 있습니다.

 

function [y, ny] = conv_m(x,nx,h,nh) 

diff1 = (nx(2)-nx(1));

diff2 = (nh(2)-nh(1));


assert(abs(diff1 - diff2) <= eps,'Time difference is not equal!!')

   

ny= linspace((nh(1)+nx(1)),(nh(end)+nx(end)),length(x)+length(h)-1);


y = conv(x,h);

 

위 conv_m() 함수를 사용하여 위에서 소개한 x(n), h(n) 에 대한 convolution 을 수행하면

 

[y, ny] = conv_m(x,nx,h,nh);

plot(ny,y),grid on

legend('Convolution Result','Location','northwest')

 

인덱스가 -5~14까지 인 다음과 같은 결과나 나오는 것을 확인 할 수 있습니다.

 

인덱스를 포함한 Convolution~ 참 쉽죠~



윈도우에서 리눅스 명령 또는 툴들을 사용할 때 GOW 도 사용하지만


2012/11/11 - [유틸] - GNU On Windows 를 이용하여 Windows 에서 Linux 명령어 사용하기


많은 분들이 훨씬 더 많은 기능을 담고 있는 Cygwin 을 주로 사용하실 텐데요~


아래 주소의 Cygwin 홈페이지를 가보니 요즘은 64 비트 Cygwin 도 나왔더군요.

 

http://cygwin.com/install.html

 

32 비트를 설치하시려면~ setup-x86.exe 파일을,  64 비트를 설치하시려면~ setup-x86_64.exe 파일을 다운로드 받아서 설치하시면 됩니다.

 

 

저도 요즘은 64 비트 윈도우를 사용하다 보니 64 비트 Cygwin 을 낼름 깔아 봤습니다.

 

설치 방법은 밑에 글 참조 바랍니다. 

2012/10/07 - [유틸] - Cygwin에서 간단히 C 코딩해보기~

 

제 블로그에서는 MATLAB 을 주로 설명하지만 리눅스에서는 Octave 라는 MATLAB 과 굉장히 유사한 프로그램이 있습니다.

 

Cygwin 에서 Octave 를 설치하실 때, Octave 는 Math 카테고리에 있으니깐 Math 옆의 Default 라고 되어 있는 글을 클릭해서 Install 로 바꿔준 후에 설치하셔야 합니다.

 

 

기쁜 마음으로 ~ Cygwin64 Terminal 에서 다음과 같이 Octave를 실행했습니다.

 

뭐 당연히~ 잘~~ 실행 되더군요.

 

그래서 간단히 사용을 해 봤죠.

 

x=linspace(0, 2*pi,100);

y=sin(x);

plot(x,y)

 

간단하게~ sin() 그래프 그리는 건데…. 헉!! 아래와 같은 메시지가 나오면서 에러가 뜨더군요.

 

0 [main] octave-3.6.4 4852 child_info_fork::abort: ……………. 어쩌구 저쩌구… 블라 블라~


 

그래서 32 비트에서도 해보니 아래와 같이 잘 나오더군요.

 

64 비트에서는 안 되는게 이상해서 구글링을 해보니 아래 글의 중간 정도에 해결 방법이 있었습니다.

 

http://octave.1599824.n4.nabble.com/Octave-3-6-x-for-windows-td4649424.html

 

아래 첨부한 rebaseall_example.bat 파일을 C:\cygwin64 폴더에 다운로드 한 후에~ 아래 그림처럼 관리자 권한으로 실행해 줍니다.


rebaseall_example.bat


 

 

rebaseall_example.bat 파일 내용 >

@echo off

 

cd bin

 

dash -l -i -c "echo ' !! Starting rebasing. Be patient !! \n' ; rebaseall "

 

echo .

echo !! No rebaseall errors ? Than done and fine, !!

echo !! otherwise you have others cygwin process running !!

echo .

 

pause

 

조금 기달렸다가~ 아래와 같은 화면이 나오면 해당 화면을 닫아 주시면 문제가 해결됩니다.

 

이제 Octave 를 다시 실행 시키고 그래프를 그려 볼까요?

 

이제 아래 그림처럼 촤라락~~ 하고 그래프가 나오는 것을 확인 할 수 있습니다.

 

물론 예쁜 그림은 아니지만~


MATLAB 을 대체 할 만한 공학 프로그램으로 이전에 scilab 을 소개한 적이 있습니다.

   

2011/03/11 - [MATLAB] - SCILAB


오늘은 또 다른 오픈소스 프로그램으로서 MATLAB 과 문법이 굉장히 유사한 GNU Octave 에 대해 소개 합니다.

 

일단 다음 페이지에서 다운로드 가능 합니다.

 

http://www.gnu.org/software/octave/download.html

 

위 주소에 가 보시면 GNU 프로그램이니 만큼 source code 뿐만이 아니라 Binary 파일을 제공해 주는군요.

 

Linux , Mac OS X, Windows , Sun Solaris …. 와 같이 널리 사용되는 운영 체제에 대해서는 binary 파일을 제공해 주니깐 자신의 운영 체제에 맞게 다운로드 후

 

설치 하시면 되겠습니다. 


설치 후 실행을 해 보니 다음과 같은 창이 뜨네요. 

 

문법이야 MATLAB 이랑 너무 비슷해서 MATLAB 을 사용할 줄 아신다면 그냥 바로 이용할 수 있습니다.

 

설치를 하게 되면 pdf 및 html 로 약 700 page 에 달하는 document 가 제공되는데요.

 

document도 굉장히 잘~ 정리가 돼서 보기 좋군요. 




간단하게 sine 그래프 하나 그려 볼까요.

 

 

특이 한 점은 plot() 에 세미 콜론을 안 붙이니깐 위 코드에서 보는 바와 같이 warning 이 뜨는군요.

 

그래프는 아래 그림처럼 나오네요. 

 

MATLAB 그래프에 비해 좀 투박한 느낌이 들긴 하지만, 공짜인데 이 정도면 훌륭하다고 생각되네요.

 

document 를 쭉~ 훑어 보니…. 이거 완전 공짜 MATLAB 이잖아~~ 하는 생각이 드네요.

 

너무 좋군요.


오늘은 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

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

움직이는 그래프를 만들어 보자

매트랩에서 그래프를 동영상으로 만드는 방법은 매우 간단하다.

변수에 따라 for 문을 이용하여 그래프를 그리고 각 프레임을 저장을 한다. 그리고 movie() 함수를 이용하여 실행한다.

아래 코드는 사인 함수의 계수값을 증가시키면 어떻게 되는지를 보여주는 코드이다.  


axx = 0:0.01:2*pi;  

for k=1:16
plot(axx, k*sin(axx));

grid on

axis([0 2*pi -16 16])

M(k)=getframe;

end

movie(M,1)  


avifile() 함수를 이용하여 avi object 를 만들어서 avi 파일로 저장도 가능하다.

아래 결과는 좀더 좁은 간격의 k 값에 대하여 실행한 결과이다. 
 



  1. ㅠㅠ 2012.03.20 01:32

    동영상처럼 나오게 하려고 했는데
    for k=0.1:0.1:16으로 하니 Subscript indices must either be real positive integers or logicals. 에러뜨네요 ㅠㅠ 방법좀 알려주시면 감사하겠습니다!

    • 남성 2012.03.20 02:26 신고

      for k=0.1:0.1:16 로 하면 k 값은 0.1, 0.2, 0.3 ... 16 까지 가는거죠.

      그렇다면 아래 부분의 코드를 보면 M(k)=getframe; 부분에서

      M(0.1), M(0.2), .... M(16) 이렇게 들어가게 되겠죠. 벡터 또는 매트릭스의 인덱스는 양의 정수나 logical 값만 들어가야되니깐 에러가 나게 되는거죠.

      좋은 방법은 아니지만 아래와 같이 코딩할 수도 있습니다.


      axx = 0:0.01:2*pi;

      for k=0.1:0.1:16
      plot(axx, k*sin(axx));

      grid on

      axis([0 2*pi -16 16])

      M(round(k*10))=getframe;

      end

      movie(M,1)


      더 좋은 방법은 k를 1:160 으로 하고

      plot(axx, k./10 .*sin(axx)); 이렇게 바꿔주는게 개인적으로는 더 추천 하는 방식입니다.

  2. 2012.03.20 22:24

    비밀댓글입니다

    • 남성 2012.03.20 22:54 신고

      죄송하지만, k가 커졌다 작아졌다 한다는게 정확히 무슨 말씀인지 모르겠네요. 좀더 구체적으로 말씀해 주시는게 좋을듯 합니다.

      k 값이 1에서 부터 16 까지 갔다가 다시 1로 줄어들게 되는걸 말슴하시는건가요? 아님 계속 k 값이 랜덤 하게 들쭉 날쭉 하게 되게 한다는건가요?

    • 2012.03.21 00:52

      비밀댓글입니다

    • 남성 2012.03.21 01:01 신고

      이렇게 하면 됩니다.


      axx = 0:0.01:2*pi;

      temp_k=[1:16 15:-1:1];

      for k=1:length(temp_k)
      plot(axx, temp_k(k)*sin(axx));

      grid on

      axis([0 2*pi -16 16])

      M(k)=getframe;

      end

      movie(M,1)

  3. 2015.07.30 14:52

    비밀댓글입니다

    • 남성 2015.07.30 23:52 신고

      위 코드에서는 M 의 인덱스가 잘못된것 같네요.

      다음과 같이 해 보세요.

      아래 코드가 방문자님이 의도한게 맞나 모르겟네요.

      wt = 0:pi/50:10*pi;

      x = cos(wt + (pi/180));
      y = wt-wt;
      x1 = wt-wt;
      y1 = cos(wt);

      for c = 0:1:10
      figure
      plot3(x-c, y, wt, x1, y1-c, wt)

      axis tight
      grid on
      M(c+1)=getframe;
      end

      movie(M,1)

    • 2015.07.31 11:08

      비밀댓글입니다

    • 남성 2015.07.31 12:15 신고

      다음과 같이 해보세요.

      wt = 0:pi/50:10*pi;

      x = cos(wt + (pi/180));
      y = wt-wt;
      x1 = wt-wt;
      y1 = cos(wt);

      h=figure(1);
      set(h,'visible','off')

      for c = 0:1:10
      plot3(gca, x-c, y, wt)
      axis([-10 10 -10 10 0 32])
      grid on
      M(c+1)=getframe;
      end

      set(h,'visible','on')
      movie(M,1)

    • 2015.08.01 12:45

      비밀댓글입니다

    • 남성 2015.08.01 13:41 신고

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

+ Recent posts