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 시작시 스크립트 실행 방법에 대해 소개한 적이 있습니다.

http://iamaman.tistory.com/995

 

이와 비슷하게 MATLAB 을 종료 할 때 스크립트를 실행하도록 하는 방법에 대해 소개하려 합니다.

 

MATLAB 의 path 에 finish.m 파일을 설정해 놓으면 MATLAB 을 닫을 때 마다 해당 파일이 실행됩니다.

 

finish.m 파일 설정 관련 매뉴얼은 아래 주소에 있습니다.

 

http://kr.mathworks.com/help/matlab/ref/finish.html

 

MATLAB Command Window 에 path 라고 타이핑 하면 설정된 path 를 쉽게 확인 할 수 있고~

 

path 를 추가하기 위해서는 Command Window 에 pathtool 이라고 타이핑 하면 path 설정 툴이 나타나면 여기에 finish.m 파일을 저장할 폴더를 저장하면 됩니다.

 

finish.m 파일은 보통 설정이나 workspace 변수 값 등을 저장하는데 사용되며

 

저는 보통 아래와 같이 MATLAB path 를 파일로 저장하도록 설정해서 사용합니다.

 

disp(getString(message('MATLAB:finishsav:SavingWorkspaceData')));

savepath D:\pathdef.m

 

finish.m 파일을 위와 같이 작성하고 MATLAB 을 닫아 보면~

 

아래 그림과 같이 "작업 공간 데이터 저장 중" 이라는 메시지가 나오고~ path 변수들이 D:\pathdef.m 파일에 저장된 후 MATLAB 이 종료 됩니다.

 


MATLAB 은 기본적으로 matrix 연산을 수행 합니다.

 

element-by-element 연산을 수행하고자 하는 경우에는 보통 점(.) 을 붙여서 다음과 같이 .* 와 같이 표현하곤 하죠.

 

또한 이런 element-by-element 연산을 하기 위해서는 변수의 차원이 맞아야 합니다. 즉 같은 크기여야 합니다.

 

다음과 같이 1행 ×3 열 의 x와 3행 × 1열의 y 를 3 × 3 행열을 만든 다음에 더하고 싶을 때는

 

 

다음과 같이 구성해야 할 것입니다.

 

일단 repmat 을 사용해서 x, y 를 3×3 행열로 만들어 주고~ 다음에 더해야 에러 없이 정상적으로 element-by-element 연산을 수행 할 것입니다.

 

 

그런데 오늘 소개할 bsxfun(binary singleton expansion function) 을 활용 하면 이렇게 차원을 고려해서 맞춰줘야 하는 불편함이 줄어 듭니다.

 

위에 문제는 bsxfun() 를 써서 다음과 같이 좀더 편리하게 처리 할 수 있습니다.

 

bsxfun (function handle, x, y)

 

 

bsxfun() 를 사용하면 x, y 변수를 크기에 element-by-element 연산을 할 수 있도록 각각 사이즈를 조정해서 더하기를 해 준다는 것을 확인 할 수 있습니다.

 

아래 주소에 그 매뉴얼이 있고~ MATLAB command 창에 doc bsxfun 를 해서 매뉴얼을 학습해 보시기 바랍니다.

 

http://kr.mathworks.com/help/matlab/ref/bsxfun.html?requestedDomain=www.mathworks.com

 

function handle 에 대해 궁금하신 분들은 아래 포스팅을 참조 하시길~

 

http://iamaman.tistory.com/122

http://iamaman.tistory.com/175


 이번 포스팅에서는 Exponential r.v. 의 생성 방법에 대해 설명한다.

 

Exponential r.v. 의 pdf 는 다음과 같다.

 

 

위 pdf 를 적분하면 cdf 를 구할 수가 있고, cdf 는 다음과 같다.

  

 

Exponential r.v. 은 위 CDF 수식의 inverse 를 통해 구할 수 있으며 rand() 함수를 이용하여 다음과 같이 생성 할 수 있다.  

 

위 exponential generation 함수를 이용하여 exponential r.v. 을 생성해 보자.

 

아래 코드는 λ = 1 인 경우의 exponential r.v. 을 생성하고 그에 대한 pdf 및 cdf 그래프를 그리는 코드이다.

 

 

위 코드에 따른 pdf 및 cdf 는 다음과 같다.

 

 

 

 

pdf, cdf code 에 대한 내용은 다음 글을 참조하기 바란다.

 

2011/03/23 - [MATLAB] - MATLAB PDF, CDF, CCDF 
 

Exponential r.v. 의 평균 및 분산은 다음 식과 같다.

 

,    

 

λ = 1 인 경우 평균 및 분산은 1 이다.

 

시뮬레이션을 통해 알아본 λ = 1 인 경우의 평균 및 분산은 다음과 같다.

 

 

실험 결과가 이론 값과 근사적으로 일치함을 확인 할 수 있다.


  1. 지나가던 행인 2012.11.10 23:45

    저기 근데 exponential인데 왜 log를 썼죠;;;ㅠ
    exponential 쓰니까 안나오고
    log 쓰니까 나오긴 하는데 이유를 모르겠어요ㅠ

    • 남성 2012.11.11 00:34 신고

      MATLAB 의 log() 함수는 자연로그 입니다.
      random variable 을 생성하는건 CDF 의 역 함수를 이용하니깐
      위 exponential r.v. CDF 의 인버스를 구하는걸 생각해 보면 ln() 을 쓰는게 이해가 되실겁니다.

  2. 2012.11.11 17:11

    비밀댓글입니다

    • 남성 2012.11.11 19:26 신고

      위 포스팅에서 CDF 수식의 inverse 를 구한다고 생각하면 exp() 함수가 없어지고. ln() 함수가 들어가겠죠~
      CDF 란 0~1 사이의 값이고 MATLAB 의 rand() 함수는 0~1 사이의 random 값이 나온다는것을 생각해 보면 이해가 되실것 같네요.

  3. 2012.11.11 17:12

    비밀댓글입니다

  4. 남성님 2016.01.06 14:27

    inverse여서 log를 이용한것까진 이해를 했는데요..
    왜 rand 앞에 1/lambda 는 곱해져 있지 않은걸까요 ㅠ_ㅠ
    수식상으로는 원래 있는데 말이죠..

    • 남성 2016.01.06 18:22 신고

      위에 코드 캡쳐화면 보면 1/lambda 곱해져 있는데요.... ^^;

  5. 남성님 2016.01.12 19:27

    그 log밖이랑 안 둘다 1/lambda를 곱해야하는거 아닌가요?
    exponential r.v. pdf의 경우 lambda*exp(-lambda*x) 로 알고있어서.. ㅠㅠ
    그래서 그걸 inverse 취하면 1/lambda*log(1/lambda(rand(~~)) 이렇게 되야할 것만 같은데 ㅠㅠ
    그렇게 하면 또 원하는 결과를 얻을수 가없더라구요 ㅠㅠ 제가 잘못생각하고 있는걸까요?ㅠㅠ

    • 남성 2016.01.12 20:38 신고

      PDF 의 inverse 가 아니라 CDF 의 inverse 입니다. rand() 함수는 0~1 의 값을 출력하는 uniform random variable 이기 때문에 CDF 값이 0~1사이 값이므로 이를 이용해서 Random variable 을 generation 하는 겁니다.

      위에 포스팅에서는 코드는 맞게 했는데 제가 CDF 수식을 잘못 적었네요 오해의 소지가 있었네요 ^^; 수정 했습니다.

      아래 위키 피디아를 보시면
      https://en.wikipedia.org/wiki/Exponential_distribution

      Generating exponential variates 라는 부분이 있는데 그 부분을 보시면 좀더 쉽게 이해 하실 겁니다.






  6. 남성님 2016.01.13 15:47

    감사합니다.
    덕분에 확실하게 알아가게되었어요^.^
    자주 방문하겠습니다!

컴퓨터를 사용시 텍스트를 검색할 때 주로 grep 와 같은 툴을 사용 합니다.

 

물론 grep 말고도 아래 주소에서 소개한 Ack, The Platinum Searcher 와 같은 툴들도 있습니다.

 

http://iamaman.tistory.com/1310


http://iamaman.tistory.com/1572


 

그런데 MATLAB 에서 grep와 같은 기능이 없을까 해서 찾다 보니 아래 주소의 MATLAB File Exchange 에 grep 가 있더군요.

 

http://www.mathworks.com/matlabcentral/fileexchange/9647-grep--a-pedestrian--very-fast-grep-utility/content/grep.m

 

 

다운로드를 클릭해서 다운로드 받은 후에 압축을 풀면 grepdemo.m, grep.m 파일이 나타납니다.

 

이 중에 grep.m 파일을 사용자의 라이브러리 폴더 등에 넣어 놓고 사용하면 됩니다.

 

Help grep 라고 타이핑 하면 다음과 같이 옵션이 나오고 적절한 옵션으로 사용하면 되겠네요.


 

영어가 짧아서 옵션 내용이 잘 이해가 안 된다 하시는 분들은 grepdemo.m 파일을 한번 돌려 보면 좀더 쉽게 이해가 될 듯 합니다.

 

데모파일의 내용 중 아래 명령을 보면~ 간단하게는 –i 는 case insensitive 이고~ -n 은 line number 를 출력하는 옵션 입니다.

 

grep -i -n Version grep.m

 

grep.m 파일로부터 Version 이라는 글자를 찾는 예입니다.

 

다음과 같이 줄 수와 함께 Version 이라는 글자가 들어 있는 줄을 출력하는 것을 확인 할 수 있습니다.


 

 

리눅스 터미널과 같이 파이프 라이닝을 해서 찾을 수 있다면 좀더 편리할 것 같긴 하지만 그래도 나름 쓸 만은 하네요.

 

Grep 명령은 다음과 같이 함수의 형태로도 사용 할 수 있더군요. 함수의 형태로 사용 한 경우에는 아래 결과와 같이 파일의 full path 가 return 됩니다.



오늘은 MATLAB을 사용하여 파일을 압축하는 방법에 대해 소개하려 합니다.

 

MATLAB 에서 파일을 압축하기 위해서는 다양한 함수가 있는데~

 

zip, unzip, gzip , gunzip, tar, untar 등과 같은 함수가 있습니다.

 

압축방법은 아래 매뉴얼에 나와 있는 바와 같이~

 

http://kr.mathworks.com/help/matlab/ref/zip.html

 

zip 파일명을 넣고 뒤에 압축하고자 하는 파일 명들을 셀 타입으로 넣으면 됩니다.

 

zip('backup.zip',{'*.m','*.mat'});

OR

zip('backup.zip',{'abc.m','aaa.mat'});

 

그런데 파일이 현재 폴더에 있다면 위와 같은 방식으로 하면 되는데~

 

저 같은 경우에는 파일이 여러 군데로 분산되어 있는 경우가 많이 있습니다.

 

이런 경우에는 사용하는 파일을 하나 하나 찾아서 압축파일에 추가하려면 매우 불편하고 실수 할 수도 있는 일이죠~

 

이런 경우에는 아래 소개했던 MATLAB Dependency Report 를 사용하는 게 좋습니다.

 

http://iamaman.tistory.com/255

 

위 포스팅에서는 MATLAB Dependency Report 라는 새로운 창을 통해 확인 하는 거지만~

 

depfun('filename') 이라는 함수를 사용하면 filename 에서 사용하는 함수들의 Dependency 를 다 찾아 줍니다.

 

그런데 최신 매뉴얼을 확인 하니 아래 주소에서 matlab.codetools.requiredFilesAndProducts() 를 사용하라고 하더군요.

 

http://kr.mathworks.com/help/matlab/matlab_prog/identify-dependencies.html#f7-58063

 

그럼 이제 matlab.codetools.requiredFilesAndProducts() 를 사용해서 Dependency 를 찾으면 되는거고~

 

Zip() 함수를 사용해서 압축을 하면 되겠네요~ 현재 제가 샘플로 사용할 convTest_20151018.m 파일을 통해 한번 실습 해보죠~

 

위 포스팅에서 소개했던 MATLAB Dependency Report (종속성 리포트)를 확인 해보니 convTest_20151018.m 파일은 conv_m.m 파일을 사용 중에 있습니다.

 

 

convTest_20151018.m 파일에 대해 정상적으로 압축하는 명령은 다음과 같습니다.

 

[fList, pList] = matlab.codetools.requiredFilesAndProducts('convTest_20151018.m');

zip('test.zip',fList)

 

matlab.codetools.requiredFilesAndProducts() 함수를 통해 convTest_20151018.m 파일에서 사용하는 모든 파일들이 fList 라는 셀 타입에 저장 되고~

 

이를 zip() 함수를 통해 압축하는 겁니다.

 

test.zip 파일을 확인 해보면~

 

convTest_20151018.m, conv_m.m 파일을 들어 있는 것을 확인 할 수 있습니다.


MATLAB Symbolic Math Toolbox 를 사용하여 수식을 계산 한 경우 이 수식은 다양한 형태로 표현 가능 합니다.

 

아래에서 소개했던 latex() 함수를 사용하여 latex 형태로 만들 수도 있고~

 

http://iamaman.tistory.com/201

 

pretty() 함수를 사용하여 좀더 보기 좋은 형태로 표현 할 수 도 있습니다.

 

http://iamaman.tistory.com/172

 

이런 다양한 경우 중 오늘은 C code 의 형태로 표현하는 방법에 대해 소개 하려 합니다.

 

http://kr.mathworks.com/help/symbolic/ccode.html;jsessionid=b2c0465dae2d536f7538bfbdb5c3?refresh=true

 

위 주소에 있는 바와 같이 ccode() 함수를 사용하면 됩니다.

 

사용 방법은 굉장히 간단한데요~ 아래 그림과 같이 H 라는 심볼릭 수식에 대해~ ccode(H) 라고 하면 아래와 같이 C code 의 형태로 표현해 줍니다.


 

신호 처리에서 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~ 참 쉽죠~



파이썬을 사용하다 보면 string 처리가 굉장히 편하다는 생각이 많이 했습니다.

 

배열의 각 인자들로 구성된 string 들을 하나로 합치거나 특정 delimiter 로 나누는 등의 일들이 너무나 간단하게 처리 되어서 좋다는 생각이 많이 했습니다.

 

오늘은 MATLAB 에서 string 을 붙이는 방법에 대해 알아보려 합니다.

 

MATLAB 에서는 다음과 같은 경우 그냥 그냉 배열로 구성 하면 string 을 붙일 수 있습니다.

 

a='abc'

b='def'

c=[a b]

 

다음과 같이 c 값은 a, b 값이 붙어서 나옵니다.

 

c =

 

abcdef

 

하지만 중간에 delimiter 를 넣고 싶은 경우에는 얘기가 좀 달라잡니다.

 

중간에 쉼표를 넣고 싶다면 다음과 같이 쉼표를 넣어 줘야 겠죠~

 

c=[a ', ' b]

 

c =

abc, def

 

그런데 이렇게 붙여야 할 문자들이 2~3개라면 이렇게 해도 되겠지만 몇 십개 몇 백개라면 문제가 되겠죠~

 

이럴 때 사용 할 수 있는 함수로 strjoin() 함수가 있습니다.

 

Strjoin 함수는 cell 타입으로 구성된 string 에 대해 delimiter 를 넣어서 문자를 붙일 수 있습니다.

 

aa= {'abc', 'def', 'ghi'}

c = strjoin(aa,', ')

 

c =

abc, def, ghi

 

위 예와 같이 사용 방법은 굉장히 간단 합니다.

 

첫 번재 인자로 string cell 을 넣어주고 두 번재 인자로 delimiter 를 넣어 주면 됩니다.

MATLAB Symbolic Math Toolbox 를 사용하는 경우 아래 포스팅에서 소개한 바와 같이 latex() 함수를 통해 latex 코드가 생성 됩니다.

 

http://iamaman.tistory.com/172

http://iamaman.tistory.com/201

 

워드 등에서는 mathtype 를 활용 하면 latex 으로 나온 수식을 삽입 할 수가 있습니다.

 

그런데 블로그와 같은 웹에서 수식을 표현하고 싶은 경우에는 mathtype 을 사용 할 수는 없죠~ 물론 그림으로 만들어서 넣는 방법도 있지만 그리 편리한 방법은 아닌 것 같습니다.

 

위 포스팅에서 소개했던 아래 코드를 실행해보면~

 

syms a b c d x

f=a*x^2+b*x+c

S=solve(f,x)

latex(S)

 

2차 방정식에 대한 근의 공식과 이에 대한 latex 코드가 다음과 같이 나옵니다.

 

f =

a*x^2 + b*x + c

 

S =

-(b + (b^2 - 4*a*c)^(1/2))/(2*a)

-(b - (b^2 - 4*a*c)^(1/2))/(2*a)

 

ans =

\left(\begin{array}{c} -\frac{b + \sqrt{b^2 - 4\, a\, c}}{2\, a}\\ -\frac{b - \sqrt{b^2 - 4\, a\, c}}{2\, a} \end{array}\right)

 

이렇네 나온 latex 코드는 Mathjax 를 활용하여 블로그에 삽입 가능 합니다.

 

Mathjax의 홈페이지 주소는 아래와 같습니다.

 

https://www.mathjax.org/

 

아래 주소에서 Mathjax 의 다큐멘트를 확인 할 수 있으며~

 

http://docs.mathjax.org/en/latest/start.html

 

위 주소에 있는 아래 코드를 <Head> 와 </Head> 테그 사이에 넣으면 준비 완료 입니다..

 

<script type="text/javascript"

src="https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML">

</script>

 

다음으로 수식을 문단 사이에 입력을 할 때는 $$ 와 $$ 사이에 다음과 같이 수식을 넣습니다. 수식은 latex 또는 MathML 을 넣을 수 있다고 하네요~

 

$$수식$$

 

문장 사이에 수식을 넣고 싶을 때는 다음과 같이 $ 를 하나만 사용한다 하네요~

 

$수식$


물론 이렇게 넣을때는 HTML 모드에서 넣어줘야 합니다.

 

저는 위에 MATLAB 을 통해 만들어진 Latex 코드를 HTML 모드에서 다음과 같이 넣었습니다.

 

$$\left(\begin{array}{c} -\frac{b + \sqrt{b^2 - 4\, a\, c}}{2\, a}\\ -\frac{b - \sqrt{b^2 - 4\, a\, c}}{2\, a} \end{array}\right)$$

 

위와 같이 HTML 모드에서 저장하면 아래와 같이 수식이 표현 됩니다.

 

2차 방정식의 근의 공식이 너무 예쁘게 들어가 있죠~ 초기 로딩이 좀 느리다는 것을 제외 하고는 괜찮네요~

 

 

$$\left(\begin{array}{c} -\frac{b + \sqrt{b^2 - 4\, a\, c}}{2\, a}\\ -\frac{b - \sqrt{b^2 - 4\, a\, c}}{2\, a} \end{array}\right)$$

 

혹시 수식이 너무 많아서 로딩이 너무 오래 걸리는 것 같다 하시는 분들은 아래 사이트들을 통해 Latex 코드를 image 파일로 만들어서 넣어도 될 것 같습니다.

 

http://www.sciweavers.org/free-online-latex-equation-editor

 

 

https://www.codecogs.com/latex/eqneditor.php

 



보통 윈도우 환경에서 MATLAB 에서 컴파일러 사용시 Microsoft windows SDK 를 주로 사용하곤 하는데~

 

아래 글을 보니 윈도우 환경에서 아래 글에서 소개드렸던 MinGW 를 사용 할 수도 있더군요.

 

http://kr.mathworks.com/help/matlab/matlab_external/install-mingw-support-package.html

 

일단 MinGW 를 설치해야는데~ 위 주소에 있는 바와 같이 홈 화면에 있는 Add-Ons을 통해 설치 할 수 있습니다.

 

아래 그림과 같이 MinGW 를 선택해서 Add 를 누르면 설치가 되더군요.

 

 

설치시 주의 할 점은 아래 그림과 같이 아래 그림과 같이 체크를 해제 해야 한다는 겁니다.


 

다음으로 MinGW 설치 폴더의 경로에는 스페이스가 있어서는 안 된다는 것입니다. 위 주소의 매뉴얼에 따르면 "C:\TDM-GCC-64" 와 같이 공백이 없게 해야 한다고 합니다.

 

저는 현재 R2015b 버전을 사용 중이고 아래 그림과 같이 MinGW 와 Microsoft windows SDK 를 사용 중입니다.

 




Command window 에서 mex –setup 을 하고~ 사용하기 원하는 컴파일러를 클릭해서 선택 할 수 있습니다.

 

다음으로 위 주소에 나와 있던 예제를 돌려 봤습니다.

 

코든느 아래와 같습니다. 위 주소에 나와 있는 그대로 입니다.

 

copyfile(fullfile(matlabroot,'extern','examples','mex','yprime.c'),'.','f')

mex yprime.c % yprime.mexw64 파일을 만들어 냄

yprime(1,1:4)

 

다음과 같이 실행 되는 것을 확인 했습니다.

 

>> yprime(1,1:4)

ans =

 

2.0000 8.9685 4.0000 -1.0947

 

yprime.c파일을 확인하면 mex 파일을 만들어서 MATLAB 에서 C 함수를 사용하는 방법을 알 수 있을 겁니다.

 

필요하실 분들을 위해 yprime.mexw64 파일도 첨부합니다.

 


yprime.mexw64

관련 글 : http://iamaman.tistory.com/1664


오늘은 아래 포스팅의 Newton's Method 에 대한 연장으로 다차원 Newton's Method 에 대해 소개해 보려 합니다.

http://iamaman.tistory.com/156

  일단 오늘 포스팅에서 참조한 코드는 아래 주소와 같습니다.

 

http://people.whitman.edu/~hundledr/courses/M467/MultiNewton.pdf

 

다음과 같은 수식에 대해 Newton's Method 를 사용하여 해를 구해 보도록 하죠~

 

 

일단 MATLAB 의 solve() 를 사용하여 해를 구해 보면 ~

format long 


syms x1 x2 real 


S = x1^2+x2^2-x1==0;

S1 = x1^2-x2^2-x2==0;


[x1,x2]=solve(S,S1);


x1=double(x1)

x2=double(x2)



 다음과 같이 다음과 같이 두개의 해가 나오는 것을 확인 할 수 있습니다.

 

x1 =

 

0

0.771844506346038

 

x2 =

 

0

0.419643377607081

 

 

(0, 0) 이야 눈으로 봐도 알 수 있는 거고 ~ (0.771844506346038, 0.419643377607081) 를 구하는 게 문제 겠죠~

 

위 링크의 코드를 참조하여 다음과 같이 multinewton.m 파일을 하나 만듭니다. multinewton() 함수가 newton method 를 실행하는 함수이고~ myfunction() 함수가 풀어야 할 수식에 대한 정의 입니다. 편의상 두 함수는 하나의 파일에 정의 했습니다.

 

function x=multinewton(x,NumIters)

[y,dy]=myfunction(x);

for j=1:NumIters

s=dy\y;

x=x-s;

[y,dy]=myfunction(x);

end

 

 

function [y, dy]=myfunction(x)

n=length(x);

y=zeros(size(x)); %Not necessary for a small vector

dy=zeros(n,n); %Not necessary for a small matrix

y(1)=x(1)^2+x(2)^2-x(1);

y(2)=x(1)^2-x(2)^2-x(2);

 

dy(1,1)=2*x(1)-1; % y(1) 을 x(1) 으로 미분

dy(1,2)=2*x(2); % y(1) 을 x(2) 으로 미분

dy(2,1)=2*x(1); % y(2) 을 x(1) 으로 미분

dy(2,2)=-2*x(2)-1; % y(2) 을 x(2) 으로 미분

 

다음으로 위 함수를 사용하여 newton method 를 실행하기 위해 multinewtonSolve.m 파일을 하나 만듭니다.

 

format long

x=[0.7;0.5]; % 초기값

y=multinewton(x, 7) % 두 번째 인자는 실행 횟수

 

물론 파일로 만들지 않고 그냥 Command Windows 에서 실행해도 됩니다.

 

위에서 만든 multinewtonSolve.m 파일을 실행하면~ 다음과 같이 해가 나오는 것을 확인 할 수있으며~ 위에서 solve() 함수를 사용해서 구한 결과와 같다는 것을 확인 할 수 있습니다.

 

>> multinewtonSolve

y =

0.771844506346038

0.419643377607081

 

이번 포스팅에서는 2개의 변수에 대한 Newton Method 에 대해 소개했는데~ 조금만 응용하면 훨씬 더 큰 차원에 대해서도 풀이가 가능할 겁니다.

 

전체 파일 첨부합니다. 실행해 보시길~

multinewtonSolve.m


multinewton.m



  1. 공돌이 2015.12.10 00:31

    매트랩 공부를 하다가 찾게 되었습니다.
    제가 질문할 내용은 뉴턴 랩슨법에 관해서가 아니지만 질문 할수 있는 방법이 없어서 이렇게 질문합니다.
    라그랑지안 승수법을 사용하여 문제를 푸는 전력 경제급전(economic dispatch)입니다.
    0.3<=P1<=1.5,0.5<=P2<=2
    C1(Pg1)=0.002*Pg1^2+8*Pg1+500
    C2(Pg2)=0.001*Pg2^2+7*Pg2+400
    라그랑지안 함수L=C+x*(-Pg) (x=lambda)를 Pg에 관하여 미분하여 lambda를 구하는 문제입니다.
    제가 궁굼한 것은 라그랑지안 함수 지정 및 lambda지정을 어떻게 해야하는지를 모르겠어서 질문 올립니다.
    감사합니다!

    • 남성 2015.12.12 09:16 신고

      글쎄요 저도 말씀하신 이론 부분을 정확히 모르겠어서 답변을 드릴수가 없네요.

  2. 공순이 2016.05.09 17:45

    안녕하세요. 매트랩 solve 명령어에 대해서 검색하다가 들어오게되었습니다.
    위의 글에서 MATLAB의 solve() 를 이용하면 x1 과 x2 가 다음과 같이 구해진다고 하셨는데요,
    아무리 해봐도 위의 글처럼 두개의 해가 나오는 것을 볼 수가 없었습니다.
    새로 만드신 함수 말고 원래 매트랩의 내장함수 solve 를 이용해서 해를 구하는 방법 좀 알 수 있을까요?
    답변 기다리겠습니다. 감사합니다.

이전에 아래 포스팅에서 QAM constellation 에 대해 소개를 드렸었고~~

 

http://iamaman.tistory.com/205

 

아래 포스팅에서 16 QAM BER 시뮬레이션에 대해 소개한적이 있는데~

 

http://iamaman.tistory.com/120

 

간만에 64 QAM BER 시뮬레이션에 대해 소개 드리려 합니다.

 

생각도 안하고 있었던 내용인데 홍팡이라는 분이 부탁을 해서 하드를 뒤져 보니 있긴 있더군요.

 

이전에는 그냥 MATLAB Communications System Toolbox 의 이론적 BER 함수들을 사용했었는데 ~

 

오늘은 아래 주소에 있던 이론적 BER(Bit Error Rate) 수식을 사용했습니다.

 

http://www.raymaps.com/index.php/ber-64-qam-awgn/

 

코드는 아래 Zip 파일 다운로드 받아서 BER_simulation_64QAM.m 파일을 돌려 보시기 바랍니다.

 

64qam.zip

 

최신의 MATLAB 을  사용한다면 Randint()함수 관련 경고가 뜰텐데 무시하고 시뮬레이션 하시면 됩니다. 경고가 보기 싫다면 Randi() 함수로 변경해서 사용하면 됩니다.


다음과 같은 Constellation 과 64 QAM BER 결과를 확인 할 수 있습니다. 위 링크에 첨부되어 있는 결과와 마찬가지로 이론적인 성능과 거의 근사치의 시뮬레이션 결과가 나오는 것을 확인 할 수 있습니다.

 

 


리눅스 쉘을 자주 사용하시는 분들은 쉘에서 파일의 내용을 보기 위해 cat 과 같은 명령어를 주로 사용 하실 겁니다.

 

MATLAB 에서 파일을 열대는 open() 이라는 명령을 사용하거나 파일을 더블 클릭해서 파일을 여는데~

 

그냥 간단하게 command window 에서 파일의 내용을 확인 하고 싶을 때는 type 이라는 명령어를 사용합니다.

 

아래는 type 의 사용 예입니다. type f_func.m 라는 명령어를 통해 f_func.m 파일의 내용을 명령 창에서 확인 하는 겁니다.


 

 

그런데 가끔은 파일의 내용과 라인 넘버를 같이 보고 싶은 경우가 있습니다. 이러한 경우 MATLAB 에서는 dbtype 이라는 명령어를 사용 합니다.

 

다음과 같이 dbtype f_func.m 이라고 명령 하면 f_func.m 파일의 내용과 라인 넘버를 같이 보여주는 것을 확인 할 수 있습니다.




MATLAB 을 사용하면서 이전에 Perl 을 실행 시킬 수 있다는 포스팅을 한 적이 있습니다.

 

http://iamaman.tistory.com/170

 

그런데 요즘은 Perl 보다도 많은 사람들이 Python 을 많이 사용하는 것 같은데 왜 MATLAB 에서 파이썬이 실행이 안될까 궁금하더군요.

   

MATLAB 최신 버전을 찾아보니 역시나 MATLAB 에서 Python 역시도 실행이 되더군요.

 

저는 현재 Anaconda를 설치해서 사용 중이며 python 3.4 버전을 설치해서 사용 중입니다.

 

Default setting 으로 Anaconda 를 설치하면 C:\Anaconda3\python.exe 에 설치가 됩니다.

 

MATLAB command window 에서 pyversion 이라는 명령을 사용하면 현재 MATLAB 에서 인식 되는 파이썬 버전과 실행 및 라이브러리 파일, 로드 여부가 표시 됩니다.



 

일단 자신의 윈도우 버전에 맞게 파이썬을 설치 해야 합니다. 즉 32비트 OS 면 32비트 파이썬을 설치해야 하고 64비트 OS 인 경우에는 64비트 파이썬을 설치해서 사용해야 정상적으로 인식 됩니다.

 

저처럼 Anaconda 와 같은 툴을 설치해서 사용하거나 아님 아래 주소에서 파이썬을 다운로드 받아서 설치하면 됩니다.

https://www.python.org/downloads/

 

요즘은 default 로 파이썬을 설치하면 path 환경 변수에 파이썬 폴더가 추가가 되는데~ path 에 추가가 되지 않아서 MATLAB 에서 인식이 안 되는 경우에는 다음과 같은 방법을 사용 할 수 있습니다.

 

pyversion < Python.exe Path >

ex) pyversion C:\Anaconda3\python.exe

 

다양한 파이썬 버전을 설치해서 사용하시는 경우 위 방법으로 사용하고자 하는 파이썬을 잡아 주면 됩니다.

 

다음으로 MATLAB 에서는 다음과 같이 python 명령을 사용해 보죠~

 

F = py.os.listdir('C:\Windows')

 


파이썬을 아시는 분은 아시겠지만 위 명령은 C:\Windows의 파일 리스트를 출력하는 명령 입니다.

 

위 예를 보면 아시겠지만 MATLAB 에서 파이썬 명령을 사용하기 위해서는 py 라는 키워드를 사용합니다.

 

저는 위 명령어가 다음과 같이 실행이 되네요.



MATLAB 의 Stateflow 는 Stateflow API 를 활용하여 m 파일 명령어로 구성 및 조정이 가능 합니다. 

 

때에 따라서는 일일이 사람이 Stateflow 를 그리는것 보다는 Stateflow API 를 활용하는것이 효율 적인 경우가 많이 있습니다.

 

Stateflow API 를 활용하면 Python 과 같은 스크립트 언어등을 활용하여 Stateflow 를 그리는 Code generation 등도 가능 합니다.

 

오늘은 Stateflow 에서 사용중인 Data 를 다 찾는 방법에 대해 알아보려 합니다. 

 

Stateflow 에서 Data 를 다루기 위해서는 Stateflow.Data Object 를 다 찾으면 됩니다. 

 

Stateflow 에서 data 를 다 찾는 스크립트는 다음과 같습니다.

 

 

위 코드에서 sfroot 는 stateflow 의 root 즉, 최상위 stateflow 를 의미 합니다.

 

다음으로 아래 코드 부분이 Stateflow.Data 를 다 찾는 코드 입니다.

 

datav = m.find('-isa','Stateflow.Data');

 

그 이하 부분은 찾아진 데이터의 Name 필드를 vall 이라는 Cell 객체에 넣고~ vall(:) 명령을 통해 Command 창에 data 들을 나열 합니다.

 


오늘은 MATLAB 을 사용하여 계이름을 재생하는 방법에 대해 알아보려 합니다.

 

일단 음계에 대한 특징을 알아야 하는데요. 음성은 주파수에 따라 음계가 달라지고~ 음성의 크기는 신호의 크기에 영향을 받습니다.

 

즉 위상에 따른 음성의 차이가 없다는 거죠.

 

우리가 알고 있는 도레미파솔라시도~~ 는 다음과 같은 주파수를 갖습니다.

 

260 Hz

294 Hz

330 Hz

349 Hz

392 Hz

440 Hz

495 Hz

524 Hz

 

이제 간단하게 MATLAB 을 사용하여 위 사실이 맞는지 테스트 해보죠.

 

테스트를 위한 코드는 다음과 같습니다.

Sample rate 는 CD 음질인 44.1 k 로 했고 주파수, 위상, 크기 에 따른 시뮬레이션을 해 보시길 바랍니다.

 

위 코드에서 A 라는 변수가 Amplitude 이며 phaseV 값이 위상 for 문 안의 fc 가 주파수 입니다.

 

A 를 변화 시켜 보면 소기라 커지고 작아지고 한다는 것을 느끼실 테고~

 

phaseV =0 인 경우와 phaseV =20 인 경우를 비교해보면 아래 그림과 같이 위상은 달라졌지만 소리를 들어보면 차이가 없다는 것을 느낄 수 있을 겁니다.

 

 


  1. 학생1 2017.10.11 13:50

    글 잘 보았습니다. 혹시 궁금한게 있는데, Fs을 44.1k가 아니고, 음계-도 를 듣을때, sound(y,600~1000)의 값으로, 즉 Fs을 도의 주파수의 2배 이상으로만 해도 그 소리를 들을수 있는거 아닌가요? 소리를 들을려고 하는데, Fs=44.1k을때와 다르게 1000hz로 주면 소리가 안나오는데 이유가 무엇인가요?

    • 남성 2017.10.11 15:39 신고

      소리 신호는 44.1k 로 만들고 sound 함수에서만 1000 hz 로 했다는건가요?

아래 포스팅에서 간단하게 LMS 알고리즘에 대해 소개한 적이 있습니다.

 

http://iamaman.tistory.com/221


오늘은 하드를 뒤지다 보니 예전에 한 LMS 테스트 자료가 있어서 공개하려 합니다.

 

이번에는 Simulink 를 사용한 자료이며

 

보시면 아시겠지만 역시 LMS 는 참 간단하면서도 효율적인 알고리즘이라는 생각이 드네요.



 

FIR 필터 identification 을 수행했으며 필터 탭은 [0.5 2 1 0.3 0.1 0.05 0 0 0 ] 로 설정했습니다.

 

위 필터를 identification 하기 위해 LMS 필터 탭은 13 탭을 사용했고 Gain은 보시다시피 0.04 로 줬습니다.

 

잡음이 안 들어갔으니 뭐…. 잘 될 수 밖에 없죠~

 

수식이나 코드로 보는 것 보다는 훨씬 쉽게 이해 하실 수 있을 거라는 생각이 드네요.

 

Vector Scope 를 통해 그래프를 확인 할 수 있고 값은 display 블록을 통해 확인 할 수 있습니다.

 

파일 올리니 궁금하신 분들은 돌려 보시죠. 2010 년 정도에 만든 자료이니 2010 버전 이상에서는 정상적으로 동작 할 겁니다.

LMS_model.mdl

 


요즘 MATLAB 많이들 사용하시나요?

 

산업계뿐만 아니라 학교에서도 이 비싼 MATLAB 을 가르치니 학생들도 MATLAB 을 많이들 사용하는 것 같네요.

 

아래 tiobe 사이트에서도 비싼 툴임에도 불구하고 MATLAB 이 14위에 랭크 되어 있는 걸 보면 MATLAB 이 요즘 잘 나가고 있다는 건 확실 한 듯 하네요.

 

 

그래서 일까~ 아래 포스팅에도 소개 했지만 MATLAB 과 유사한 오픈 소스 프로그램들도 굉장히 많이 있습니다. 사실 스크립트만 활용한다면 MATLAB 을 굳이 살 필요는 없다는 생각이 드네요.

 

http://iamaman.tistory.com/639

http://iamaman.tistory.com/1427

 

그런데 요즘은 MBD(Model Based Design) 과 같은 이슈들로 Simulink 를 많이 활용하면서 다시 인기가 높아지는 게 아닐까요?

 

MATLAB 을 대체 할만한 툴은 많은 것 같은데 Simulink 를 대체할 만한 좋은 툴은 아직 보이지 않는 것 같네요. Scilab 에 Scicos 가 있긴 한데 아직은 우리나라에서 그리 많이 활용되고 있진 않은 것 같습니다.

 

아무튼 오늘은 또 다른 MATLAB 프로그램을 소개하려 하는데요. 이건 설치 프로그램이 아니라 cloud 프로그램 입니다. Freematlab 이라 해야 할지 mathclouds 라고 해야 할지 잘 모르겠네요.

 

홈페이지는 아래와 같고 두 사이트가 동일한 사이트 입니다.

 

http://www.freematlab.com

http://www.mathclouds.org

 

홈페이지는 아래와 같이 생겼는데~

 

Getting Started 페이지에 들어가면 Example 들도 잘 되어 있고 기존 MATLAB 사용자들은 바로 사용 가능 할 것 같습니다.

Help 페이지를 확인하니 대부분의 함수들이 MATLAB 과 동일 하네요.

 

또 하나의 좋은 툴을 알게 돼서 기분이 좋네요.


  1. jaegimania 2018.01.17 17:19

    기계관련 엔지니어 업무를 하고 있는 1人입니다.
    우연찮게 홈페이지 글 잘 읽었습니다. 감사합니다.
    Test 수치를 도식화 할 필요가 있어 깔끔한 프로그램을 찾던중 여기까지 오게됬는데요
    위 본문에서 말씀하신 freematlab의 경우 회사에서 사용시 무료가 아니네요...

    그래도 다른 본문에서 언급하신 FreeMat을 알게되어 기쁩니다.
    주인장님 아니였음 이런 프로그램이 있는줄도 몰랐을겁니다ㅎㅎ

    • 남성 2018.01.17 17:25 신고

      포스팅 시점에는 위 캡쳐 화면과 같이 그냥 쓸수 있었는데 오늘 님 댓글 보고 사이트 방문해 보니 사용료가 생긴것 같군요. freemat 이나 octave 를 사용해 보시길 추천 합니다. 파이썬을 사용하면 더욱 더 좋구요.
      아님 요즘 개발되는 언어로 julia 라는 언어가 있습니다. MATLAB 처럼 공학용 언어인데 속도도 빠르다고 하네요.

      http://iamaman.tistory.com/1479

Simulink 사용시 보통 마우스를 사용하여 모델을 구성하곤 합니다.

 

하지만 이런 GUI 방식은 자동화를 위해서는 그리 좋은 방법은 아닙니다.

 

대량의 시스템 구성시 GUI 을 사용한 구성방식은 한없는 노가다일 수 있습니다.

 

단순 반복적인 작업들은 당연히 자동화를 해야 하고 이를 위해서는 Script 가 필수라고 할 수 있죠.

 

simulink 를 구성하기 위한 MATLAB 명령어들로는 add_block, add_line, new_system, open_system, delete_line, delete_block, replace_block, set_param 와 같은 명령어들이 있습니다.

 

new_system() 을 사용하여 Simulink 블록을 구성하고 open_system 명령어를 사용하여 해당 파일을 열 수 있습니다.

 

다음으로 add_block, add_line 함수를 활용하여 블록과 라인을 구성하고 delete_line, delete_block 함수를 활용하여 라인과 블록을 지울 수 있습니다.

 

다음으로 블록을 교체 하기 위해서는 replace_block 함수를 활용합니다.

 

위에 명령어들만 알면 기본적으로 Simulink 블록을 구성하는건 대부분 다 할 수 있을 것 같더군요.

 

마지막으로 set_param 함수를 사용하면 블록의 세세한 파라미터들을 설정 할 수 있습니다.

 

simulink 블록을 시뮬레이션 하는 명령어는 Sim() 이라는 명령어를 사용합니다.

 

아래 참고사이트에 나와 있는 예제를 실행해보면~ 아래 코드와 같습니다. Simulink 모델을 저장하기 위해 save_system 함수를 사용했습니다.



 

save_system 함수를 사용하여 모델을 저장하면 testModel.slx 라는 모델 파일이 만들어집니다.

 

위 코드를 실행해 보면 다음과 같은 Simulink 모델과 ~

 

다음과 같은 그래프를 MATLAB figure 그래프를 확인 할 수 있습니다.

 

참고 사이트

http://blogs.mathworks.com/seth/2010/01/21/building-models-with-matlab-code/

http://www.goddardconsulting.ca/simulink-creating-using-matlab-code.html


MATLAB Command Window 를 사용하다보면 이전 명령들을 다시 실행하고 싶은 경우가 많은데요.

 

이런 경우에는 Command Window 에서 위 아래 화살표를 눌러서 이전 또는 다음 명령어를 실행 시키곤 하는데~

 

Command Window 에서 실행했던 명령어들은 보통 Command History 에 저장이 되므로 command history 에서 해당 명령어를 더블 클릭해서 재실행 할 수 있습니다.

 

그런데 최근에 MATLAB 을 사용하다 보니 Default Layout 에서 Command History 가 안 나오더군요.

 

그래서 명령어를 찾아보니 아래 그림과 같이 Command Window 에서 commandhistory 라는 명령어를 타이핑 하면 Command History 가 나오게 됩니다.

 

처음에 Command History 가 나올 때는 위 그림과 같이 floating 된 형태로 나오게 되는데~ 아래 그림과 같이 도킹을 클릭하거나 Ctrl + Shift + D를 누르면 ~

 

아래 그림과 같이 MATLAB Desktop 에 도킹되는 것을 확인 할 수 있습니다.

신호처리 등을 배우다 보면 많이 접하는 함수가 바로 dirac delta 함수다

 

아래 주소에 dirac delta 함수에 대해 장황하게 소개 하고 있으니 dirac delta함수에 대해 모르시는 분들은 참조하시길~

 

http://ko.wikipedia.org/wiki/%EB%94%94%EB%9E%99_%EB%8D%B8%ED%83%80_%ED%95%A8%EC%88%98

 

dirac delta 함수는 그 값이 0 일때 무한대의 값을 갖고 그렇지 않은 경우에는 0 을 갖는 매우 단순한 함수이다.

 

MATLAB 에서는 Symbolic Math Toolbox 가 설치되어 있다면 direc()함수를 사용할 수 있다.

 

Symbolic Math Toolbox 가 설치되어 있지 않다면 매우 간단한 함수이므로 다음과 같이 만들어서 사용하면 될 것이다.

 

함수를 만들 줄 도 모르는 초보들을 위해 파일도 올린다.


deltafnc.m 

function y=deltafnc(x)

 

if x==0

    y=inf;

else

    y=0;

end

 

Command Window 에서 다음과 같이 사용하면 된다.

 

>> deltafnc(1)

 

ans =

 

0

 

>> deltafnc(0)

 

ans =

 

Inf

 

아래 글에도 답변을 달았지만 MATLAB 에서도 linked list 를 구성 할 수 있습니다.

 

http://kin.naver.com/qna/detail.nhn?d1id=1&dirId=104&docId=194575538&page=1#answer1

 

위 글에서 소개한 바와 같이 MATLAB 에서 linked list 를 구성하고자 하는 경우 classdef 을 사용했는데요~

 

오늘은 간단하게 Filter Class 를 하나 만들어보죠.

 

Filter 함수는 아래 주소에서 소개하듯이 1차원 디지털 필터입니다.

 

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

 

MATLAB filter() 함수에 대해서는 아래 포스팅에서도 소개한 바가 있습니다.

2013/09/21 - [programming language/MATLAB] - MATLAB filter() 함수의 고급 사용


2011/03/01 - [programming language/MATLAB] - conv(), filter(), 인수분해 전개

 

filter 함수를 루프 내에서 사용하고자 하는 경우 그 연속성을 위해 filter의 state 를 계속해서 출력했다 저장했다 해야 하는데~

 

이런 경우 Class 의 형태로 만들어서 사용하는 게 편리하다고 생각합니다.

 

제가 사용하고 있는 Filter Class 는 아래 코드의 filter_O.m 파일입니다. 


filter_O.m Class 는 굉장히 간단하게 구성되어 있는데요~

 

filter_O의 생성자에서 필터의 numerator b 값과 denominator a 값을 설정하고~

 

멤버 함수인 filtering() 함수를 사용해서 filtering 을 수행하면 됩니다.

 

Filter 의 state 인 zi 값은 멤버 변수로 만들었고, 멤버 변수 out 이 필터의 출력 값입니다.


아래 코드의 Filtertest.m 파일을 실행해 보시면~ 



아래 그림과 같이 기존 filter 함수와 동일한 결과를 나타내는것을 확인 할 수 있습니다. 



오늘 포스팅에서는 16QAM AWGN & Flat Fading Diversity Simulation 에 대해 소개 드리려 합니다.

 

아래 포스팅에서 16 QAM BER Simulation 에 대해 소개 드린적이 있는데요~

  

2011/04/09 - [통신] - [디지털 통신] QAM mapping & demapping


2014/04/04 - [programming language/MATLAB] - MATLAB 16 QAM BER Simulation


오늘 시뮬레이션에서는 Flat Fading 환경과 안테나 개수에 따른 다이버시티 효과에 대해 시뮬레이션을 해 봤습니다.

 

코드는 아래 주소의 제 Github repository 에 저장을 해 놨으니 궁금 하신 분들은 다운로드 받아서 시뮬레이션 해보시길~


https://github.com/ssgkd/MATLAB-QAM-Simulation/archive/master.zip

 

BER 시뮬레이션에서의 에러 개수는 300개로 제한 했습니다.

 

파일을 보시면 아시겠지만 QAM_AWGN_Rayleigh_BER.m 은 이론적 AWGN BER 과 실험에 의한 BER, Flat Fading channel 에서 채널 값을 알고 있어서 완벽히 등화가 된다는 가정하에서 시뮬레이션 한 것입니다.

 

다음과 같은 BER 결과를 얻을 수 있습니다.

 

QAM_Diversity_BER.m 은 Flat Fading Channel 에서의 안테나에 따른 다이버시티 효과에 대한 시뮬레이션 입니다. 예상되는 결과지만 안테나가 많을수록 BER 성능이 우수하다는 것을 확인 할 수 있습니다.

 

 

QAM_Diversity_Symbol.m 코드를 돌려보면 Diversity 에 따른 수신단 Constellation 을 확인 할 수 있습니다. BER 결과와 마찬가지로 성좌도 역시 훨씬 더 집약된 형태로 나오는 것을 확인 할 수 있죠.


아래 포스팅에서 국내 로또와 미국 로또의 경우의 수를 구한 파일을 올린 적이 있는데요~


2014/05/16 - [로또] - 미국 로또 메가 밀리언 모든 경우의 수


2011/03/02 - [로또] - 로또 복권의 모든 경우의 수

 

우리 나라 로또의 경우의 수는 45C6 (45 Combination 6)이죠~

 

Combination에 대한 정의는 아래 위키피디아에 설명이 자세히 나와 있습니다.

 

http://ko.wikipedia.org/wiki/%EC%A1%B0%ED%95%A9

 

MATLAB 에서는 이런 조합의 경우의 수를 매우 쉽게 구할 수 있습니다.

 

이런 조합의 경우의 수를 구하는 함수는 nchoosek() 라는 함수 입니다.

 

간단하게 로또로 예를 들어보면~ 45 개의 숫자중에 6개를 뽑는 경우의 수니까~

 

MATLAB command window 에서 아래와 같이 표현 할 수 있습니다. 로또 복권의 모든 경우의 수인 8145060 가 나오는 것을 확인 할 수 있죠~

 

>> nchoosek(45,6)

ans =

8145060

 

다음으로 조합을 다 구하고 싶다면 첫번재 인자에 벡터 값을 넣어 주면 됩니다.

 

1~5 중에서 2 개를 뽑는 경우의 수를 모두다 구해 볼까요~

 

>> nchoosek(1:5, 2) 

ans =

1 2

1 3

1 4

1 5

2 3

2 4

2 5

3 4

3 5

4 5

 

위 예와 같이 첫 번재 인자로 벡터를 넣어 주니까~ 조합의 경우의 수가 아니라 조합을 다 구해 주는 것을 확인 할 수 있습니다.

 

너무 간단하죠~ MATLAB 이 설치 안되신 분들은 OCTAVE 에서도 동일하게 nchoosek() 함수를 사용할 수 있습니다.

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



오늘은 MATLAB 에서 sample rate conversion 방법에 대해 설명하려 합니다.

 

저는 보통 음원 파일에 대해 sample rate conversion 을 수행할때는 아래 포스팅에서 소개한 ffmpeg 이나 sox 등을 주로 사용하지만 MATLAB에서도 sample rate conversion 을 수행해야 할 경우가 종종 있습니다.


2013/10/21 - [유틸] - Windows 에서 sox 로 음악 파일 변환하기


2014/03/07 - [유틸] - ffmpeg 을 사용하여 rmvb 파일을 avi 파일로 변환하기

 

MATLAB 에서 sample rate conversion 을 할 때는 보통 resample 함수를 사용합니다. Resample 함수는 MATLAB Signal Processing Toolbox 내에 포함되어 있으므로 resample 함수를 사용할 수 없다면 MATLAB command window 에 ver 명령어를 쳐서 Signal Processing Toolbox 가 설치되어 있는지 확인 해 보시기 바랍니다.

 

일반적으로 Resample 함수는 다음과 같이 사용합니다.

 

y = resample(x,p,q)

 

x 라는 입력 신호에 대해 p/q 배로 sample rate 를 변경 하는 겁니다. p, q 값은 당연히 양의 정수 이어야 합니다.

 

보통 sample rate conversion 을 수행할때는 anti-aliasing 필터링을 하게 되는데~ 이러한 과정도 내부에서 자동으로 수행되기 때문에 사용자가 굳이 신경 쓸 필요가 없습니다.

 

아래 주소에서 resample 함수의 help를 보면 기본적으로 firls을 사용하여 필터를 디자인 하고 Kaiser window 를 사용하고 윈도우의 beta 값은 5를 사용 한다고 하는군요.

 

http://www.mathworks.co.kr/kr/help/signal/ref/resample.html

 

anti-aliasing 필터의 계수를 변경하고 싶다면 아래 원형의 b 값에 원하는 필터의 coefficients 값을 넣어주면 됩니다.

 

y = resample(x,p,q,b)

 

resample 함수를 사용하여 8192 Hz 의 음원을 CD 음질인 44100 Hz 로 변경해 보죠~

 

다음과 같이 MATLAB command window 에 명령어를 칩니다. chirp 이라는 음원은 MATLAB 에서 제공하는 음원으로soundsc 함수를 통해 재생해보면 새 소리가 납니다.

 

 

>> load chirp % chirp 신호 load

>> Fs % sample rate 확인

 

Fs =

 

8192

 

>> y2=resample(y,44100,Fs); % 8192 에서 44100 Hz 로 sample rate conversion

>> soundsc(y,Fs) % 8192 Hz 음원 소리 확인

>> soundsc(y2,44100) % 44100 Hz 음원 소리 확인

 

위 예제를 실행해보면 8192 Hz 음원과 44100 Hz 음원의 소리가 같은 것을 확인 할 수 있습니다.

 

하지만 각 데어터의 길이를 확인해 보면 8192 Hz 음원인 y 는 13129 인데 비해 44100 Hz 인 y2 음원의 길이는 70678 라는 것을 확인 할 수 있습니다.

 

>> length(y)

ans =

 

13129

 

>> length(y2)

ans =

 

70678

 

이는 8192/44100 = 13129 /70678 = 0.1858 이기 때문입니다.


중학교 정도의 수학 교육을 받으신 분들이라면 atan 함수는 다들 아실거라 생각합니다.

 

atan() 함수는 inverse tangent radian 값을 구해 줍니다. 만약 degree 값으로 구하고 싶다면 atand() 함수를 사용하시면 됩니다.

 

atan() 함수는 –π/2 ~ π/2 사이의 값을 구하기 때문에 보통 복소 평면상의 값에 대한 각도를 구하고 싶을 때는 atan2() 함수를 사용합니다.

 

atan2() 함수를 사용하면 –π ~ π 사이의 radian 값을 구할 수 있습니다. atan2() 함수의 원형은 아래와 같은데~ 아래 수식에서 Y 값은 imaginary 값을 X 는 real 값을 의미합니다.


P = atan2(Y,X)

 

atan() 함수와 마찬가지로 degree 값을 구하고 싶을 때는 atan2d() 함수를 사용하면 됩니다.

 

참고로 atans2() 함수의 사용 결과는 angle() 함수의 결과와 같습니다. 즉 아래와 같은 수식이 성립 한다는 것입니다.

Z=X+Yi

angle(Z) = atan2(Y, X)

 

간단하게 실험을 해 보죠~

 

z = 3 + 4i;

atan2V = atan2(imag(z),real(z))

angleV = angle(z)

thetaD = atan2d(imag(z),real(z))

[Th,R]=cart2pol(real(z), imag(z))

 

아래 결과를 보시면 atan2() 와 angle() 함수의 결과가 같은 것을 확인 할 수 있습니다.


아래 포스팅 들에서도 소개했지만, MATLAB 을 사용하면 다양한 random 변수들을 생성할 수 있습니다.  

2011/03/23 - [programming language/MATLAB] - MATLAB random number 생성


2011/03/23 - [programming language/MATLAB] - MATLAB Rayleigh random variable 생성


2011/03/26 - [programming language/MATLAB] - MATLAB Exponential random variable generation


2011/04/06 - [programming language/MATLAB] - MATLAB Bernoulli random variable generation


2011/04/17 - [programming language/MATLAB] - MATLAB binomial r.v. generation


기복적으로 rand, randn, randi, randperm 과 같은 함수들을 제공해 줘서 Uniformly distributed(균일 분포)뿐만 아니라 Normally distributed(정규 분포) 등도 기본적으로 생성 할 수 있습니다.

 

요즘은 C++ 에서도 기본적으로 정규 분포 생성 함수 등을 제공해 주지만 예전에는 정규분포 random variable을 생성하려면 균일 분포를 사용해서 함수로 만들어 사용하곤 했습니다.

  

2012/08/26 - [컴퓨터일반] - C++11 많이 좋아졌네요.


그러다 보니 MATLAB 에서 정규분포를 기본적으로 제공해 주는 건 큰 메리트로 느껴지던 시절이 있었습니다.

 

MATLAB 에서는 Statistics Toolbox 를 사용하면 좀더 다양한 분포들을 아주 쉽게 생성 할 수도 있습니다.

 

그런데 이런 random variable 들도 사실은 그리 random 한 것만은 아닙니다.

 

일단 이해를 위해 MATLAB 을 실행하고 다음과 같이 command window에 작성해 보죠~

 

아래 코드는 간단하게 현재의 시간과 3 × 3균일 분포를 만드는 코드 입니다.

 

>> datestr(now), a=rand(3)

 

결과는 이렇습니다.

 

이제 MATLAB 을 껐다가 다시 실행 시키고 위와 똑 같은 코드를 다시 실행해 보죠~ 아래에 그 결과를 보면 시간은 분명히 달라졌는데 rand() 함수의 결과가 동일하죠?

 

다른 프로그래밍 언어들을 접해 보신 분들은 대부분 아시겠지만, 프로그래밍 언어에서의 random variable 값들은 seed 에 따라 생성 되게 됩니다.

 

MATLAB 에서 random number generation 을 Control 하는 함수로 rng 라는 함수가 있습니다.

 

Command Window 에 rng 라고 타이핑 하면 현재의 seed 상태를 알 수 있습니다. default 세팅은 아래와 같습니다.

 

>> rng

ans =

 

Type: 'twister'

Seed: 0

State: [625x1 uint32]

 

seed 값을 설정할 때 보통 시간에 따라 변화하도록 설정하곤 하는데~ MATLAB 에서는 다음과 같이 설정하면 시간에 따라 seed 값이 변화하도록 할 수 있습니다.

 

rng('shuffle')

 

seed 를 처음 상태로 되 돌리기 위해서는 rng('default') 라고 해 주면 됩니다.

 

그럼 이제 MATLAB 을 껐다가 다시 켜고~ rng('shuffle') 을 한 후에 위에서 사용했던 명령어들을 다시 실행해볼까요?

 

확인을 위해 MATLAB 을 재 시작 시키고 똑같이 발생 시켜 보죠~

 

이젠 rand() 함수의 결과가 바뀌는 것을 확인 할 수 있죠~

 

만약 rng('shuffle') 이라는 코드를 MATLAB 실행 할 때마다 넣어주는 게 불편하다 하시는 분들은 아래 글 참조하셔서 startup 파일에 rng('shuffle') 을 넣어준다면 좀더 편하게 사용할 수 있을 겁니다.


2013/09/30 - [programming language/MATLAB] - MATLAB 시작 폴더 변경 및 startup.m 파일 설정



이전 포스팅에서도 소개한 바와 같이 tiobe 에서는 각 프로그래밍 언어들의 인기도를 알 수 있습니다.

 

MATLAB 의 인기도는 꾸준히 상승해서 아래 그림과 같이 2014년 4월 기준으로 18 위에 있더군요. 2013년에 24위 였는데 꾸준히 순위가 올라가는 것 같습니다. 이런 인기도 상승의 이유로는 중국의 대학에서 MATLAB 을 교육하기 때문이 아닐까 생각됩니다.

 

http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html

 

 

아래 포스팅에서도 소개드렸지만 MATLAB 은 매우 고가의 프로그램입니다. 그런데 이런 가격에도 불구하고 이렇게 사용자가 늘어난다는 게 참 신기하더군요. 좋은 프로그램임에는 확실 합니다만….


2013/11/07 - [programming language/MATLAB] - MATLAB 구매 가격에 대해 질문하는 분들을 위해…

  

결국에는 크랙 사용자가 늘어나는 게 아닐까 하는 생각이 들더군요.

 

그래서 구글 트랜드에서 MATLAB 을 검색 해 봤습니다.

 

우리나라 뿐만 아니라 중국, 이란 쿠바 등과 같은 비 선진국에서 주로 관심도가 높더군요. Mathworks 의 본사가 있는 미국에서의 관심도는 중국을 100 이라고 봤을 때 47 정도의 관심도만 있더군요. 주로 소프트웨어 라이선스에 대한 개념이 없는 나라들에서 주로 사용하고 있다는거죠.

 

그런데 시간 흐름에 따른 관심도 그래프를 보면 약간 특이한 점이 있습니다.

 

주기성을 띈다는 건데요~ 여름 방학인 7~8월과 겨울 방학인 1~2월에 그 관심도가 확연히 줄어든다는 것을 알 수 있습니다.

 

다른 나라들의 학기제가 어떻게 되는지 정확히는 모르겠지만, MATLAB 에 대해 검색을 하는 사람들은 주로 학생일 걸로 판단되네요. 학생이면 대부분 크랙을 사용할 거구요.

 

현재 우리나라의 대학에서는 MATLAB 을 가르치는 학교가 많습니다. 학교에서 MATLAB 과목이 편성 된다는 것은 Mathworks 의 마케팅 전략에 따른 것으로 생각됩니다.

 

저도 대학 다닐 때 수업을 들었었구요. MATLAB 수업에서 과제를 내주면 당연히 MATLAB 이 있어야 과제를 할 테니 대 부분의 경우 크랙을 구해서 사용하게 되겠죠~ 학교 전산실에는 대부분 MATLAB이 다 설치가 되어 있는데, 그 비싼 매트랩을 학교에서 제값주고 다 사진 않았을 테고 결국에는 mathworks 에서 학교 전산실에 싼값으로 설치할 수 있게 해 주거나 또는 기부를 해 주지 않았을까 생각되네요.

 

돈 없는 학생들 상대로는 불법 소프트웨어 단속 잘 안 하지만~ 대학원 연구실이나 회사 등에서는 불법 소프트웨어 단속을 하고~ 대부분의 MATLAB 크랙에는 풀 패키지가 깔려 있을 테니 풀 패키지의 가격으로 소송이 걸리게 되는거죠. 불법 소프트웨어 사용하다가 걸렸으니 울며 겨자먹기로 라도 사게 되는거구요.


2013/12/25 - [programming language/MATLAB] - MATLAB 소프트웨어 단속 하나 보네요~

 

성숙한 나라 성숙한 학교가 되기 위해서는 학생들에게 소프트웨어에 대한 사용 방법뿐만 아니라 소프트웨어 라이선스에 대해서도 교육을 해야 되는 게 아닐까 하는 생각이 드네요.


+ Recent posts