MATLAB 에서는 다양한 파일형태에 대해 읽고 쓸 수 있는 함수들을 기본적으로 제공하고 있습니다.

 

그런데 요즘 사람들이 가장 많이 사용하는 음악 파일 형태인 mp3 파일은 읽어 올 수 있는 함수가 없더군요.

 

그래서 검색을 해보니 역시… 내가 필요한 것은 어딘가에는 다 있더군요.

 

아래 주소에서 Alfredo Fernandez 라는 분이 만든 MP3WRITE(), MP3READ() 함수가 들어 있는 library 를 다운로드 받을 수 있었습니다.

 

http://www.mathworks.com/matlabcentral/fileexchange/6152-MP3WRITE%20and%20MP3READ

 

아래 그림 같은 화면에서 다운로드를 눌러서 mp3_toolbox_v2.0.zip파일을 다운로드 받습니다.

 

 

그럼 이제 MATLAB 에서 인식 할 수 있도록 path 만 설정해 주면 됩니다.

 

일단 위에서 다운로드 한 파일을 MATLAB 설치폴더 하위의 toolbox 폴더에 압축을 풉니다. 저는 C:\MATLAB\R2011a\toolbox\mp3_toolbox_v2.0 에 압축을 풀었습니다.

 

MATLAB toolbox 폴더는 윈도우의 경우 보통 C:\ Program Files\MATLAB\R2011a\toolbox 에 위치 합니다.

 

이제 MATLAB 을 켜고 맨위의 메뉴 중에 File à Set Path 메뉴를 선택 합니다.

 

그리고 아래 그림과 같이 Add with Subfolders 를 클릭하여 path 설정을 해 줍니다.

 

 

그럼 이제 간단하게 사용해 보죠~ Temp_mp3_file.MP3 라는 파일을 불러오는 예제 입니다.

 

[Y,FS,NBITS,encoding_info,ID3v1_tag_info] =mp3read('Temp_mp3_file.MP3');

 

위 값에서 Y 값이 바로 음악 데이터 파일 입니다. Stereo 와 mono 를 읽어 들일 수 있습니다.

 

Fs 는 sampling rate , NBITS 는 샘플당 비트 수 , encoding_info 는 말 그대로 encoding 정보 , ID3v1_tag_info 는 음악 파일의 태그 정보라고 하는군요.

 

저는 위 예제의 mp3 파일에 대해 실행 시켜 보니깐~ 요렇게~ 되는군요.

 

 

Y 값은 너무 길어서 나타내지 않았습니다.

 

mp3 파일을 만들 때는 mp3write() 함수를 사용하구요~

 

mp3write(Y,FS,NBITS,MP3FILE,ENCODING)

 

의 형태로 사용합니다.

 

Y,FS,NBITS 은 필수 입력 요소이구요. 위에서 설명한 인자들 입니다.

 

MP3FILE 은 만들고자 하는 mp3 파일명, ENCODING 은 저자가 정한 encoding 옵션 입니다.

인코딩 옵션에 대해 알고 싶은 분은 MATLAB command 창에 doc mp3write 라고 타이핑 하면 될 것 같습니다. Default 는 2번이네요.

 

그냥 간단하게 mp3 파일을 만들 때는 mp3write(Y,FS,NBITS) 하면 알아서~~ 추천하는 encoding 옵션으로 만들어 집니다.

 

요즘 나오는 음악 파일들 중에 간혹 mp3read() 함수로 읽어지지 안는 경우가 있는데 이는 대부분이 decoding 문제 같더군요.

 

이럴 때는 Goldwave 와 같은 프로그램을 이용하여 wave 파일로 변환해서 wavread() 함수를 사용하시거나 encoding 을 변경한 후에 읽어 들이면 정상적으로 읽어 집니다.

 

Goldwave 를 사용한 Wave 파일 변환 방법은 아래 포스팅을 참조하시길~

  

2012/04/23 - [유틸] - Goldwave 로 mp3 를 wav 파일로 만들기


지금까지의 설명은 윈도우를 기준으로 한 설명이었고~ 위 mp3read, mp3write 라이브러리는 윈도우에서만 돌아간다고 하더군요.

 

다른 운영체제를 사용하시는 분들은 아래 주소를 참조하시는 게 좋을 것 같습니다.

 

Alfredo Fernandez 도 아래 주소의 내용들에 영감을 받아서 위 함수들을 윈도용으로 만든 거라고 써 져 있더군요.

 

Dan Ellis 라는 콜롬비아 대학 교수가 만든 라이브러리네요~

 

http://www.mathworks.com/matlabcentral/fileexchange/13852

 

http://www.ee.columbia.edu/~dpwe/resources/matlab/mp3read.html

 

그럼 오늘의 포스팅은 여기서 마치겠습니다~~


  1. 질문자 2013.11.03 16:31

    >> [Y,FS,NBITS,encoding_info,tag_info] =mp3read('test_music.mp3');
    ??? Error using ==> mp3read at 46
    Error while decoding file. File may be corrupted


    안녕하세요. 포스팅 잘 보았습니다. 해당 라이브러리 다운 받고 mp3파일을 가져오려 하는데 이러한 에러메시지가 뜨는데 이건 어디서 잘못된건지 혹시 알 수 있나요?

    • 남성 2013.11.03 17:04 신고

      방문해 주셔서 감사합니다. ^^

      포스팅에서도 소개한 아래 주소에서

      http://www.ee.columbia.edu/~dpwe/resources/matlab/mp3read.html

      중간 정도에 보시면 Other file formats 라는 부분을 볼 수 가 있는데요.

      MPEG-1 Audio layers 1, 2, and 3 은 인식 할수 있지만, MPEG-4 audio 파일은 인식할수 없다고 합니다. 위 포스팅에서도 말씀드린데로 일부 읽어들이지 못하는 파일의 경우 Goldwave 와 같은 프로그램으로 wav 로 변환한 후에 읽어들이시면 됩니다.

      아래 포스팅 참조하시구요.

      http://iamaman.tistory.com/445

      또한 최신 MATLAB 프로그램을 사용하신다면, audioread() 라는 함수를 사용해서 mp3 파일을 읽어들일 수 있습니다. 2012b 버전에는 audioread() 함수가 있더군요. 이전버전에는 모르겟습니다.

      audioread() 함수는 wave, mp3 뿐만 아니라 FLAC, OGG 파일도 읽어 들일 수 있습니다.

      혹시 위 변환 프로그램들의 사용방법이 어렵다 하시면 namsung_32@naver.com 로 파일 보내 주시면 wav 파일로 변환해서 보내드리겠습니다.

  2. 2016.06.06 08:50

    비밀댓글입니다

    • 남성 2016.06.06 10:36 신고

      mp3read 를 할 때 Y 만 써 줘도 됩니다. 위에 답변에도 썼지만MPEG-1 Audio layers 1, 2, and 3 은 인식 할수 있지만, MPEG-4 audio 파일은 인식할수 없다고 합니다. 참조하시기 바랍니다.

C/C++ 과 같은 언어를 사용하다가 MATLAB 을 사용해보면 코딩이 굉장히 쉽다는 생각을 많이 하게 됩니다.

 

이는 여러 가지 이유가 있겠지만, 일단 변수의 타입을 지정해 줄 필요가 없다는 장점이 있습니다.

 

요즘 많은 사람들이 사용하는 스크립트 언어들은 변수 타입을 일일이 지정해 주지 않아도 되는 경우가 많은데, MATLAB 도 마찬가지 특징이 있는 거죠.

 

이러한 변수들이란 결국 memory 관리와 관계가 될 텐데, 코딩하는 사람이 일일이 memory 에 대해 생각 안하고 코딩 할 수 있다는 건, MATLAB 내부적으로 알아서 memory 관리를 한다는 뜻이겠죠.

 

하지만 MATLAB 코딩 시 잘 생각 안 해 봤던 memory 에 대한 부분도 조금만 생각을 하면서 코딩을 한다면 MATLAB 코드의 성능을 높일 수가 있습니다.

 

즉, Memory-bound code 가 되는 것을 피할 수 있다는 겁니다.

 

참조, Memory-bound code: CPU 속도가 아닌 메모리 속도에 따라 코드의 성능 한계가 결정되는 코드

 

아래 주소의 글에 이러한 내용이 잘 정리가 되어 있는데요.

 

http://www.mathworks.co.kr/company/newsletters/news_notes/june07/patterns.html

 

여기서는 위 주소의 글을 간단하게 정리만 해보겠습니다. 

1. 벡터 또는 매트릭스 사용시 그 크기에 대해 preallocation을 해서 사용해야 reallocation 을 막을 수 있고 이에 따라 속도가 향상된다. 위 주소에서의 실험 결과에 의하면, preallocation 을 하면 그렇지 않을때의 코드 속도에 비해 99.7% 정도 줄어든다 하는군요.


2. 벡터 또는 매트릭스의 column 방향으로 저장을 하거나 접근하는게 row 방향으로 접근하는 것보다 속도가 빠르다. MATLAB 은 데이터 저장시 column 방향의 데이터들을 cache 메모리에 단조증가 방향으로 저장하게 됩니다. 따라서 column 방향으로 메모리에 접근을 해야 cache 효율을 향상시킬 수 있다고 하는군요. 위 주소의 실험결과에서는 메모리에 대해 row 방향 접근을 했을 때에 비해 column 방향 접근을 할 때, 약 55% 의 속도 향상이 있었다고 하는군요.


3. 필요 없는 변수의 생성을 피하라. 이는 사람들이 흔히 하는 실수 들인데요. 쓸데없는 메모리의 사용은 해당 변수에 따른 메모리를 다시 잡아야 하고 이에 따라 코드의 속도를 더디게 만들죠. 위 주소의 예에서는 3000 X 3000 의 매트릭스에 대한 단순 곱셈의 예에서 y=1.2*x 라고 했을 때에 비해 x=1.2*x 라고 했을 때 40~59% 의 속도 향상이 있었다고 하는군요.

 


위에 정리한 부분들에 대해 조금만 신경써서 코딩 한다면 훨씬 더 효율적인 코드가 될 수 있을 것 같네요~


MATLAB 스크립트의 실행은 스크립트 에디터에서 F5 를 누르거나 command 창에서 해당 되는 스크립트 파일명을 치고 엔터를 쳐서 실행하곤 합니다.

 

함수 스크립트의 경우에도 마찬가지로 일반적인 실행 스크립트와 같이 실행 시킬 수 있지만~

 

입력 argument 가 있는 경우에는 그 상황이 좀 달라집니다.

 



예를 들어보죠.

 


function y=TempFunc()

 

x=1:10;

 

y=x.^2+2.*x+3;

 

figure,

plot(x,y), grid on

 

 

위와 같은 TempFunc () 함수는 에디터에서 바로 F5 를 누르거나 초록색 삼각형의 실행 버튼을 눌러도 실행이 됩니다.

 

하지만 다음과 같이 x 를 입력 argument 로 준 경우에는 에디터에서 F5 를 눌러서는 제대로 실행이 되지 않죠.

function y=TempFunc(x)

 

y=x.^2+2.*x+3;

 

figure,

plot(x,y), grid on

 

 

다음과 같이 에러가 납니다.

 

x 라는 값이 없으니 당연한 결과죠.

 

뭐 command 창에서 x 값을 정의해 준 후에 다음과 같이 하면 되겠지만~

 

버튼 한번에 실행되면 더욱 좋겠죠.

 

MATLAB Editor 의 Debug 메뉴à Run Configuration for 파일명 à Edit Configurations for 파일명 으로 들어가 줍니다.

 

이런 창이 나타나면~ 빨간색으로 표시한 부분의 버튼을 눌러서 Run Configuration 을 추가해 줍니다.

 

그리고 다음과 같이x 라는 argument 와 TempFunc(x) 함수를 작성해 줍니다. configuration name 이 TempFunc_2 이라는 것을 확인합니다.

 

이제 다시 MATLAB 에디터에서 다음같이 설정해 줍니다.

 

에디터의 실행 버튼 옆의 조그만 아래 삼각형 버튼을 눌러서 configuration을 선택 할 수도 있습니다.

 

이렇게 선택을 한 후에 에디터 창에서 F5 를 눌러 보시면 위에서 작성했던 TempFunc_2 configuration이 실행되기 때문에 함수를 실행 시킬 수 있습니다.


위 설명한 과정에 대한 animation입니다.  아래 그림을 클릭하시면 크게 보실수 있습니다. 






오늘은 MATLAB 의 디버그 기능 중 Conditional Breakpoints 에 대해 소개하려 합니다.

 

짧은 코드를 작성 할 때는 디버그 할 일이 거의 없지만 코드가 조금만 복잡해져도 디버그는 꼭 필요하더군요.

 

MATLAB 에서 디버그를 하기 위해서는 C/C++ 에서와 마찬가지로 알아보고자 하는 줄에 break point를 설정하고 실행 시키는데요.

 

다음 그림처럼 원하는 줄의 부분을 클릭하면 빨간색 동그라미가 생깁니다.



 

그리고 이 상태에서 F5 를 누르면 break point 를 설정한 줄에서 멈추고 command 창은 아래 그림처럼 k>> 으로 프롬프트가 바뀌게 되죠.

 

각 변수의 값들을 알고 싶을 때는 변수 명을 command 창에 쳐도 되고~

 

Editor 에서 알고자 하는 변수를 블록으로 설정하고 F9 를 눌러도 됩니다.

 

또는 그냥 Editor 에서 알고자 하는 변수 위에 커서를 올려놓으면 아래 그림처럼 툴 팁의 형태로 값이 보여 집니다.

 

한 줄 한 줄 디버그 진행을 위해서는 위 그림의 네모 칸 친 부분의 아이콘들을 적절히 눌러서 진행 할 수 있고~

 

디버그 모드를 끝내고 싶을 때는 shift + F5 를 누르면 됩니다.

 

디버그 모드에 대한 개략적은 설명은 여기까지만 하고 오늘 소개할 Conditional Breakpoints 에 대해 말씀 드리겠습니다.

 

Conditional Breakpoints 는 말 그대로 Breakpoints 를 설정하는데 조건을 주는 겁니다.

 

위 그림에서 예로 든 Tempfunction() 함수에서 for 루프의 n 인덱스가 500부터 값이 이상한 것 같아서 그 이후 부분에 대해서만 debug 를 하고 싶은 경우가 있다고 해 보겠습니다.

 

이런 경우에 위 예처럼 빨간색으로 break 포인트를 설정하고 디버그를 하려면 …. n 값이 하나씩 올라가서 500 이 될 때까지 F10 또는 F5 등을 다다다다다다~~ 눌러야겠죠.

 

이런 경우에 Conditional Breakpoints 를 사용해서 디버그 하면 굉장히 편리 합니다.

 

위 예에서 빨간색 동그라미로 되어 있는 Breakpoints 를 오른쪽 클릭해서 나오는 팝업메뉴 중에 Set/Modify Conditional Breakpoint 를 클릭합니다.

 

그럼 다음과 같은 조그만 창이 하나 뜨는데요~ 여기 빈칸에 조건을 적어 주면 됩니다.

 

n >= 500 라는 조건을 주고 OK를 누르면 ~ 다음 그림처럼 Breakpoints 가 노란색으로 바뀌게 되죠~

 

그럼 이제 F5를 눌러서 디버그를 실행해 보면 ~

 

다음과 같이 n=500 일 때부터 디버그를 수행 할 수 있습니다.

 


  1. 초급자 2013.07.20 00:53

    감사합니다!!

아래 포스팅에서 MATLAB 단축키 설정 방법에 대해 설명을 드렸었는데요.

  

2011/04/01 - [MATLAB] - MATLAB shortcut, 단축키 설정

 

이런 단축키 설정들을 MATLAB 을 깔 때마다 다시 설정해 줘야 한다면 굉장히 귀찮은 일일 것입니다.

 

따라서 이런 설정 파일들은 파일로 저장해서 백업을 해 두고 다시 깔 때마다 로드 해서 사용하는 것이 바람직하다고 생각합니다.

 

MATLAB 데스크톱의 File à Preferences 메뉴에 들어가거나 MATLAB command 창에서 preferences 를 입력한 후 엔터를 치면~ 다음과 같이 preference 창이 나타납니다.

 

아래 그림과 같이 설정에 들어가서 Save as를 클릭하고 자신이 원하는 위치에 파일을 저장하시면 됩니다.

 

보통 MATLAB 설정 파일들은 prefdir 에 XML 파일의 형태로 저장되곤 합니다.

 

MATLAB command 창에 prefdir 이라고 치면 디렉토리명이 나타납니다.

 

그런데 이 prefdir 폴더가 보통은 C:\ 드라이브에 설정되므로 깜빡하고 컴터를 그냥 밀면 설정 파일이 다 날라가서 좀 짜증나죠~

 

그래서 저는 위 그림에서 보시는 바와 같이 설정 파일들은 보통 D:\ 드라이브에 보관합니다.

 

다음에 다시 깔아도 설정 파일은 그대로 로드해서 사용하면 되기 때문에 편리하죠~


MATLAB 이 좋은 건 문법의 간편함이나 방대한 라이브러리뿐만이 아니라

 

굉장히 잘 정리되어 있는 매뉴얼에 있다고 생각합니다.

 

각종 example 뿐만 아니라 demo를 보면 각 함수의 사용법에 대해 쉽게 이해 할 수가 있습니다.

 

그런데 Fixed point toolbox 관련 데모를 보다가 약간 이해 안 되는 코드가 있더군요.

 

아래 주소에 Fixed-Point Data Type Override, Min/Max Logging, and Scaling 라는 제목의 데모가 소개 됩니다.

 

http://www.mathworks.co.kr/products/demos/fixedpt/datatype_override/fi_datatype_override_demo.html

 

위 데모에서는 다음과 같은 함수가 있는데요.

 

function T = fi_best_numeric_type_from_logs(x, is_signed, word_length)

%FI_BEST_NUMERIC_TYPE_FROM_LOGS  Best fixed-point numeric type from min/max logs.

%    T = FI_BEST_NUMERIC_TYPE_FROM_LOGS(X, IS_SIGNED, WORD_LENGTH)

%    returns the best-precision fixed-point NUMERICTYPE object T based

%    on the min/max logs of FI object X, and whether the target

%    fixed-point data type IS_SIGNED (true/false) and the target

%    fixed-point WORD_LENGTH.

%

%    See FI_DATATYPE_OVERRIDE_DEMO for an example of use.

 

%    Copyright 2005 The MathWorks, Inc.

%    $Revision: 1.1.8.1 $

 

% Compute the range of the min/max logs.

A = max(abs(double(minlog(x))),abs(double(maxlog(x))));

 

% Compute the integer part such that the range will not overflow.

integer_part = ceil(log2(A))  ;

 

% Compute the fraction length.

fraction_length = word_length - integer_part - double(logical(is_signed));

 

% Construct the fixed-point numeric type object.

T = numerictype(is_signed, word_length, fraction_length);

 

위 함수는 fixed point log report 의 최대 최소 값으로부터 fractional bits 를 계산해 주는 함수이고 빨간색 표시 부분은 정수 비트수를 계산하는 부분 입니다.

 

그런데 빨간색 표시된 코드는 잘못 된 것 같다는 생각이 들더군요.

 

double 값 -1 과 double 값 1 은 fi object 를 이용해서 최적의 fraction 값을 찾아보면 다음과 같습니다.

 

위 예에서 sfi() 함수는 입력 값에 대해 signed 16 비트에 대한 최적의 fractional 비트를 표시해 줍니다.

 

-1 일 때는 FractionLength : 15 이고, 1 일 때는 FractionLength : 14 인 것을 알 수 있죠.

 

Wordlength : 16, FractionLength : 15 이면 double 값 1 은 overflow 가 납니다.

 

A = max(abs(double(minlog(x))),abs(double(maxlog(x)))); 부분에서 minlog(x) = -1 이고 maxlog(x) = 1 이라면 …..… A = 1 이 될 테고~~

 

integer_part = ceil(log2(A)) = 0 이 되겠죠. 정수 비트가 0 개면 double 값 1 은 표현 할 수가 없는 거죠.

 

따라서 위 fi_best_numeric_type_from_logs() 함수는 그냥 안 쓰는 게 좋고 굳이 써야 한다면, 다음과 같이 고칠 수 있을 것 같습니다. 

 

function T = fi_best_numeric_type_from_logs(x, is_signed, word_length)

 

A = [double(minlog(x)) double(maxlog(x))];

TempFi=fi(A,double(logical(is_signed)),word_length);

T=TempFi.numerictype;



아래 포스팅에서 C/C++ 에서의 static 키워드와 유사한 기능을 하는 persistent 에 대해 설명 드렸었는데요.

 

2011/03/27 - [MATLAB] - MATLAB persistent


오늘은 persistent 사용시의 유의 사항에 대해 설명 드리려 합니다.

 

persistent 를 사용하는 반복적인 simulation 을 할 때 command 창에서 단순히 clear 를 하면 persistent 로 설정된 keyword 의 경우에는 clear 되지 않습니다.

clear 는 workspace 의 변수만 memory 상에서 해제를 하므로 function 안에서 persistent 로 설정된 변수의 경우에는 해제가 되지 않는 것 입니다.

 

위 링크의 이전 포스팅에서 사용한 함수 persistent_func() 를 이용하여 예를 들어 보죠.

  

위 예에서 clear 를 했음에도 c 값이 이전 값 12에서 연속적으로 증가하는 것을 보실 수 있습니다.

 

함수 내에서 persistent로 설정된 변수를 정상적으로 clear 하기 위해서는 함수를 메모리 내에서 해제 해 줘야 합니다.

  


다음과 같이 clear functions 를 사용하거나 clear all 을 사용하는 경우 함수 내에서 persistent 로 설정된 변수도 정상적으로 clear 되는 것을 확인 할 수 있습니다.

 

안정적인 코드 실행을 위해서는 MATLAB script 의 시작에 항상 clear all 을 해주는 게 좋은 습관 일 것 같습니다.


  1. kal 2016.12.06 00:49

    칼만필터에 persistant 선언이 있어 해제할때마다 컴퓨터 재시작을 했습니다.
    덕분에 메모리 해제하는 방법을 알게됬습니다.
    좋은정보 감사합니다.

    • 남성 2016.12.06 00:55 신고

      도움 되었다니 다행입니다. 방문 해 주셔서 감사합니다.

오늘은 MATLAB 을 이용하여 파일 또는 디렉토리 이름을 다룰 때 유용한 몇 가지 함수들에 대해 설명 드리겠습니다.

 

파일 이름을 다루다 보면 파일 이름부분과 확장자 부분으로 구분하고 싶을 때가 있습니다.

 

이런 경우에는 fileparts() 라는 함수를 사용 할 수 있습니다.

 


다음과 같은 형태로 구성되는데요~

 

 

 

[pathstr, name, ext] = fileparts(filename)

 

보시는 바와 같이 path, 파일 이름, 확장자로 구분해 줍니다.

 

사용 예는 다음과 같습니다.

 

위에서는 파일이름을 분리 했으니깐 파일이름을 합치는 방법에 대해 알아보죠.

 

이름을 합치는 경우에는 fullfile () 이라는 함수를 제공해 줘서 path, 파일 이름, 확장자를 편리하게 합칠 수 있습니다.

 

위에서 나누었던 파일 이름을 fullfile () 함수를 이용하여 합쳐 보죠~ 


 

다음으로 filesep 에 대해 설명 드리겠습니다.

 

Unix 나 맥 os 같은 경우에는 파일 구분자가 / 이지만 윈도우의 경우에는 \ 입니다.

 

그래서 같은 파일을 이종의 운영체제에서 이용하는 경우에는 에러가 발생할 여지가 있죠.

 

따라서 script 파일에서 파일 이름을 다룰 때는 filesep 를 이용해서 운영체제에 따라 자동으로 파일 구분자가 지정되도록 하는 것이 좋습니다.

 

위에서 fullfile() 함수를 이용해서 합쳤던 파일 이름을 다음과 같이 filesep 를 이용하여 합치는 예는 다음과 같습니다.

 

다음으로 string 으로 된 path 를 regular expression 을 이용하여 간단하게 각 디렉토리 별로 구분하는 방법에 대해 알아보겠습니다.

  

위 예에서 s 라는 변수에는 각 폴더와 파일 이름이 filesep 를 구분자로 해서 나누어지고 그 결과가 cell 타입으로 저장됩니다.

 

나누어진 디렉토리와 파일 이름을 다시 합치고 싶을 때는 위 예에서 처럼fullfile(s{:}) 하시면 되고요~

 

여기서 s 라는 변수가 cell 타입이기 때문에 각 값에 접근하기 위해서 중괄호를 이용한 것입니다.

 

마지막으로 소개해 드릴 함수는 현재 실행되는 파일의 이름을 나타내 주는 mfilename 함수입니다.

 

간단하게 예를 보시면 이해가 되실 듯 하네요.



 

위의 ABC.m 파일에서 mfilename 함수에 의해 command 창에 다음과 같이 현재 실행중인 파일의 이름이 나오고




fullpath 를 알 고 싶을 때는 위 예에서처럼 mfilename('fullpath') 라고 작성하면 됩니다.


MATLAB 을 이용하면 굉장히 다양한 수치적인 그래프를 그려 볼 수 있습니다.

 

여러 수치적인 실험을 하면서 그래프를 확인 할 때 데이터가 변화하면 그래프도 자동으로 바뀌었으면 하는 경우가 있는데요.

 

이런 경우에는 linkdata 를 이용하시면 됩니다.

 


간단한 예제로 설명 드리죠.

 

x=1:10;

y=x*2;

 

plot(x,y,'r:.')

grid on

 

위 코드는 단순히 y=2x 의 직선 그래프를 그리는 예제 인데요. 위 코드를 실행하시면 다음과 같은 그래프가 나옵니다.



 

위 그래프에서 빨간색 네모 칸 친 부분의 아이콘을 누르면 현재 그래프의 데이터 값이 변할 때마다 자동으로 그래프가 업데이트 됩니다.

 

그래프에서 아이콘을 클릭해서 설정하는 것이 아니라 코드를 통해 linkdata 기능을 실행 시키고 싶으면 다음과 같이 코드의 마지막 줄에 linkdata on 을 해 주면 됩니다.

 

linkdata 기능을 끌 때는 당연히 linkdata off 하면 되겠죠~

 

x=1:10;

y=x*2;

 

plot(x,y,'r:.')

grid on

 

linkdata on

 

 

위 코드를 실행하고 command window 에서 다음과 같이 y 값을 변경 해 보면 ~~

 

>> y=x*4;

 

다음과 같이 그래프가 휘리릭~~ 바뀌게 되죠~




MATLAB 을 이용하여 함수를 만들 때 argument 의 제약 조건 등을 주고 싶을 때는 assert() 함수를 사용 할 수 있습니다.

 

예를 들어 아래 함수처럼 간단하게 배열의 인자에 접근해서 값을 가져 오는 경우를 생각해 보죠.

 


MATLAB 의 배열 인덱스는 1 부터 시작을 하니깐 아래 함수의 args 값은 1 이상의 값이 들어와야 합니다.



또한 아래 함수의 x 라는 벡터가 10 초과의 인덱스는 없으니깐 10 이하의 args 값이 들어와야 하는거죠.


 

function output= fooTest(args)

 

x=1:10;

output=x(args);

 

end

 


 

이러한 경우 assert() 함수를 이용하여 다음과 같이 작성 합니다.

 

function output= fooTest(args)

 

assert((args>0) & (args <=10),'Index Error')

 

x=1:10;

output=x(args);

 

end

 

위 코드에서 assert() 함수의 (args>0) & (args <=10) 부분이 비교 조건이고 ~

 

두번째 인자인 'Index Error' 부분이 에러 메시지 입니다.

 

위와 같이 작성하고 command window 에 다음과 같이 실행해 보면 ~

 

11이라는 수는 10 보다 크니깐 에러가 나죠~

 

또한 다음과 같은 경우도 에러가 발생합니다.

 

위 경우는 1:10이라는 벡터 값을 주었을 경우인데요. 에러 메시지를 보시면 아시겠지만 assert() 함수의 비교 결과는 scalar 값이 되어야 합니다.

 

위 함수를 다음과 같이 수정하면 벡터의 입력에 대해서도 정상적으로 동작하게 만들 수 있습니다.

 

function output= fooTest(args)

 

assert(all((args>0) & (args <=10)),'Index Error')

 

x=1:10;

output=x(args);

 

end

 

위 함수는 all() 이라는 함수를 사용했는데요~

 

all(x) 함수는 x 가 모두 true 인 경우만 true 를 반환 합니다. 참고로 any() 함수는 하나라도 true 이면 true 를 반환 합니다.

 

어쨌든 위와 같이 함수를 만들고 다음과 같이 실행해 보면~

 

요렇게~ 정상적으로 실행이 되죠~


MATLAB 은 다양한 신호처리 분야에서 사용되는데~~ 이미지나 음성과 같은 분야에서도 굉장히 다양하게 쓰입니다.

 

그 쓰임 중에서 오늘은 이미지를 gray scale 로 변환하는 방법에 대해 알아보려고 합니다.

 

일단 gray 스케일로 만들기 위해서는 회색조 변환이 어떻게 구성되는지를 알아야 하는데요~

 

이를 위해서 이미지를 표현하는 방법 중 하나인 RGB 형식에 대해 먼저 설명 드리죠.

 

RGB 는 Red, Green, Blue 로 색을 표현하는 건데요.

 

각 색에 대해 unsigned int 형으로 표현합니다. 구성에 따라 다르겠지만 보통은 8 비트를 써서 28=256 개의 레벨로 표현을 하곤 합니다.

 

unsigned int 8 비트면 0~255 까지가 되겠네요.

 

RGB 값이 다 0 일때 즉, [0 0 0] 인 경우에는 검정색이 됩니다.

 

그리고 RGB 값이 모두 최대 일 때 즉, [255 255 255] 일때는 흰색이 되죠.

 

회색조로 나타낸다는 건 RGB 값을 [0 0 0] 과 [255 255 255] 를 이은 선상의 값으로 나타낸다는 겁니다.

 

위 말을 또 다르게 표현해 보면 회색조의 RGB 값은 R=G=B 인 경우라는 게 되는데요.

 

RGB 값을 이 선상의 값으로 나타내는 공식은 다음과 같습니다.

 

0.2989 * R + 0.5870 * G + 0.1140 * B

 

이렇게 하면 grayscale 값이 되는 거죠.

 

그럼 MATLAB으로 실험을 한번 해 볼까요?

 

실험을 위한 샘플로 다음 이미지를 이용하겠습니다.

 

OriginalImage = imread('pig.JPG');

GrayImage = rgb2gray(OriginalImage); % MATLAB 내장 함수

 

figure(1), imshow(OriginalImage) % 원본 이미지

figure(2), imshow(GrayImage); % gray 이미지

 

%% 공식 이용

R=OriginalImage(:,:,1);

G=OriginalImage(:,:,2);

B=OriginalImage(:,:,3);

 

C=0.2989 * R + 0.5870 * G + 0.1140 * B ; % 공식 이용

figure(3), imshow(C) % 공식 이용 gray image

 

위 코드를 실행해 보면 다음과 같이 예쁜 회색조 돼지의 모습을 보실 수 있습니다.


  1. 쥬르날 2012.06.28 07:19 신고

    관련 공부를 하는 분들에게는 많은 도움이 될 것 같네요 ^^

  2. 고나무 2013.05.28 15:28

    red scale로 변환은 어떻게 해야하나요?

    • 남성 2013.05.28 15:43 신고

      글쎄요. red scale 변환이라는게 뭔지 모르겠네요.

  3. 나무나무 2017.03.16 21:53

    관리자의 승인을 기다리고 있는 댓글입니다

MATLAB 에서 다양한 그래프를 이용해 왔지만 제가 하는 분양의 특성상 축을 날짜로 표시할 일은 없었습니다.

 

그런데 주식이나 재무와 같은 분야에서 MATLAB 을 어떻게 이용하나 봤더니 x 축을 날짜로 표시하는게 일반 적이더군요.

 

MATLAB 에서 특정 축을 date format 으로 나타내 주기 위해서는 datetick () 을 사용하면 됩니다.

 

아래 예제는 제가 사용하는 HTS 에서 특정 회사의 주가 차트를 로드해서 종가 차트를 그려 본 겁니다.

 

주가 파일은 다음과 같이 생겼습니다. 첫째 열이 날짜고 5번째 열이 종가 입니다.

 



TestStock.xlsx


 

%% 주가 차트 읽기

[num,txt,raw] = xlsread('TestStock.xlsx'); % 주가 파일 읽기

date_v=num(:,1); % date

date_nv=datenum(num2str(date_v),'yyyymmdd'); % 형식에 맞게 변환

price_v=num(:,5); % 종가

 

%% 차트 그리기

figure,plot(date_nv, price_v), grid on % 종가 차트 그리기

xlabel('Date [Year-Month-Day]'), ylabel('Price')

datetick('x','yy-mm-dd') % x 축을 날짜(년-월-일)로 표시

%%

 

위 코드에서 datetick('x','yy-mm-dd') 의 'x'는 x 축을 말하는 겁니다.

 

y 축을 날짜로 만들어 주고 싶다면 'y' 라고 설정하면 되겠죠.

 

그리고 'yy-mm-dd' 부분은 날짜를 나타내고 싶은 형식을 의미 합니다.

 

날짜의 형식에 대해서는 다음 주소의 MATLAB help 를 확인 해 보시기 바랍니다.

 

http://www.mathworks.co.kr/help/techdoc/ref/datetick.html

 

축의 tick 값을 날짜로 나타내기 위해서는 당연히 축의 값이 날짜 관련 값이어야겠죠.

 

따라서 datetick()을 이용하는 그래프의 축 데이터는 datenum() 함수를 이용해서 날짜를 표시해 주는 것이 좋습니다.

 

위 예제에 따른 결과는 다음과 같이 나옵니다.

 

종가만 이용해서 선 차트를 그렸더니 자주 보던 캔들 차트와 달라서 그런지 약간 어색하긴 하네요 ㅋㅋㅋ


MATLAB 을 이용하여 파일 쓰기를 할 때는 fprintf () 함수를 사용합니다.

 

그리고 파일 열기는 fopen(), 파일 닫기는 fclose()를 사용하죠.

 

줄 바꿈 문자는 아시다시피 '\n' 을 사용하고 command 창에서는 \n 을 이용했을 때 정상적으로 줄 바꿈이 되죠.

 

그런데 text 의 형태로 파일로 저장할 때, \n 을 사용하면 정상적으로 줄 바꿈이 안 되는 것처럼 보이는 경우가 있습니다.

 

이는 윈도우의 줄바꿈과 다른 운영체제의 줄 바꿈 문자가 다르기 때문인데요.

 

윈도우에서는 \r\n 을 사용해야 notepad 등과 같은 프로그램으로 텍스트 파일을 열었을 때 정상적으로 줄 바꿈 됩니다.

 

간단히 실험을 해 보죠.

 

다음은 \n 을 사용했을 경우의 예입니다.

 

fp=fopen('test_.txt','w');

x=1:5;

 

fprintf(fp,'%d\n',x); % 파일 쓰기

fclose(fp);

 

disp('command line \n')

fprintf('%d\n',x); % command window쓰기 


다음과 같이 command 창에서는 정상적으로 나오죠.

 

 

그런데 notepad 로 test.txt 파일을 열었을 때는 다음과 같이 이상한 문자가 써져 있는 것을 확인 할 수 있죠.

 

 

다음으로 \r\n 을 사용한 경우 입니다. 

fp=fopen('test_dos.txt','w');

x=1:5;

 

fprintf(fp,'%d\r\n',x); % 파일 쓰기

fclose(fp);

 

disp('command line \r\n')

fprintf('%d\r\n',x); % command window쓰기

 

command 창의 결과를 확인 해 보면~ 한 칸씩 빈 공간이 추가 된 것을 확인 할 수 있습니다.

 

 

반면에 notepad 로 test_dos.txt 파일을 열어보면 다음과 같이 정상적으로 저장된 것을 확인 할 수 있죠.

 


  1. 장성길 2014.04.29 13:34

    정말 정말 감사합니다 ㅠㅠ
    한참을 고생하다가 글 보고 해결했네요!!!!!
    좋은 하루 되세요!!!!!

    • 남성 2014.04.30 11:40 신고

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

  2. 공대생 2015.08.07 13:12

    좋은 팁 감사합니다!

  3. Ari 2018.12.06 15:28

    감사합니다.
    질문이 한가지 있는데 \r만으로 하면 안 되나요?
    \n\r로 할 경우 command 창에선 두 번 줄 바꿈이 되는데, 왜 \n을 굳이 함께 쓰는지 궁금합니다

    • 남성 2018.12.06 18:59 신고

      command 창에서는 그냥 \n 으로 쓰시면 되고 파일에 쓸때만 \r\n 으로 쓰면 됩니다.

      Windows 의 줄끝문자는 \r\n 이고 보통 우리나라의 대부분이 윈도우를 사용하기 때문에 파일에 쓸대는 \r\n 으로 줄바꿈하라는 것입니다.

      리눅스나 유닉스는 \n 맥은 \r 이 줄바꿈 문자입니다. 운영체제 마다 줄바꿈 문자가 다릅니다.

  4. 빈추 2019.04.02 12:52

    감사합니다~~

MATLAB 사용시 command 창에 입력하는 키 입력은 command history 에 저장 돼서 이후에 명령어 재 사용 시 편리하게 이용 할 수 있습니다.

 

그런데 이에 따른 결과는 command history 에 저장이 안 되는데요.

 

MATLAB 사용에 따른 기록을 저장하고 싶다면 diary 라는 명령을 이용하면 됩니다.

 

diary 명령은 MATLAB 사용에 따른 log 를 저장해 줍니다.

 

command 창에 입력하는 명령어와 그에 따른 결과 등을 아스키 파일로 저장해 줘서 그날 그날의 로그를 확인 할 수 있게 해 줍니다.

 

아스키 파일로 저장하는 만큼 그래프와 같은 결과는 저장하지 않습니다.

 

토글 형태의 명령어라서 처음에 diary 라고 명령어를 입력하는 순간부터 저장이 시작되고 두 번째 diary 명령을 입력하면 저장이 종료 됩니다.

 

 


저장이 종료되면 current folder 에 default 로 diary 라는 파일이 생성됩니다.

 

위 명령에 따라 저장된 diary 파일을 메모장으로 열면 다음과 같이 저장되어 있는 것을 확인 할 수 있습니다.

 

 

토글의 형태가 아니라 on, off 를 지정하거나 파일이름 등을 직접 지정해 줄 수도 있습니다.

 

 

위와 같이 명령하면 TestDiary.txt 라는 파일에 로그가 저장됩니다.

 

 

현재 로그가 저장되고 있는지 즉, diary on 인지 off 상태인지를 알고 싶으면 get(0,'Diary') 이라는 명령어를 사용하면 됩니다.

 

또한 현재의 diary file 의 이름을 알고 싶다면 get(0,'DiaryFile') 이라는 명령어를 사용하시면 됩니다.


구글링을 하다가 아래 포스팅을 발견 했습니다.

 

http://www.walkingrandomly.com/?p=151

 

위 블로그의 주인장은 영국의 맨체스터 대학에서 science and engineering applications support specialist 로 근무하고 있다고 하는데~

 

대충봐도 배울 것들이 참~ 많더군요.

 

위 주소는 Harmonographs 에 대한 내용을 담고 있는데~ Harmonographs 라는게 참 잼나는 내용이더군요.

 

추 두 개를 이용하여 한쪽 추에는 연필을 달고 한쪽 추에는 종이판을 연결합니다. 이때 연필과 종이판은 맞닿아 있죠 ~~

 

그 담에 추를 움직이게 하면 추의 움직임에 따라 그림이 그려 지겠죠~

 

이런걸 Harmonographs 라고 한다는 군요. 아닌가? ㅋㅋ

 

어쨌든 이렇게 해서 그려지는 그림을 보니… 참 예쁘더군요.

 

위 블로그에는 친절하게도 각 그림의 상수 값들이 자세히 설명되어 있어서 MATLAB 으로 따라서 그려 봤습니다.

 

f1=3.001;    f2=2;    f3=3;    f4=2; 

d1=0.004;    d2=0.0065;    d3=0.008;    d4=0.019; 

p1=0;    p2=0;    p3=pi/2;    p4=3*pi/2;

 

t=linspace(0,10000,200000);

 

xt=exp(-d1.*t).*sin(t.*f1+p1)+exp(-d2.*t).*sin(t.*f2+p2);

yt=exp(-d3.*t).*sin(t.*f3+p3)+exp(-d4.*t).*sin(t.*f4+p4);

    

figure1 = figure('Color',[1 1 1]);

plot(xt,yt), axis off 

   

위 코드를 돌려보면 아래와 같은 그림이 나옵니다. 예쁘죠?

 

두번째 그림 부터는 위 코드에서 변수들만 각각 바꾸면 됩니다. 

f1=10; f2=3; f3=1; f4=2; 

d1=0.039; d2=0.006; d3=0; d4=0.0045; 

p1=0; p2=0; p3=pi/2; p4=0;

세번째 

f1=2.01; f2=3; f3=3; f4=2; 

d1=0.0085; d2=0; d3=0.065; d4=0.0; 

p1=0; p2=7*pi/16; p3=0; p4=0;

네번째~ 전 이 그림이 특히 좋은데... 마치 나비가 날아가는 것 같습니다. ㅋㅋ

f1=2; f2=6; f3=1.002; f4=3; 

d1=0.02; d2=0.0315; d3=0.02; d4=0.02; 

p1=pi/16; p2=3*pi/2; p3=13*pi/16; p4=pi;


MATLAB 은 보통 수치 분석의 용도로 많이 사용 됩니다. 


비싼 툴이니 만큼 어려운 수학들을 굉장히 쉽게 처리 할 수 있어서 너무나 좋은 툴이라고 생각을 했죠~

 

반면에 MATLAB 을 사용하면서 아쉬웠던 부분도 있었는데~ 


hash 또는 dictionary 형태의 데이터 타입에 대한 지원이었습니다. 그런데.. 비싼놈은 뭔가 다르더군요.

 

있었는데 제가 몰랐던 것이었습니다. ㅡㅡ;

 

2008b 버전부터 Map Data Structure 를 제공해 주고 있더군요. 아~~ 왜 이걸 지금 알았지.. ㅡㅡ;

 

hash 나 dictionary 형태의 데이터 구조는 요즘과 같이 검색이 일반화된 시대에 더욱더 광범위하게 사용되는 데이터 타입이라고 생각이 되는데요~

 

바로 key 와 value 의 형태로 자료를 저장해서 key 만으로 자료를 찾을 수 있게 해주는 데이터 타입입니다.

 


 

각 나라들의 수도를 저장하는 데이터 타입을 예로 해서 설명해 보겠습니다.

 

아래는 예로 설명하기 위한 나라와 수도에 대한 표 입니다. 


 나라

수도 

Korea

Seoul 

USA

Washington  

Japan

Tokyo

China 

Beijing 










위 표에서 key 는 나라로 하겠습니다.

 

위 표에 대한 데이터의 정의는 아래와 같이 합니다.

 

Map_ContCapi= containers.Map({'Korea', 'USA', 'Japan', 'China'}, {'Seoul','Washington','Tokyo', 'Beijing'});

 

이후에 프랑스의 수도 파리를 추가 하고 싶다면 ~ 요렇게 합니다. 굉장히 직관 적이죠~

 

Map_ContCapi('France')='Paris';

 

Map_ContCapi 라는 map objecy 의 키를 알고 싶을 때는 멤버 함수인 keys 라는 함수를 이용합니다.

 

Map_ContCapi.keys 하면 결과는 요렇게 나옵니다.

   

ans =

 

'China' 'France' 'Japan' 'Korea' 'USA'

 

value 를 알고 싶을때는? Map_ContCapi.values 하면 되고요~ 아래와 같이 나오죠~

 

ans =

 

'Beijing' 'Paris' 'Tokyo' 'Seoul' 'Washington'

 

이제 가장 중요한 찾기 인데요~

 

찾기야 너무나 간단하죠~

 

S='USA' ;

if isKey(Map_ContCapi,S)     % Map_ContCapi 에 USA 라는 키가 정의되어 있다면~

    fprintf('%s 의 수도는 %s 입니다. \n',S, Map_ContCapi(S))

end

 

command 창에 결과는 요렇게~~ 나옵니다.

 

USA 의 수도는 Washington 입니다.

 

좀더 자세한 설명은 MATLAB help 문서를 참조 하시길~


요즘 영상이나 음성과 같음 미디어 컨텐츠들이 많이 사용되고 있습니다.

 

이런 미디어 파일들은 데이터 량이 굉장히 크기 때문에 손실 압축 방식으로 그 데이터를 줄이는 압축 기술들이 많이 사용되는데~

 

이런 기술에 많이 이용되는 것이 바로 DCT(Discrete cosine transform) 라고 합니다.

 

mp3, jpg 같은 파일 형식들이 다~~ DCT 를 사용한다고 하니깐 정말 우리 생활과 너무나 밀접한 기술이라 할 수 있을 것 같네요.

 

DCT 위키 피디아 : http://en.wikipedia.org/wiki/Discrete_cosine_transform

 

위 주소의 내용을 보면 DFT 는 periodic 신호의 비연속 특성 때문에 고주파가 많이 올라오는 반면에 DCT 는 연속적이어서 고주파 성분이 적고 ~ 그에 따라 저주수에 신호 파워가 몰리는 특징이 있더군요.

 

따라서 특정 Threshold 보다 작은 고주파 신호를 없앤다 해도 DFT 에 비해 신호의 왜곡이 덜 할 것이라는 것을 예상해 볼 수 있습니다.

 

DCT 도 DFT 와 유사하기 때문에 FAST DCT 알고리즘이 존재 합니다.

 

FAST DCT 에 대한 내용들이 정리되어 있는 페이지 : http://fourier.eng.hmc.edu/e161/lectures/dct/node2.html

 

오늘은 위 주소의 내용들을 참조하여 FAST DCT 에 대해 간단히 소개해 보려 합니다.

 

일반적으로 흔히 말하는 DCT 수식은 다음과 같고 DCT-II 라고 합니다.

 

 

Inverse DCT 는 DCT-III를 말하며 다음 수식과 같죠.

 

 

FAST DCT 의 과정은 다음과 같이 세 단계로 구성되더군요.

 

FAST DCT 과정

 

 

 

 

FAST IDCT 과정

 

 

 

 

이론을 알아 봤으니깐 간단하게 MATLAB으로 확인해 볼까요~

 

MATLAB Signal Processing Toolbox 가 있으신 분들은 dct(), idct() 라는 함수를 사용하실 수 있습니다. 두 함수들은 DCT,IDCT matrix 를 orthogonal 하게 만들어 주기 위해서 특정 scale factor 들을 곱해 줬는데요.

 

위에서 서명했던 DCT-II, DCT-III 수식을 MATLAB 의 orthogonal 한 DCT 수식들과 같게 만들기 위해서는 다음과 같이 scale factor 를 곱해 주어야 합니다.

 

DCT-II 의 경우는 X(0) 에 을 곱해 주고 X 전체에 를 곱해 주면 되고~

 

DCT-III 의 경우는 X(0) 에 을 곱해 주고 전체에 곱해 주면 MATLAB 내장 함수들과 동일한 결과를 얻을 수 있습니다.

 

코드는 다음과 같습니다.


 

 

실행 결과에 대해 command 창에서 확인해 보면 에러가 10-15 정도니까~~~ 0 이나 마찬가지라는 것을 확인 할 수 있죠~

 


Simulink 에서 소스데이터를 발생시키는 방법은 다양하게 있겠지만, 덤프 받은 데이터 등을 사용할 때 From/To workspace 블록을 주로 사용합니다.

 

From workspace 블록은 말 그대로 workspace 상의 변수를 simulink 상으로 불러 오는 것을 말하고 ~ To workspace블록은 반대로 Simulink 상에서 MATLAB workspace 로 값을 내보내는 것을 말하죠~

 

아래 예는 간단하게 Fixed step solver 에서 간단하게 Sin, cosine 값을 읽어 들여서 두 배 해서 a 라는 변수로 내보내는 예인데요.

 

 

From Workspace 창을 열어서 읽어보면 아시겠지만, 1차원 데이터에 대해서는 matrix 형태로 읽어 들여도 되지만, Multi-dimentsion 신호의 경우에는 구조체의 형태로 읽어 들여야 합니다.

 

다음과 같이 sin, cosine 값을 m 파일로 만들고 실행 시켜서 workspace 에 변수가 생성 되도록 합니다.

 

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

y=sin(t);

y2=cos(t);

 

time_v=0.1*[0:length(y)-1]; % 시간

 

% 구조체 부분

sin_v2.time= time_v; % time

sin_v2.signals.values=[y(:) y2(:)];        % sin,cosine 신호

sin_v2.signals.dimensions=2;               % 2 차원

 

그 담에 아래 그림처럼 From Workspace 블록을 설정해 줬습니다. Extrapolation 으로 설정 할 때는 intrerpolate data 부분에 꼭 체크를 해야 합니다. 그리고 위 코드에서 신호 구조체를 만들 때 신호의 시간을 설정 해줘야 에러가 안 납니다.

 

 

To workspace 블록은 간단하게 아래 그림처럼 설정했구요.

 

 

이제 결과로 나온 a 변수를 command 창에서 그려보면 아래 그림처럼 나옵니다. 신호의 맨 끝의 두 점을 이용하여 extrapolation 을 하기 때문에 발산하는 형태의 그림이 나오게 되죠~

 

 

그럼 이제 From workspace 블록을 Cyclic repetition 으로 설정해 볼까요? Cyclic repetition으로 설정 할 때는 일단 interpolate data 의 체크를 해제 해 줘야 합니다. 그런데 이 상태에서는 아래와 같은 에러 메시지를 받게 됩니다.

 

 

잘 읽어보면 아시겠지만, 구조체의 시간 field 를 empty time vector로 설정하라고 나옵니다.

 

즉 위 코드에서 time field 를 다음과 같이 고친 다음에 Cyclic repetition 옵션으로 실행 시켜야 에러가 나지 않습니다.

 

sin_v2.time= []; % time

 

요렇게 고치고~ 실행 시킨 후에 command 창에서 그려 보면 아래와 같은 그래프를 얻을 수가 있습니다.

 




지금은 고인이 되시 만델브로 할아버님의 집합 수식을 MATLAB 으로 돌려 보니~~~ 

아래 영상과 같은 아름다운 그림이 나오더군요.

아래 네이버 케스트를 읽어보시면 조금이나마 Mandelbrot 집합에 대해 이해 하실수 있을것 같습니다. 






수학이 주는 아름다움이 이런건가 하는 생각이 들기도 하고~~ 자연이 이런 모습일까 하는 생각도 들고 ~~ 암틈 살짝 ~ 도취되어 있습니다.

프랙탈이라는거 잘 모르지만... 이 그림을 통해 프랙탈이라는게 아름다움 일 수 있겠다는 생각이 들었습니다. 

MATLAB 으로 한번 돌려 보고 싶으신 분들을 위해 ~~ 코드는 다음과 같습니다. 

관심 있으신 분들은 한번 실행시켜 보시길...



col=20;
loop=500;
m=500;

colormap winter(256);

for cnt=1:loop;
        cx=-.5;
        cy=0;
        l=1.5;
        x=linspace(cx-l,cx+l,m);
        y=linspace(cy-l,cy+l,m);
        [X,Y]=meshgrid(x,y);
        Z=zeros(m);
        C=X+i*Y;
        for k=1:col;
            Z=Z.^(1+cnt/10)+C;
            W=exp(-abs(Z));
        end

        pcolor(W);        
        shading flat;
        axis('square','equal','off');
end




MATLAB 을 이용하면 다양한 형상 들에 대해 그래프로 쉽게 확인 해 볼 수가 있습니다.

 

그것도 몇 줄 안 되는 짧은 코드로~~ 아주 쉽게 말이죠.

 

눈으로 한번 보는 것이랑 상상만으로~ 개념적으로만 아는 것은 이해의 속도 및 깊이에 있어서 정말 천지 차이인지라~~ 저는 상상이 잘 안 될 때는 웬만하면 MATLAB 으로 간단하게 표현해 보곤 합니다.

 

오늘은 spring 이 움직이는 것 같은 그래프를 한번 그려 보려 합니다.

 

별거는 아니지만~ 움직이는 모양을 보면 나름 흥미롭답니다.

 

코드는 다음과 같습니다.

 

theta=linspace(0,10*pi,1000);

z=[10:50 49:-1:10];

 

for i=1:length(z)

v=linspace(0,z(i),1000);

figure(1), plot3(sin(theta),cos(theta),v), grid on

axis([-1 1 -1 1 0 50])

 

M(i)=getframe;

 

end

 

movie(M,3, 200) % 3 번 반복하게 하기

 

 

그럼 아래 동영상과 같은 그래프가 나오죠~




오늘은 Euler's formula 에 대해 MATLAB 으로 표현해 보고자 합니다.

 

흔히들 알다시피 Euler's formula 는 아래 식과 같습니다.

 

 

위 수식은 2차원 그림으로 표현하면 아래와 같죠~

 

 

그림 출처: http://en.wikipedia.org/wiki/Euler's_formula

 

이런 Euler's formula 에 대해 3차원 적으로 표현해 보면 참 재미있는 모양이 되더군요.

 

코드는 다음과 같습니다.

 

theta=linspace(0,3.5*pi,1000);

 

exp_value=exp(1i*theta);

 

cos_v=real(exp_value);

sin_v=imag(exp_value);

 

 

plot31=plot3(cos_v,theta, zeros(size(cos_v)),zeros(size(sin_v)),theta,sin_v,cos_v,theta,sin_v,'LineWidth',1.5);

grid on

set(plot31(1),'Color',[0.6 1 0]);

set(plot31(2),'Color',[0.4 0.2 1]);

set(plot31(3),'Color',[1 0 0]);

legend1=legend('cos(\theta)','sin(\theta)', 'exp(j\theta)');

set(legend1, 'Position',[0.802222222222222 0.66919435512683 0.055952380952381 0.068238656663094]);

 

xlabel('x'), ylabel('Phase'), zlabel('y');

view(-122,32)

 

hold on

plot3([min(cos_v) max(cos_v)],[0 0],[0 0],'k',[0 0],[min(theta) max(theta)],[0 0],'k',[0 0],[0 0],[min(sin_v) max(sin_v)],'k','LineWidth',2)

   

그럼 요런~~ 그림이 나오죠~ 다 알고 있다고 생각하던 Euler's formula 도 요렇게 3차원으로 그려 놓고 보니깐 색다르죠~



네이버의 메인 화면은 윗 부분에는 대부분 신문 또는 잡지사의 기사인 경우가 대 부분이라 메인 화면만 봐서는 지적 호기심을 일으킬 만한 것들이 별로 없다.

 

그런데 메인 창의 좀 아래를 내려 보니 네이버 캐스트라는게 있어서 보다 보니 다방면에 대한 지식을 정리해 놓은 것을 확인 할 수 있었다.

 

수학이나 과학과 관련한 카테고리의 글들을 주로 보는데 ~ 뫼비우스의 띠에 대한 설명이 있어서 찬찬히 읽어보니 예전에 대수롭지 않게 생각하고 넘어갔던 이 띠에 대해 훨씬 더 깊게 이해 할 수 있었고~ 재활용을 상징하는 마크가 뫼비우스 띠 모양인것도 새삼스럽게 알 수 있었다.


뫼비우스 띠에 대한 설명은 다음 주소를 참조하기 바란다.

 

http://navercast.naver.com/contents.nhn?contents_id=3630

 

http://navercast.naver.com/contents.nhn?contents_id=3695

 

뫼비우스 띠는 많은 사람들이 알다시피 두께가 있는 띠를 꼬아서 만든 것이다. 위 주소의 내용들을 읽으면서 뫼비우스 띠의 아이디어는 굉장히 단순하지만 그 쓰임은 굉장히 탁월하다는 생각이 들었다.

 

위 주소의 글에서 뫼비우스 띠의 식이 나와 있어서 MATLAB 으로 코딩해 보고 관점에 따라 돌려 가며 관찰을 해보니 더 이해가 잘 되는 듯 하다.

 

코드는 다음과 같다.

 

[u,v]=meshgrid(linspace(0,2*pi,100),linspace(-1,1,100));

  

x=(1+1./2.*v.*cos(1./2.*u)).*cos(u);

y=(1+1./2.*v.*cos(1./2.*u)).*sin(u);

z=1./2.*v.*sin(1./2.*u);

  

mesh(x,y,z), colormap hsv(256)

xlabel('x'),ylabel('y'),zlabel('z'), grid on

axis([-2 2 -2 2 -0.5 0.5])


  

 

결과적으로 이런 뫼비우스 띠 그래프가 나온다.

 

 

뫼비우스의 띠를 좀 더 다양한 각도에서 돌려 가면서 보면 이렇다.

 





'programming language > MATLAB' 카테고리의 다른 글

Simulink From/To workspace 블록 사용하기  (0) 2012.05.28
MATLAB Fractal, Mandelbrot (만델브로) 집합의 아름다움.....  (0) 2012.05.25
MATLAB Coil Spring  (0) 2012.05.11
MATLAB Euler's formula  (0) 2012.05.01
MATLAB 뫼비우스의 띠  (0) 2012.03.23
MATLAB FFT 처리 속도  (0) 2012.03.19
MATLAB varargin, varargout  (6) 2012.03.12
MATLAB GUI 창 크기 조절  (4) 2012.03.03
MATLAB GUI  (4) 2012.02.24

오늘은 MATLAB FFT () 함수의 처리 속도에 대해 알아보려 합니다.

오늘 포스팅은 아래 책을 참조 한 부분이 있음을 밝힙니다.

 

책 : MATLAB 을 이용한 디지털 신호처리

 

MATLAB 의 FFT() 는 아시는 바와 같이 Fast Fourier Transform 을 수행하는 함수입니다.

FFT 알고리즘은 그 크기가 2의 거듭제곱 일 때로 한정해서 이용하게 되는데

MATLAB 의 FFT ()함수를 사용해 보면 FFT size 에 관계없이 사용 할 수 있습니다.

이는 FFT() 함수 내부적으로 2의 거듭제곱인 경우에는 FFT 알고리즘을 이용하고, 그렇지 않을 때는 소인수들로 나누어져서 혼합 진수 FFT 알고리즘을 이용하게 된다고 합니다.

 

그리고 FFT size 가 소수라면 어쩔 수 없이 내부적으로 DFT 알고리즘을 이용하게 됩니다.

 

이에 대한 확인을 위해 FFT size에 따른 처리 속도를 측정하는 시뮬레이션을 해보려 합니다.

 

코드는 다음와 같습니다.

 

 

책에 있는 내용대로 하니 제 컴퓨터에서는 책과 동일한 결과가 나오지 않더군요.

그래서 각 FFT size 당 측정 횟수를 500회로 증가 시켰고, 이에 따른 평균을 구하는 부분 등을 추가 했습니다.

 

위 코드를 실행 시켜 보면 다음과 같은 그래프를 얻을 수 있습니다.

 

 

위 그래프를 보시면 2048 size 일 때는 2의 거듭제곱 크기이므로 FFT 알고리즘이 수행되서 3.6e-5 정도의 시간이 걸리는 것을 확인 할 수 있고, 1950 size 일때는 2의 거듭제곱 크기는 아니지만, 소인수 분해가 가능 하므로 혼합진수 FFT 가 수행됨을 확인 할 수 있습니다. 그리고 2011 size 일 때는 소수이므로 어쩔 수 없이 DFT 가 수행되서 그 크기가 2048 보다 작음에도 불구하고 속도는 약 8 배 정도 느린 것을 확인 할 수 있습니다.

 

위 실험을 해보면 FFT 가 정말 막강한 알고리즘 이라는 것을 확인 할 수 있으실 겁니다.


'programming language > MATLAB' 카테고리의 다른 글

MATLAB Fractal, Mandelbrot (만델브로) 집합의 아름다움.....  (0) 2012.05.25
MATLAB Coil Spring  (0) 2012.05.11
MATLAB Euler's formula  (0) 2012.05.01
MATLAB 뫼비우스의 띠  (0) 2012.03.23
MATLAB FFT 처리 속도  (0) 2012.03.19
MATLAB varargin, varargout  (6) 2012.03.12
MATLAB GUI 창 크기 조절  (4) 2012.03.03
MATLAB GUI  (4) 2012.02.24
MATLAB figure ButtonDownFcn  (0) 2012.02.22

다른 언어의 함수들과 마찬가지로 MATLAB 함수 역시도 가변 개수의 인자를 받고 가변 개수의 출력이 나오게 할 수 있습니다.

 

함수의 가변 개수 입력 변수varargin 이라는 키워드를 이용하며, 가변 개수의 출력 변수varargout 이라는 키워드를 이용합니다.

 

Varargin, varargout 은 cell 타입의 변수로서 cell 타입에 대해 궁금하신 분들은 아래 링크의 글을 참조 하시기 바랍니다.


 2011/04/11 - [MATLAB] - MATLAB cell class

 
코드를 통해 예를 들어 설명 드리겠습니다.

 

아래 코드는 정말 간단하게 가변 개수의 입력을 받아서 그 수에 100을 곱해서 출력으로 내보내는 함수 입니다.

 

입출력 인자로 함수 선언부분에 varargin, varargout 키워드를 이용한 것을 확인 하시기 바랍니다.

 

 

각 입출력 변수는 cell 타입이므로 중괄호를 이용하여 각 값에 접근해야 합니다.

 

Command 창에서 다음과 같이 실행해 보았습니다.

 

 

입력 벡터의 각 값에 대하여 100 배가 돼서 출력되는 것을 확인 할 수 있습니다.


'programming language > MATLAB' 카테고리의 다른 글

MATLAB Coil Spring  (0) 2012.05.11
MATLAB Euler's formula  (0) 2012.05.01
MATLAB 뫼비우스의 띠  (0) 2012.03.23
MATLAB FFT 처리 속도  (0) 2012.03.19
MATLAB varargin, varargout  (6) 2012.03.12
MATLAB GUI 창 크기 조절  (4) 2012.03.03
MATLAB GUI  (4) 2012.02.24
MATLAB figure ButtonDownFcn  (0) 2012.02.22
Simulink Algebraic Loop  (0) 2012.02.13
  1. p 2014.04.14 21:16

    잘 보고 갑니다!

  2. Kang 2014.06.25 11:13

    덕분에 알고 갑니다!

  3. 성열이 2015.09.02 14:50

    감사합니다ㅋㅋ 이해 짱짱짱 잘 되요

지난 포스팅에 MATLAB GUI에 대해 아주 간단하게 설명 드린 적이 있는데요.

 
2012/02/24 - [MATLAB] - MATLAB GUI


MATLAB GUI를 처음에 만들면 창 크기가 고정 되어 있습니다.

 

위에 링크한 지난 포스팅의 예를 이용하여 창 크기를 조절 하는 방법에 대해 설명 드리겠습니다.

 

GUIDE 창의 Tools à GUI Options 에 들어가셔서

 

 

아래 그림처럼 Resize behaviorProportional로 변경 후 OK 를 눌러 주시면 됩니다.

 

 

이렇게 설정 후 실행되는 창에서는 크기 조절을 마음대로 하실 수 있습니다.


'programming language > MATLAB' 카테고리의 다른 글

MATLAB Euler's formula  (0) 2012.05.01
MATLAB 뫼비우스의 띠  (0) 2012.03.23
MATLAB FFT 처리 속도  (0) 2012.03.19
MATLAB varargin, varargout  (6) 2012.03.12
MATLAB GUI 창 크기 조절  (4) 2012.03.03
MATLAB GUI  (4) 2012.02.24
MATLAB figure ButtonDownFcn  (0) 2012.02.22
Simulink Algebraic Loop  (0) 2012.02.13
MATLAB dos 명령 사용하기  (0) 2011.12.21
  1. 행인00 2013.02.18 02:40

    감사합니다!!!!

  2. 배움이 2018.06.08 19:14

    안녕하세요. MATLAB에서 gui만드는 법에 대해서 공부하려고 하는데요. 혹시 무슨 책을 봐야 될까요? 웬만한건 구글링으로 찾아서 공부하고 있는데 gui만드는 법은 구글링 해도 자세히 설명이 나와 있지 않아서요.

    • 남성 2018.06.09 00:01 신고

      저도 MATLAB GUIDE 관련 어떤 한글 책이 있는지는 잘 모르겠네요. 처음 시작할때는 구글링을 해서 유투브 동영상을 보시는것도 좋을것 같고, 그나마 한글 자료로는 아래 주소의 글 등을 보시면서 MATLAB 메뉴얼 보는 방법을 익히시는게 좋을것 같습니다.

      http://pinkwink.kr/293

      구글링을 하실때는 matlab guide tutorial 등으로 검색을 해보면 처음 시작을 도와주는 영문 자료는 많이 있습니다.

MATLAB GUIDE 에 대해 버튼을 클릭하면 그래프를 그리는 예제를 통해 설명하겠습니다.

 

GUIDE 의 이용하기 위해서는 MATLAB command 창에 guide 라는 명령을 치거나

 

MATLAB 에서 아이콘을 클릭하면 됩니다.

 

다음과 같은 화면에서 빈 GUI 창을 만들기 위해서 OK 를 클릭합니다.

 

 

GUIDE 의 기본 창은 아래그림과 같이 component palette 와 몇 가지 아이콘으로 구성됩니다.

 

 

component palette 에 있는 각 구성들을 가져다가 GUI 창에 끌어다 붙이는 형태로 GUI 를 구성할 수 있습니다.

 

component palette 를 가 아이콘 만으로 되어 있는데 FILE >> Preferences 에 들어가서 아래 그림처럼 설정 합니다.

 

 

그럼 아이콘과 component 의 이름이 같이 나오게 됩니다.

 

이제 아래 그림처럼 GUI 를 구성해 보도록 하죠.

 

 

component palette 에서 Push Button 을 클릭하고 gui창에 마우스로 드래그 해서 붙이고~

 

Axes 를 클릭하고 원하는 크기 만큼 마우스로 드래그 해서 붙이면 됩니다.

 

그리고 push button 의 이름을 바꿔주기 위해서 push button 부분을 더블 클릭 하시면

 

아래 그림처럼 inspector 가 나오는데요.

 

inspector 는 component 의 설정 등을 변경 할 때 사용합니다.

 

어쨌든 아래 그림처럼 String 부분을 Plot 으로 바꿔주면 버튼의 이름이 Plot 으로 변경됩니다.

 

 

지금 현재 GUI 창에 있는 각 component 들은 (object browser) 를 클릭하면 쉽게 알 수 있습니다.

 

 

어떤 component 가 있는지 그리고 각 component 의 tag 값은 무엇인지 알 수 있습니다.

 

현재 axes component 는 axes1 이라는 tag 를 가졌고 pushbutton 은 pushbutton1 이라는 tag 를 가졌습니다.

 

본 포스팅의 예는 매우 간단하여 tag 구분이 쉽지만 ~~

 

여러 개의 component 가 있을 때 각 component 는 tag로 구분 하므로 tag 명을 잘 구분 하셔야 합니다.

 

GUI 를 이렇게 구성 했으면 이제 저장을 해야죠.

 

저는 plot_GUI.fig 라는 파일명으로 저장했는데요. 원하는 파일명으로 저장 하시면 됩니다.

 

그럼 같은 폴더에 똑 같은 이름은 m 파일이 자동으로 만들어 집니다.

 

저는 plot_GUI.m 파일이 자동으로 만들어 졌습니다.

 

이제 plot_GUI.m 파일에 코드 몇 줄 작성하면 됩니다.

 

matlab editor 에서 만들어진 plot_GUI.m 파일을 엽니다.

 

그럼 각종 함수 들이 쭉 써져 있는 것을 보실 수가 있습니다.

 

버튼을 눌렀을 때 sin, cos 그래프가 그려지도록 할 것이므로

 

function pushbutton1_Callback(hObject, eventdata, handles) 

 

이라는 코드 부분을 찾습니다. 위 함수 정의 부분은 pushbutton1 을 눌렀을 때 호출되는 함수라는 뜻입니다.

 

위 함수 정의 이하 부분을 아래와 같이 코딩 합니다.

 

function pushbutton1_Callback(hObject, eventdata, handles)

% hObject handle to pushbutton1 (see GCBO)

% eventdata reserved - to be defined in a future version of MATLAB

% handles structure with handles and user data (see GUIDATA)

 persistent state;
persistent graph_h;  

if isempty(state)

state=1;

end

 

if state==1

x=linspace(0,2*pi,200); % radian axes

y_sin=sin(x); % sin

y_cos=cos(x); % cos

 

axes(handles.axes1); % graph axes

graph_h=plot(x,y_sin,x,y_cos); % plot handle, graph_h

grid on;

legend('Sin(x)','cos(x)'), xlabel('radian'), ylabel('value')

state=0;

else

set(graph_h,'visible','off'); % graph_h visible off

state=1;

end 

 

이제 다 완성된 겁니다. 저장을 하시면 코딩도 끝입니다.

 

plot_GUI.fig 창에서 ctrl + T 를 누르시거나 초록색 삼각형 부분을 눌러서 실행 시켜도 되고~~~

 

그냥 command 창에서 plot_GUI 라는 명령어를 입력 해서 실행 시켜도 됩니다.

 

그럼 아래 그림처럼 GUI 가 실행 됩니다.

 

 

Plot 버튼을 한번 누르면 아래 그림처럼 sin, cos 그래프가 나오죠~

 

 

그리고 또 한번 누르면 아래 그림처럼 그래프가 사라지게 됩니다.

 

 

그럼 오늘의 포스팅은 여기서 마치겠습니다.


'programming language > MATLAB' 카테고리의 다른 글

MATLAB 뫼비우스의 띠  (0) 2012.03.23
MATLAB FFT 처리 속도  (0) 2012.03.19
MATLAB varargin, varargout  (6) 2012.03.12
MATLAB GUI 창 크기 조절  (4) 2012.03.03
MATLAB GUI  (4) 2012.02.24
MATLAB figure ButtonDownFcn  (0) 2012.02.22
Simulink Algebraic Loop  (0) 2012.02.13
MATLAB dos 명령 사용하기  (0) 2011.12.21
MATLAB convolution  (0) 2011.11.20
  1. 후햐호히 2014.12.06 18:58

    gui에대해서
    궁금한게있는데답해주실수있나요???

  2. hh 2018.05.24 20:25

    gui에서 탭 만드시는 방법 혹시 아시나요?

    • 남성 2018.05.25 01:04 신고

      저도 안 만들어봐서 모르겠네요. 메뉴얼 찾아보면 나오지 않을까요?

 

오늘은 MATLAB figure 창을 클릭 했을 때 특정 동작을 하도록 하는 Button down callback function 에 대해 설명 드립니다.

 

아래 예제 코드를 보면서 설명 드리겠습니다.

 



buttondownfnc_test.m file

 

x=1:10;

y=x*2;

 

h=figure;                                     % 그림 창의 handle , h

h_plot=plot(x,y,'r:.');                       % 그래프의 handle , h_plot

grid on ;

 
% 그림 창의 button down function {@grid_ONOFF2, h_plot} 설정

set(h,
'ButtonDownFcn',{@grid_ONOFF2, h_plot})

 

 

위 예제 코드는 단순하게 y=2x 의 직선을 그리고

 

그림 창을 누르면 선이 없어지거나 다시 생기게 만드는 예제 입니다.

 

먼저 h 라는 그림 창의 핸들과 h_plot 이라는 그래프의 handle 을 얻었습니다.

 

handle 이 무언지 잘 모르겠다 하시는 분들은 자동차의 핸들을 생각하면 될 것 같습니다.

 

자동차의 핸들을 잡아야 자동차를 맘대로 할 수 있는 것처럼 ~~

 

그래프나 그림도 핸들을 통해서 맘대로 조정할 수 있는 것입니다.

 

위 코드의 grid_ONOFF2 함수는 다음과 같이 코딩 후 grid_ONOFF2.m 파일로 저장 했습니다.

 

grid_ONOFF2.m file

 

function grid_ONOFF2(~, ~, arg1)

 

persistent state;

 

if isempty(state)

state=1;

end

 

if state==1

set(arg1,'visible','off'); % 그래프를 보이지 않게

state=0;

else

set(arg1,'visible','on'); % 그래프를 보이게

state=1;

end

end 

 

grid_ONOFF2 함수의 첫 번째argument 는 함수를 호출하는 object의 handle 이 들어가게 됩니다.

 

두 번째 argument 는 호출시의 event 가 들어가게 되는데

 

위 함수에서는 첫 번째와 두 번째 argument 를 이용하지 않기 때문에 ~(물결)로 표시는 한 것입니다.

 

세 번째 argument 로 arg1 이라는 또 다른 입력을 받을 수 있게 했습니다.

 

buttondownfnc_test.m 파일에서 {@grid_ONOFF2, h_plot} 라고 되어 있는 부분의 h_plot 이라는 그래프의 핸들이 grid_ONOFF2 함수의 arg1 로 전달이 되는 겁니다.

 

위 함수 내부의 코드들은 단순히 그림 창을 한번 누르면 h_plot 을 보이게 만들고

 

그림 창을 또 한번 누르면 보이지 않게 만들고 하는 코드 입니다.

 

그럼 이제 buttondownfnc_test.m file 을 실행 시켜보죠.

 

그럼 아래 그림 같은 그래프가 나옵니다.

 

 

그럼 이제 위 그래프의 회색 부분마우스로 클릭해 보시기 바랍니다.

 

아래 그림처럼 그래프가 사라지는 것을 확인 하실 수 있을 겁니다.

 

 

재미있죠? 그럼 오늘의 포스팅은 여기서 마무리 하겠습니다.


'programming language > MATLAB' 카테고리의 다른 글

MATLAB FFT 처리 속도  (0) 2012.03.19
MATLAB varargin, varargout  (6) 2012.03.12
MATLAB GUI 창 크기 조절  (4) 2012.03.03
MATLAB GUI  (4) 2012.02.24
MATLAB figure ButtonDownFcn  (0) 2012.02.22
Simulink Algebraic Loop  (0) 2012.02.13
MATLAB dos 명령 사용하기  (0) 2011.12.21
MATLAB convolution  (0) 2011.11.20
Window command 에서 MATLAB 실행 방법  (0) 2011.11.20

Simulink 를 사용하면서 종종 Algebraic Loop Error를 만나게 되는데요.

 

오늘은 이 Algebraic Loop에 대해 알아보려고 합니다.

 

Algebraic Loop 에 대해 이해하기 위해서는 Simulink 의 Direct feedthrough 에 대한 이해가 선행 되어야 합니다.

 

Direct feedthrough 란 어떤 블록의 출력이 결정되는데 현재의 입력이 영향을 미치는 것을 의미합니다.

 

예를 들면 Add, Gain 과 같은 블록은 현재의 입력이 있어야 출력을 알 수가 있을 테니깐 이런 블록들이 바로 direct feedthrough 한 블록들인 것입니다.

 

Algebraic Loop 란 이런 direct feedthrough 한 블록의 출력이 입력에 연결 되었을 때 발생을 합니다.

 

어떻게 보면 당연한 얘기지만 Algebraic Loop 가 있는 구조는 구현 불가능 블록입니다.

 

이유는 time 에 있습니다.

 

t1 이라는 특정 시점에 블록의 현재 출력이 현재의 입력에 들어간다면 물리적으로 불가능 한 거죠.

 

C 나 MATLAB m 파일 작성 시에도 평소에 이런 구현 불가능한 코딩은 지양 해야겠다고 생각됩니다.

 

그럼 간단하게 흔히 실수를 저지르는 Simulink 블록의 구조에 대해 알아보죠.

 

아래 Simulink 블록은 간단한 누적기 입니다.

 

 

입력 소스로 카운터를 두고 계속 누적 하도록 한 거죠.

 

위와 같은 구조의 블록을 실행 시키면 다음과 같은 algebraic loop error 가 발생하게 됩니다.

 

 

Simulink 는 기본적으로 Configuration parametersdiagnostics à solver 설정에서 algebraic loop 설정이 warning 으로 설정되어 있습니다.

 

그럼 이러한 algebraic loop 를 피하는 방법은 어떻게 될까요?

 

해결 방법은 간단 합니다.

 

위 블록의 feedback path 의 중간에 적절한 delay 블록을 넣어 주는 겁니다.

 

에러가 나지 않는 구조는 다음과 같습니다.

 

 

위 모델을 실행 시키면 다음과 같은 정상적인 결과를 얻을 수 있습니다.

 

 


'programming language > MATLAB' 카테고리의 다른 글

MATLAB varargin, varargout  (6) 2012.03.12
MATLAB GUI 창 크기 조절  (4) 2012.03.03
MATLAB GUI  (4) 2012.02.24
MATLAB figure ButtonDownFcn  (0) 2012.02.22
Simulink Algebraic Loop  (0) 2012.02.13
MATLAB dos 명령 사용하기  (0) 2011.12.21
MATLAB convolution  (0) 2011.11.20
Window command 에서 MATLAB 실행 방법  (0) 2011.11.20
MATLAB, end 를 이용한 데이터 추가  (1) 2011.11.18

 

MATLAB 에서 여러 개의 텍스트 파일이나 data 파일 등을 dir 명령어를 이용하여 파일 목록을 가져올 있습니다.

 

파일 목록을 가져 후에 for 등을 이용하여 일괄적으로 파일을 열어서 데이터를 가져 오는 것이 가능 합니다.

 

하지만 MATLAB dir 명령은 recursive 하게 동작하는 옵션은 없습니다.

 

이러한 경우에는 MATLAB 에서 운영체제의 명령어를 이용하여 처리하는 것이 좋습니다.

 

윈도우 운영체제에서 도스 명령어를 이용할 경우에는 dos command 같은 형태로 이용합니다.

 

또는 [status, result] = dos('command') 같이 이용하여 dos 명령 실행 결과를 MATLAB 으로 가져 수도 있습니다.

 

이제 현재 폴더에서 모든 txt 파일을 recursive 하게 찾아 보죠~

  

[~, result] = dos('dir /s /b *.txt'); % dos 명령 실행 recursive 하게 최소 형식으로 txt 파일 찾기 실행


filenames = textscan(result,'%s','delimiter',char(10)); %
바꿈(\n) 구분자로 해서 결과를 나눔


filenames2 = filenames{1}; % cell type
으로 파일이름 저장


 

 

코드에서 filenames2 변수에 원하는 txt 파일들의 전체경로가 저장이 됩니다.

 

그럼 for 등을 이용해서 열기만 하면 되는 거죠~


'programming language > MATLAB' 카테고리의 다른 글

MATLAB GUI 창 크기 조절  (4) 2012.03.03
MATLAB GUI  (4) 2012.02.24
MATLAB figure ButtonDownFcn  (0) 2012.02.22
Simulink Algebraic Loop  (0) 2012.02.13
MATLAB dos 명령 사용하기  (0) 2011.12.21
MATLAB convolution  (0) 2011.11.20
Window command 에서 MATLAB 실행 방법  (0) 2011.11.20
MATLAB, end 를 이용한 데이터 추가  (1) 2011.11.18
MATLAB 집합 관련 함수들  (0) 2011.06.13

요즘 부쩍 MATLAB for 문을 이용한 convolution 에 대한 질문이 많이 들어오는군요.

 

그래서 오늘은 MATLAB for loop 를 이용한 convolution 에 대해 설명 드리려 합니다.

 

다들 아시는 바와 같이 MATLAB 에는 기본적으로 convolution 을 수행하는 함수인 conv() 라는 함수가 존재 합니다.

 

c=conv(a, b) 와 같은 형태로 쓰이곤 합니다.

 

당연히 a 와 b 의 convolution결과를 c 에 리턴 하는 함수이죠

 

convolution 이라는 것이 결국에는 FIR filter 와 같다고 보셔도 무방 합니다.

 

다만 그 return 되는 값의 길이에 있어서 차이가 있죠.

 

이는 filter 의 shift register 를 다시 0으로 채워주는 과정이 추가가 되기 때문 입니다.

 

convolution 을 for loop 를 이용해서 구현해 보면 다음과 같습니다. 

 

위 에서 a, b 는 둘 다 length가 3 이므로convolution 결과는 3+3-1=5 길이가 되게 됩니다.

 

단순히 buffer 를 시프트 하고 곱하고 더하고 하는 과정이니 코드를 보시면 쉽게 아실 수 있을 겁니다.

 

결과는 다음과 같습니다.

 

 

conv() 함수를 이용하였을 경우와 for loop 를 이용하였을 경우의 결과가 같음을 확인 할 수 있습니다.


'programming language > MATLAB' 카테고리의 다른 글

MATLAB GUI  (4) 2012.02.24
MATLAB figure ButtonDownFcn  (0) 2012.02.22
Simulink Algebraic Loop  (0) 2012.02.13
MATLAB dos 명령 사용하기  (0) 2011.12.21
MATLAB convolution  (0) 2011.11.20
Window command 에서 MATLAB 실행 방법  (0) 2011.11.20
MATLAB, end 를 이용한 데이터 추가  (1) 2011.11.18
MATLAB 집합 관련 함수들  (0) 2011.06.13
MATLAB plot tools  (0) 2011.05.26

+ Recent posts