회사에서 사용하는 제 컴퓨터에는 MATLAB 이 설치가 되어 있지만, MATLAB이 설치가 안 된 PC에서는 OCTAVE 를 주로 사용하고 있습니다. OCTAVE 는 MATLAB 과 거의 유사한 문법을 사용하고 있어서 MATLAB 에서 사용하던 코드의 대부분을 재사용 할 수 있습니다.

저는 최근에는 주로 실험 데이터에 대해 분석하는 용도로 MATLAB, OCTAVE 를 사용하고 있고 데이터는 장비에서 주로 CSV 파일 형태로 로깅을 하고 있습니다. CSV 형태로 로깅된 파일을 분석하기 위해서는 OCTAVE 에 해당 csv 파일의 경로를 알려줘야 합니다. 그래야 읽을 수 있을 테니까요~

매번 경로를 m 파일에 적어 주는 것도 가능 하지만 파일을 매번 열어서 적는것도 굉장히 귀찮은 일인 것 같습니다. 이럴 때 주로 아규먼트를 사용하고~ 오늘은 Command Line 에서 OCTAVE 아규먼트 사용 방법에 대해서 소개하려 합니다.

일단 커맨드라인에서 옥타브를 실행하기 위해서 OCTAVE 실행 명령을 알아야 될 겁니다. 아래 그림과 같이 옥타브 바로가기 아이콘에 오른쪽 클릭을 하고 속성을 확인해 보면~ 명령어가 나옵니다.

OCTAVE CLI 를 실행하는 명령어는 아래와 같고~

%SYSTEMROOT%\system32\wscript.exe "C:\Octave\Octave-5.1.0.0\octave.vbs" --no-gui

OCTAVE GUI 를 실행하는 명령어는 아래와 같습니다.

%SYSTEMROOT%\system32\wscript.exe "C:\Octave\Octave-5.1.0.0\octave.vbs" --force-gui

제 컴퓨터에서 실행을 해보니 앞에 붙어 있는 wscript.exe 까지의 구문은 없어도 실행이 되더군요~ 따라서 아래와 같이 실행할 수 있었습니다.

CLI : "C:\Octave\Octave-5.1.0.0\octave.vbs" --no-gui

GUI : "C:\Octave\Octave-5.1.0.0\octave.vbs" --force-gui

OCTAVE Command Line Options 관련 문서는 아래 주소에서 확인할 수 있습니다.

http://octave.org/doc/interpreter/Command-Line-Options.html

다른 것들은 필요할 때마다 검색을 해 보시면 될 거 같고~ 커맨드 라인에서 m 파일을 실행하기 위해서는 위 옥타브 실행명령어 뒤에 m 파일의 path 를 넣으면 되고~ m 파일에서 받고 싶은 아규먼트는 또 그 뒤에 적어 주면 됩니다. 따라서 아래와 같은 명령 형태가 됩니다. 아규먼트는 공백을 구분자로 하기 때문에~ 추가적인 아규먼트가 있다면~ 한 칸 띄고 계속 써 주면 됩니다. 혹시 path 에 공백이 있는 경우에는 전체 path 를 쌍따옴표로 감싸서 넣어 주면 됩니다.

"C:\Octave\Octave-5.1.0.0\octave.vbs" --no-gui mFILEPATH csvFILEPATH

m 파일에서 argument 는 argv() 를 통해 받을 수 있습니다. argv() 는 Cell 타입을 리턴합니다.

저는 아래와 같이 간단하게 test.m 파일을 만들어 봤고~

argvsV= argv()

class(argvsV)

csvPath=argv(){1}

pause(5)

Windows CMD 창에서 아래와 같은 명령어로 실행해 봤습니다.

"C:\Octave\Octave-5.1.0.0\octave.vbs" --no-gui test.m test.csv

그럼 새로운 CMD 창이 뜨면서 아래와 같이 옥타브 실행 결과를 볼 수가 있습니다.

커맨드 라인에서 위와 같은 명령어를 계속 타이핑 하는 것은 불편하므로 아래 포스팅을 참조하여 배치 파일을 만들어서 사용하는게 훨씬 더 간편 할 것입니다.

https://iamaman.tistory.com/988

많은 분들이 모르시는 것 같은데… 배치 파일 또는 실행 파일에 파일을 drag & drop 하면 해당 실행 파일의 아규먼트로 들어가게 됩니다.



최근에 매트랩 브러시 기능을 자주 사용하고 있습니다. 그래프를 그리고 유효한 데이터를 선택하기 위해서 아래 포스팅에서 소개를 했었던 브러시, 데이터 커서 기능을 굉장히 많이 사용하고 있고 브러시 된 데이터들을 변수를 저장하여 MATLAB 워크스페이스에서 가공을 하고 유효한 데이터들을 얻는 작업들을 수행하곤 합니다.

https://iamaman.tistory.com/2830

위 포스팅에서 브러쉬 된 데이터들을 “변수 만들기” 를 통해서 변수로 저장할 수 있다는 것을 소개한 적이 있었는데~ MATLAB 에서는 조금 더 다양한 방법으로 brush 된 데이터들에 접근할 수 있었습니다.

일단 아래와 같이 그래프를 하나 그리고~ brush on 을 해 줍니다~

x=1:10

p = plot(x)

brush on

Figure 창에서 데이터들을 선택한 후에~ 보통은 오른쪽 클릭을 해서 “변수 만들기” 를 하지만 아래와 같은 명령을 통해서도 brush 된 데이터를 변수로 만들 수 있습니다.

일단 브러시 된 데이터들의 인덱스는 아래 명령어를 통해서 확인할 수 있습니다.

ind = find(get(p, 'BrushData'));

다음으로 인덱스에 따른 X, Y 좌표의 값들은 아래와 같은 명령어를 통해 변수로 만들 수 있습니다.

brush = logical(get(p, 'BrushData'))

xd = get(p, 'XData')

yd = get(p, 'YData')

brushed_x = xd(brush)

brushed_y = yd(brush)

brushed_x, brushed_y 변수를 확인해 보면 브러쉬 된 데이터가 저장 된 것을 확인할 수 있고~ 만약 3차원 그래프라면 z 축의 값도 동일한 방식으로 구할 수 있습니다.

위 코드에서 plot 핸들을 p 라는 변수로 받아서 사용을 했는데~ plot 은 axes 의 Children 입니다. 따라서 아래와 같이 gca 의 ‘Children’ 속성을 통해서도 똑같이 plot 핸들을 구할 수 있습니다.

p = get(gca, 'Children')

gca 키워드에 대해서는 아래 포스팅을 참조하시기 바랍니다.

https://iamaman.tistory.com/174

추가적으로~ 제가 많이 참고 하는 사이트로 “Undocumented Matlab” 이라는 사이트가 있는데~ MATLAB 을 조금 더 파워풀하게 사용하고자 하시는 분들은 아래 사이트에 방문해 보시기 바랍니다.

https://undocumentedmatlab.com

MATLAB brush 데이터에 접근하는 다양한 방법들은 아래 포스팅을 통해서도 확인할 수 있습니다.

https://undocumentedmatlab.com/blog/accessing-plot-brushed-data

그리고 위 포스팅 내용 중 uiinspect 라고 하는 괜찮은 유틸을 확인할 수 있었는데~ 해당 유틸은 아래 주소의 File Exchange 사이트를 통해 다운로드 받을 수 있습니다.

https://kr.mathworks.com/matlabcentral/fileexchange/17935-uiinspect-display-methods-properties-callbacks-of-an-object



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

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

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

y = x+3

y = 2*x-6

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

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

y1 = x+3;

y2 = 2*x-6;

x_=[x fliplr(x)];

y_= [y1 fliplr(y2)];

figure

fill(x_, y_, 'r')

grid on

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

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

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

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

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

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

y1 = x+3;

y2 = 2*x-6;

x=x(:);

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

figure

h = area(x, y);

grid on

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

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

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

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

alpha(h(1),0.1)

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



이 포스팅을 보시는 분들이라면 다들 아시겠지만 MATLAB 의 그래픽 표현 능력은 정말 뛰어난 편입니다. 신호 처리를 비롯해서 많은 분야에서 그래프를 사용하고 있고~ 그런 의미에서 MATLAB 은 정말 큰 장점이 있는 툴 인 것 같습니다.

MATLAB 에서 하나의 Figure 창에 다양한 그래프를 나타내기 위해서 아래 포스팅에서 소개했던~ subplot 과 같은 함수를 사용하곤 하는데~

https://iamaman.tistory.com/101

오늘은 axis 를 사용하여 그래프 안에 조그맣게 또 다른 그래프를 그리는 방법에 대해서 소개를 하려 합니다.

샘플 코드는 아래와 같습니다.

그래프 안에 조그만 또 다른 그래프를 그리기 위해서~ axes() 함수를 사용하여 작은 그래프가 들어갈 위치를 잡아주고~ 바깥에 있는 큰 그래프와 구분해 주기위해 box on 을 했습니다.

이후에 그래프를 그리면 아래 그림과 같이 그래프 안에 또 다른 작은 그래프가 들어가는 것을 확인할 수가 있습니다.



아래 포스팅에서 네이버 지식인 활동 증명서에 대해서 소개를 드린 적이 있었고~

https://iamaman.tistory.com/2860

최근에 해피빈 콩을 받는데 맛이 들려서~ 한동안 나름 열심히 지식인에 답변을 단 거 같습니다. 저는 주로 MATLAB 관련된 질문에 대해서 답변을 하고 있고 가끔씩 파이썬이나 수학, 미적분, 회로, Autohotkey 등에 대해서도 답변을 하고 있습니다.

그래도 조금 열심히 하다 보니 이번에 지존에서 초인으로 등업이 됐네요.

기념으로 남겨 놓습니다~

지식인 등급은 아래와 같이 정말 많은데 초인 이후에는 신으로 분류가 되더군요.

지금은 인간계에 있지만 앞으로 신계로 등업할 걸 생각하니 더 열심히 답변을 해 봐야 되겠다는 생각이 듭니다. 물론 지식인 답변은 저 개인적으로 딱히 경제적인 이득은 없습니다. 하지만 해피빈 콩을 받아서 나름 좋은 일에 사용을 할 수 있는 부분이 있어서 괜찮은 것 같습니다.

조그만 재능이나마 누군가에게는 도움이 돼서 다행이네요. 앞으로도 꾸준히 열심히 지식인 활동을 해 봐야 되겠네요~ 오늘도 파이팅입니다.



전자과 학생들은 전공과목으로 회로이론이나 전자회로 과목들을 정말 많이 들으실테고 이런 과목을 공부하다 보면 당연히 직렬 또는 병렬 연결된 저항값을 계산하는 문제를 자주 접하게 됩니다. 테브난 회로, 노턴 회로를 비롯해서 다양한 문제에서 합성 저항값을 계산하게 되는데~

오늘은 Circuit Simulator 를 사용하여 합성저항을 굉장히 쉽게 알아내는 방법에 대해서 소개하려 합니다.

Circuit Simulator 에 대해서 궁금하신 분들은 아래 포스팅을 참조하시기 바랍니다.

https://iamaman.tistory.com/2626

또한 Circuit Simulator 와 비슷한 오픈소스 설치형 Circuit simulation 프로그램인 Qucs(Quite Universal Circuit Simulator) 에 대해서는 아래 포스팅에서 소개하고 있으니 참조하시기 바랍니다.

https://iamaman.tistory.com/2847

또한 MATLAB 을 활용하여 병렬 저항값을 구하는 함수에 대해서는 아래 포스팅을 참조하시기 바랍니다.

https://iamaman.tistory.com/2764

기왕 합성 저항을 구하는 거 아래 회로에 대해서 테브난 등가회로를 구해 보죠~

http://tinyurl.com/y35o5k3l

테브난 등가 회로를 구하는 방법은 아래와 같이 두 단계로 볼 수가 있습니다.

1. ab 단에 걸리는 전압을 구하고~ 이는 테브난 전압이 됩니다.

Circuit Simulator 에서 전압을 구하는 방법은 너무나 간단한데 그냥 원하는 위치에 마우스 커서를 갖다대면 됩니다. ab 단이 open circuit 이므로 1k 옴 저항에는 전류가 흐르지 않게 되고~ 따라서 a 노드에 걸리는 전압값은 c 노드에 걸리는 전압값과 동일합니다.

Circuit Simulator 에서 아래와 같이 a 노드의 전압값이 -7.85 V 라는 것을 확인할 수 있고~

c 노드의 전압값 역시 -7.85 V 라는 것을 확인할 수 있습니다.

따라서 테브난회로의 전압값은 -7.85 V 네요~

2. ab 단에서 바라본 합성 저항을 구해야 하고 이는 테브난 저항이 됩니다.

합성 저항을 구하기 위해서 전압원은 short circuit 으로 하고 전류원은 open circuit 으로 합니다. 그리고 ab 단에서 바라본 합성 저항을 구하면 되죠~

합성 저항을 구하기 위해 ab 단에 전압원을 하나 달아주면 아래와 같이 됩니다. 전압값은 아무렇게나 줘도 되고 그냥 간단하게 1 V 만 주는 것이 편할 것입니다.

http://tinyurl.com/y4due42e

이 상태에서 합성 저항을 구하는 방법은 너무나 간단한데~ 전압원에 마우스를 올려 놓으면~ 아래와 같이 합성저항 값을 알 수가 있습니다. 아래 보시다시피 합성저항 값은 2.43 k 옴이네요~ 그리고 이 값이 바로 테브난 저항값이 됩니다.

전압과 저항값을 다 구했으니~ 테브난 등가회로는 아래와 같이 구성이 되겠네요.

Circuit Simulator 를 활용한 합성저항 구하는 방법과 테브난 등가회로 구하기 참 쉽죠~ Circuit Simulator 많이 활용해 보시기 바랍니다. 회로이론 초보자라면 정말 많은 도움이 될 거라고 생각합니다.



한동안 지식인 답변 하는 것을 조금 쉬고 있다가 최근에 다시 지식인에 관심을 갖게 되었습니다. 저는 지식인에 주로 질문을 하기 보다는 답변을 해 주고 있고, 제 블로그를 보신 분들은 아시겠지만 MATLAB 이나 그 외 프로그램 관련된 질문에 대해서 답변을 해 주고 있습니다.

최근에 다시 지식인 활동을 하면서 지식인 페이지를 조금 보다 보니 지식인 활동증명서라는게 있더군요. 무슨 내용이 들어 있는 건가 해서 클릭을 한번 해보니 아래와 같이 지식인에서 답변하고 있는 활동에 대해서 네이버에서 증명서를 주는 것이더군요. 저는 지금 네이버 지식인 지존 등급인데 활동 증명서를 보니 2005년 1월 2일부터 시작을 했다고 나와 있었습니다. 2005년이면 벌써 14년 전이니 정말 오래되긴 했네요.

그동안 꾸준히 지식인 활동을 한게 아니라서 지금 아직도 지존 등급인 것 같습니다. 네이버 지식인 활동을 하면 사실 딱히 경제적인 이득은 없습니다. 하지만 해피빈 콩이라는 것을 받게 되고~ 그렇게 모은 콩을 기부 할 수가 있습니다.

해피빈 페이지는 아래와 같은데~

https://happybean.naver.com/

MY해피빈 페이지에 들어가 보면 자신이 보유한 콩과 그동안에 후원한 금액을 확인할 수 있습니다.

https://happybean.naver.com/my/home

지금까지 저는 지식인 활동을 하면서 아래 보시다시피 51,000원 정도를 기부했는데~

적은 금액이지만 그래도 나름 기분이 좋았던 것 같습니다. 해피빈 홈페이지를 보다보면 정말 많은 어려운 이웃들이 있고…. 조금 더 힘내야 되겠다는 생각이 많이 듭니다. 앞으로는 조금 더 열심히 지식인 활동을 해서 콩도 많이 모으고 기부도 더 많이 할 수 있도록 노력해야 겠네요.



MATLAB 을 사용하다 보면 struct 타입을 종종 사용하곤 합니다. 그리고 struct 타입을 모아서 배열로도 사용하곤 하는데 MATLAB 기본 함수중에 struct 타입 배열을 정렬하는 기능의 함수는 없는것 같더군요.

그냥 만들어 사용해도 되겠지만 검색을 조금 해보니 비슷한 코드를 발견했고 해당 코드를 정리해서 아래와 같은 함수로 만들었습니다.




이제 함수를 만들었으니 한번 사용해 보죠.

a = struct('id',1, 'data', [1:10])

b = struct('id',2, 'data', [2:11])

beforeVec= [b a]; % 두 struct 를 사용하여 배열로 만듬

sortedVec = struct_sort_by_field(beforeVec,1,1); % 첫번째 field 의 첫번째 인덱스 값에 대해 정렬

beforeVec.id % 기존 배열의 인덱스 확인

sortedVec.id % 정렬된 배열의 인덱스 확인

위 결과를 보면~ sortedVec 는 id 값에 따라 오름차순으로 정렬 된 것을 확인 할 수 있습니다.



많은 분들이 MATLAB을 사용하여 데이터 처리를 할 것이라고 생각을 합니다. 사실 MATLAB을 사용할 수 있는 분야는 너무나 무궁무진해서 저도 다 알지는 못 하고 저는 회사에서 신호 처리를 하고 있는데 데이터를 가공하기 위해서 MATLAB 을 주로 사용하는 편입니다.

아래 포스팅에서 소개를 했었지만 매트랩 그래프를 보면서 데이터를 선택하고 값을 읽고 텍스트를 입력하거나 다양한 효과를 줄 수가 있습니다.

https://iamaman.tistory.com/204

오늘은 그 중에서 데이터 커서를 사용하여 그래프에서 값을 읽거나 브러시 기능을 사용하여 많은 데이터들을 선택하는 방법에 대해서 살펴보려 합니다.

다음과 같은 코드를 준비하고 그래프를 하나 드려 보겠습니다.

x=[ones(1,100)*2 ones(1,100)*10 ones(1,100)*20];

xx=x+rand(size(x));

plot(xx), grid on

위 코드를 실행하면 아래와 같은 그래프 하나가 뜨게 될 겁니다.

그래프에서 데이터 커서 기능 사용하기

그래프를 보면서 특정 부분의 데이터를 알고 싶은 경우가 있습니다. 그런 경우에는 Figure 창의 데이터 커서 기능을 사용 합니다.

데이터의 값을 보고 싶은 경우에는 아래와 같이 십자가 모양 버튼의 아이콘을 클릭해 줘도 되고 ~ 메뉴에서 “툴(T) -> 데이터 커서(A)” 를 선택해도 됩니다.

데이터 커서를 눌러준 후에 커서가 십자가 모양으로 변하고 원하는 데이터 지점을 선택하면 아래와 같이 해당 부분의 데이터값이 나타나게 됩니다. 여러 데이터를 찍고 싶으면 Shift 를 누른 상태에서 왼쪽 클릭을 해 주면 아래와 같이 복수의 데이터를 선택할 수도 있습니다. 이렇게 선택을 한 후에 오른쪽 클릭을 하면 해당 데이터와 관련된 툴팁 메뉴가 나오고 원하는 기능을 선택 할 수가 있습니다.

저는 주로 데이터를 삭제하거나 새 데이터를 만들기보다는 “커서 데이터를 작업 공간으로 내보내기” 기능을 주로 사용합니다. “커서 데이터를 작업 공간으로 내보내기” 버튼을 누르면 변수 이름을 입력할 수 있는 창이 하나 뜨게 되고 데이터 커서를 사용하여 선택한 데이터들을 MATLAB 워크스페이스에 저장 하고 다양한 계산에 활용할 수 있습니다.

그래프에서 브러시 기능 사용하기

데이터 커서는 데이터의 값을 보는데 주로 사용을 하지만 브러시 기능은 마우스로 다량의 데이터를 선택해서 편집하는데 주로 사용하곤 합니다. 브러시 기능 역시 마찬가지로 아이콘을 클릭하거나 메뉴에서 “툴(T) -> 브러시(B)” 를 선택하면 됩니다.

브러시는 기본적으로 빨간색이 선택되어 있는데 브러시 아이콘 옆에 있는 아래쪽 화살표를 누르면 브러시 색깔을 선택할 수 있습니다.

브러시 기능을 실행 하고 아래와 같이 원하는 부분을 드래그해서 선택해주면 ~ 원하는 데이터 부분들을 선택할 수 있습니다. 데이터 커서 기능과 마찬가지로 오른쪽 버튼 클릭하면 추가적인 기능을 사용할 수 있고 “변수 만들기” 버튼을 누르면 데이터 커서에서와 마찬가지로 MATLAB 워크스페이스에 데이터를 저장할 수도 있습니다.

위 메뉴에서 확인할 수 있는 바와 같이 선택된 데이터들에 대하여 일괄적으로 특정값으로 바꾸거나 제거하는 등 편리하게 데이터를 조작할 수 있습니다.

아래 포스팅들에서 소개를 했었던 tiobe 에 접속을 해 보니 요즘도 계속해서 MATLAB 의 인기가 상승 중이더군요~ 요즘은 11위 까지 올라갔네요~

https://iamaman.tistory.com/85

https://iamaman.tistory.com/1479

https://iamaman.tistory.com/1590

아시는 바와 같이 MATLAB 은 일년에 두번씩 업데이트를 하고 있고 지금도 계속해서 발전하고 있는 프로그램입니다. 많은 분들이 현명하게 MATLAB 을 활용하셨으면 하는 바람입니다.



MATLAB 을 사용하여 신호 처리를 하다 보면 필터를 설계하는 경우가 있고 필터의 게인을 조절해야 되는 경우가 있습니다. 보통 디지털 필터 설계를 할 때는 pass band 의 게인을 1 (0 dB) 로 맞춰 주게 되는데 오늘은 이 방법에 대해서 소개를 하려 합니다.

MATLAB 을 사용하여 필터 설계하고 코드를 생성하거나 모델을 만들때는 fdatool (Filter Design & Analysis Tool) 을 주로 사용하게 되고 필터를 확인하고 싶을때는 fvtool(Filter Visualization Tool) 을 주로 사용합니다.

FIR 필터 계수가 CoeffV 인 경우 MATLAB 명령창에 fvtool(CoeffV,1) 라고 명령하면 아래와 같은 Filter Visualization Tool 이 실행되고 해당 필터 계수에 대한 정보들을 확인 할 수 있습니다.

또한 Analysis -> Analysis Parameters 를 선택하면

아래와 같이 Analysis Parameters 창이 나타나고 “Normalize Magnitude to 1 (0 dB)” 를 체크하고 적용하면

아래와 같이 pass band 의 게인이 1 로 설정이 되는 것을 확인 할 수 있습니다.

그런데 이러한 설정은 실제 값이 바뀌는 것이 아닌 그래프의 형태만 바뀌는 것입니다. 따라서 실제 필터의 게인을 1 (0 dB) 로 설정하기 위해서는 필터의 게인을 알아낸 후 scaling factor 값을 구해서 해당 값으로 필터 Coefficient 를 scaling 해 줘야 합니다. 이러한 작업을 하는 코드는 아래와 같습니다.

[h, w] = freqz(num, den); % frequency response of (num, den)

scale = 1/max(abs(h)); % scaling factor

numScaled = num*scale;

fvtool(numScaled, den) 명령을 통해 해당 필터의 magnitude response 를 확인해 보면 pass band 의 게인이 1 (0 dB) 로 맞춰진 것을 확인 할 수 있습니다.



아래 포스팅에 가우스-뉴턴 방법을 사용하여 원의 방정식의 파라미터들을 찾는 실험을 수행한 적이 있었습니다.

https://iamaman.tistory.com/2759

가우스-뉴턴 방법을 적용한 결과 수렴이 되긴 하지만 초기값 설정에 따라 발산하는 경우가 너무나 많은 걸 확인 할 수 있었습니다. 그래서 이번에는 같은 문제에 대해 Gradient Descent 방법을 적용해 보았습니다. Gradient Descent 방법 적용을 위한 수식은 위 주소의 포스팅과 아래 포스팅을 참조하시기 바라고 원의 방정식에 대한 MATLAB 코드 역시 마찮가지로 위 주소의 포스팅을 참조하시기 바랍니다.

https://iamaman.tistory.com/2760?category=422993

원의 방정식에 대해 Gradient Descent 방식을 적용하여 파라미터를 찾는 코드는 아래와 같습니다.

%% Gradient Descent

XX=X(:);

YY=Y(:);

ramda = 0.05;

x = [-20;-20;-2]; % 초기값

maxIndex = length(XX)-10;


k1=1;

while 1

nn = randi(maxIndex); % random index

Y=YY(nn:(nn+3));

X=XX(nn:(nn+3));

F = sqrt((X-x(1)).^2 + (Y-x(2)).^2)-x(3);

J = [(x(1)-X)./sqrt((X-x(1)).^2 + (Y-x(2)).^2) (x(2)-Y)./sqrt((X-x(1)).^2 + (Y-x(2)).^2) -ones(size(X))];

errV = J'*F;

x = x-2*ramda*J'*F;

if mean(abs(errV))<0.00002

    disp(k1)

break

end

k1=k1+1;

end

k1

x

X 의 초기값은 [-20;-20;-2] 으로 설정했고, Gradient Descent 알고리즘을 위한 step 값은 0.05 로 설정했습니다. error 의 절대값이 0.00002 이하일때 알고리즘을 멈추도록 했고 learning 횟수를 display 하도록 설정했습니다.

learning 횟수는 그때 그때 다르지만 초기값 설정에 따른 발산 정도는 Gauss-Newton 방식에 비해 확실히 덜 한것 같다는 느낌이 들었고 아래 결과와 같이 15698 회 정도 learning 이 된 후에 정상적인 X 값을 찾는 것을 확인 할 수 있었습니다.

k1 =

15698

x =

1.0000

3.0000

3.0000



예전에 학부생 때는 회로이론 과목을 굉장히 좋아했던 기억이 있는데 오랜만에 저항을 보니 적응이 잘 안되더군요. 역시나 간단한 것이라고 해도 배운 것들은 그때그때 기록을 해놓는게 좋은것 같습니다.

오늘 기록하려고 하는 내용은 병렬저항 계산 공식인데 아시는 바와 같이 저항은 직렬 연결 됐을 경우에는 그냥 더하면 되고 병렬로 연결된 경우 아래와 같이 계산이 됩니다.

R1, R2 병렬 연결

R1, R2, R3 병렬 연결

R1, R2, R3, R4 병렬 연결

R1, R2, R3, R4, R5 병렬 연결

MATLAB 에서 병렬 저항을 조금더 편리하게 계산하기 위해 병렬 저항을 계산하는 MATLAB 코드를 작성했고 아래와 같습니다. 임의의 숫자의 아규먼트에 대해서 처리하기 위하여 아래의 포스팅에서 소개를 했던 varargin 을 사용했습니다.

http://iamaman.tistory.com/372

병렬저항 값을 계산하는 ParallelResistance 함수는 MATLAB 명령창에서 아래와 같이 사용하면 됩니다.

>> ParallelResistance(1,2,7,8)

ans =

0.5657



회사에서 사용하는 MATLAB에 설치된 툴박스를 확인해 보니 Symbolic Math Toolbox 가 없어서 이에 대한 대체 프로그램으로 octave 를 사용하게 되었습니다. 물론 아래 포스팅에서 얘기했던 Python 의 sympy 와 같은 라이브러리를 사용해도 됩니다.

http://iamaman.tistory.com/1460

octave 는 아래 주소에서 다운로드 가능합니다. 사용하시는 운영체제에 맞는 설치 파일을 다운로드 해서 설치하시면 되겠습니다.

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

octave command window 에서 아래와 같이 타이핑 하면 symbolic package 가 설치 됩니다.

pkg install -forge symbolic

설치 후에는 ver 라고 타이핑 해보면 아래와 같이 symbolic package 가 설치된것을 확인 할 수 있습니다.

symbolic package 를 사용할때는 아래와 같이 load 를 하고 사용하면 됩니다.

pkg load symbolic;

간단한 예제로 아래 포스팅에서 소개했던 원의 방정식에 대한 자코비안(jacobian) 매트릭스를 계산하는 방법에 대해 소개해 보려 합니다.

http://iamaman.tistory.com/2759

syms X Y % X Y symbolic 으로 정의

x = sym('x', [3,1]) % x = [a, b, r] 에 대한 symbolic 변수 정의

f= sqrt((X-x(1))^2+(Y-x(2))^2) - x(3) % 원의 방정식

jF = simplify(jacobian(f, [x(1), x(2), x(3)])) % jacobian 계산 및 simplify

결과는 아래와 같습니다.


nonlinear regression 등을 할때 jacobian 등을 많이 활용하게 되는데 octave 에 symbolic package 가 있어서 수식 계산할때 너무 편리한것 같네요.

이렇게 만들어진 수식은 아래 포스팅에서 소개했던 matlabFunction 함수를 사용하면 코드로도 변경이 됩니다. 그런데 MATLAB 에서는 다양한 옵션을 통해 코드 생성 결과를 다르게 할 수 있었지만 octave 에서는 function handle 의 형태로 나오는 것을 확인 할 수 있었습니다.

http://iamaman.tistory.com/202

jFFunc = matlabFunction(jF)

jFFunc =

@(X, Y, x11, x21) [(-X + x11) ./ sqrt((X - x11) .^ 2 + (Y - x21) .^ 2), (-Y + x21) ./ sqrt((X - x11) .^ 2 + (Y - x21) .^ 2), -1]

위 jacobian matrix 는 가장 마지막에 있는 -1 값이 고정 길이라 X, Y 가 벡터 입력인 경우 정상적으로 동작하지 않습니다. 따라서 아래와 같이 약간 수정해서 사용하면 되겠습니다.

jFFunc = @(X, Y, x11, x21) [(-X + x11) ./ sqrt((X - x11) .^ 2 + (Y - x21) .^ 2), (-Y + x21) ./ sqrt((X - x11) .^ 2 + (Y - x21) .^ 2), -ones(size(X))];



최근에 개인적인 필요에 의해 nonlinear regression 을 접하고 있는데 아래 포스팅을 보면서 개념을 잡아가고 있습니다.

http://darkpgmr.tistory.com/58

nonlinear regression 알고리즘 중 유명한 것이 Levenberg-Marquardt 라고 하는데 Levenberg-Marquardt 알고리즘은 gradient descent 와 Gauss–Newton 방법이 합쳐진 형태라고 하더군요. 그래서 일단 gradient descent 는 아니까 Gauss–Newton 방법이 무엇인지에 대해 공부를 하기 위해 검색을 하던 중 위 블로그를 발견하게 되었고 백문이 불여일타라고 일단 코딩해 봐야 이해가 되니까 위 포스팅에서 맨 아래 있던 예제를 MATLAB 으로 돌려 봤습니다.

예제는 원 방정식에 대해 가우스-뉴턴 방법을 적용해서 파라미터를 찾는 것입니다.

원의 중심과 반지름을 a, b, r 이라고 하고 이를 벡터로 표현하면 x=[a; b; r] 입니다.

원의 방정식(F)는 아시는 바와 같이 아래 수식과 같고~ 아래 수식에서 대문자 X 와 소문자 x 가 다르다는것을 염두에 두시기 바랍니다…. 다른 문자로 쓸걸 그랬나…. ??

위 수식에 대하여 변수 a, b, r 에 대한 자코비안(J)는 아래와 같습니다.

Gauss–Newton 업데이트 수식은 아래와 같습니다. 아래 수식에서 ‘ 는 Transpose 를 의미 하고 inv() 함수는 matrix inverse 함수입니다.

x = x - inv(J(x)' * J(x))*J(x)'*F(x)

MATLAB 에서 inv 함수를 사용하는것 보다는 역슬래쉬(\) 를 사용하는게 더 추천하는 방식이기 때문에 위 수식은 아래와 같이 구현 했습니다.

x = x - (J(x)' * J(x))\J(x)'*F(x)


반지름이 3 이고 중심이 (x,y) = (1,3) 인 원의 방정식을 하나 만들었고 제가 작성한 MATLAB 코드는 아래와 같습니다.

NOP = 100;

center = [1,3];

radius = 3;

style='b-';

THETA=linspace(0,2*pi,NOP);

RHO=ones(1,NOP)*radius;

[X,Y] = pol2cart(THETA,RHO);

X=X+center(1);

Y=Y+center(2);

H=plot(X,Y,style);

grid on

axis square;

axis equal;

다음으로 해당 원의 방정식에 대해 Gauss–Newton 방정식을 적용하는 코드는 아래와 같습니다.

XX=X(:);

YY=Y(:);

x = [0;1;15];

% 원의 방정식에 대한 가우스-뉴턴 방법

for n=1:60

Y=YY(n:(n+10));

X=XX(n:(n+10));

F = sqrt((X-x(1)).^2 + (Y-x(2)).^2)-x(3);

J = [(x(1)-X)./sqrt((X-x(1)).^2 + (Y-x(2)).^2) (x(2)-Y)./sqrt((X-x(1)).^2 + (Y-x(2)).^2) -ones(size(X))];

x = x - (J' * J)\J'*F;

end

x

위 코드에서는 초기값은 0, 1, 15 로 했고 돌려보니 아래와 같이 원의 중심과 반지름을 정확히 추정함을 확인 할 수 있었습니다.

x =

1.0000

3.0000

3.0000

그런데 다들 아시겠지만 Gauss–Newton 방식은 초기값에 따라 발산의 우려가 있다고 합니다. 저도 실험을 해보니 초기값을 다른 값들로 해서 실험을 많이 하다 보니(ex x = [0;8;15];) 로 한 경우에는 추정값이 발산하더군요.



MATLAB 의 format 명령을 사용하면 명령 창의 출력 표시 형식을 rat, hex, short, long 등으로 변경할 수 있습니다. 공학을 하다보면 숫자를 표현할때 단위에 따라 kilo, giga, mega 등과 같은 단위를 사용하곤 하고 이런 형식으로 바꾸기 위한 방법을 찾아보니 아래 주소에서 괜찮은 코드를 발견해서 소개합니다.

https://kr.mathworks.com/matlabcentral/fileexchange/53886-scientific-prefix-to-number

위 주소에서 다운로드 버튼을 누르면 num2sci.zip 파일을 다운로드 할 수 있고~

num2sci.zip 파일을 압축 해제 한 후에 해당 폴더를 path 에 추가하면 MATLAB 의 아무 디렉토리에서나 사용할 수 있습니다. 폴더를 MATLAB path 에 추가하는 방법은 아래 주소의 글들을 참조하시기 바랍니다.

http://iamaman.tistory.com/1829

http://iamaman.tistory.com/569

http://iamaman.tistory.com/2629

num2sip.m, num2bip.m 함수를 사용할 수 있고 각각 doc num2sip, doc num2bip 이라고 하면 해당 함수에 대한 내용을 보실 수 있습니다.

num2sip 함수는 숫자를 metric prefixed string 으로 변경하는 함수인데 ~ 예를 들어 1000 이라는 숫자를 표현할때는 아시다시피 1 kilo 라고 표현하고 아래와 같이 MATLAB 명령창에 타이핑 하면 됩니다.

>> num2sip(1000)

ans =

1 k

>> num2sip(1e6)

ans =

1 M

num2sip 함수에 대한 설명을 보시면 아시겠지만 아래와 같이 4개 까지 인자를 받을 수 있습니다.

str = num2sip(num, sgf, pfx, trz)

num 은 숫자, sgf 는 표현할 숫자의 자리수, pfx 는 단위의 Full name 으로 할지 Symbol 로 할지 trz 는 자리수를 맞추기 위한 0을 넣을지 말지에 대한 결정입니다.

아래와 같은 예로 사용하시면 됩니다.

>> a=128e6

a =

128000000

>> num2sip(a, [], true, true)

ans =

128.00 mega



신호 처리 업무를 하면서 가끔씩은 디지털 필터가 필요한 경우가 있습니다. 저도 최근에 DC 성분을 제거하는 DC 제거 필터가 필요해서 검색을 해보니 아래 주소에서 굉장히 좋은 글을 발견할 수 있었습니다.

DC 제거 필터 관련 읽어볼만한 글

https://www.embedded.com/design/configurable-systems/4007653/DSP-Tricks-DC-Removal

위 링크의 글에서 확인할 수 있는 바와 같이 가장 기본적인 DC 제거 필터의 시간 도메인 수식은 아래와 같습니다.

DC 제거 필터 수식

x[n] - x[n-1] = y[n] – a* y[n-1], a < 0

DC 제거 필터의 zero 가 1 이 됨으로서 DC 에 무한대의 attenuation 을 주게 되고 a 값이 1 에 가까워 질수록 notch 의 기울기가 증가하게 됩니다.

numerator [1 -1], denominator [1 -0.95] 인 경우의 DC 필터에 대해 MATLAB을 사용하여 알아보면~

freqz 명령어를 통해 Frequency response 를 확인할 수 있고 명령어는 아래와 같습니다.

freqz([1 -1], [1 -0.95],512,1000)

zero-pole plot 을 확인하기 위해스는 zplane 명령어를 사용하고 아래와 같이 확인 할 수 있습니다.

zplane([1 -1], [1 -0.95])

Impulse response 에 대해 확인하기 위해서는 impz 함수를 사용하고 아래 예와 같이 사용합니다.

impz([1 -1], [1 -0.95])

디지털 필터 관련 참고 자료들

IIR Filter 관련 읽어볼만한 글

http://www.eas.uccs.edu/~mwickert/ece2610/lecture_notes/ece2610_chap8.pdf

Lecture Notes

http://www.eas.uccs.edu/~mwickert/ece2610/lecture_notes/

DC 필터 이외의 다양한 필터들에 대한 수식들

저주파 통과 필터

y[k] = a*y[k-1]+(1-a)*x[k],  a < 0

고주파 통과 필터

y[k] = -a*y[k-1]+(1-a)*x[k], a < 0

평균 필터

y[k] = [(k-1)/k]*y[k-1]+(1/k)*x[k]

N 이동평균 필터

y[k] = y[k-1] + (x[k]-x[k-N])/N



Simulink 를 사용하다보면 다양한 subsystem 을 사용하게 되고 이에 대해 공부하고 싶다면 메뉴얼 또는 demo 파일들을 확인하는 것이 좋습니다. 이를 위해 MATLAB 에는 명령어를 제공해 주는데 MATLAB command line 에 sl_subsys_semantics 이라고 명령하면 아래와 같은 Subsystem Semantics Simulink 창을 확인 할 수 있습니다. Simulink Library Browser 에서 subsystem 으로 검색을 해서 "Subsystem Examples" 라고 되어 있는 라이브러리를 확인해도 됩니다.

Simulink 에는 아래와 같이 9 개의 subsystem 이 있는 것을 확인 할 수 있고 내역은 아래와 같습니다.

lf and switch-case action subsystems, Triggered subsystems, Resettable subsystems, While subsystems, Function-call subsystems, Enabled with trigger subsystems, Enabled subsystems, For Each subsystems, For subsystems

그 중에 자신이 궁금한 subsystem 을 클릭하고 들어가면 이미 만들어진 다양한 예를 볼 수가 있고 직접 실행시키면서 해당 subsystem 에 대해 이해를 할 수가 있습니다. 아래 그림은 Function-call subsystems 의 다양한 예입니다.

초록색은 정상적인 예이고 빨간색은 잘못 사용된 경우에 대한 예이니 참조하시기 바랍니다. 각 블록을 들어가시면 아래와 같이 구체적인 모델을 확인 할 수 있습니다.



요즘 자동차 분야에서 제어기를 설계할때 MATLAB 의 Simulink 제품을 많이들 사용합니다. 제어기 사양서는 state machine 으로 구성되기 때문에 주로 Stateflow 를 사용하여 설계되고 Embedded Coder 등을 사용하면 시뮬레이션 후에 코드 생성까지 되기 때문에 기존에 시뮬레이션 후 C 코드를 다시 작성하고 하는 번거로움을 줄일 수 있습니다.

저도 회사에서 과제를 하면서 MATLAB 으로 알고리즘 시뮬레이션을 하고 Embedded Coder 를 사용하여 C 코드를 생성해서 사용한 경험이 있고~ 나름 신뢰할만한 코드가 나와서 편리하다는 생각을 많이 합니다.

그래서 일단 오늘은 Simulink 를 시작하는 방법에 대해 소개하려 합니다.

1. Simulink 실행

Simulink 를 사용하기 위해서는 당연히 MATLAB 과 Simulink가 설치되어 있어야 겠고 MATLAB 명령창에서 simulink 라고 명령하면 Simulink Start Page 가 나오게 됩니다. MATLAB 은 대소문자를 구별하므로 소문자로 명령어를 입력하시기 바랍니다. 물론 요즘은 툴이 좋아져서 정정 제안도 해주기 때문에 실수를 해도 별 문제가 없습니다.

위 소개처럼 명령어를 사용하는 방법 말고도 UI 를 클릭해서 실행하는 방법이 있는데 아래 그림과 같이 Simulink 버튼을 클릭해 주면 마찮가지로 Simulink Start Page 가 나오게 됩니다.

2. 어떤 어플을 설계 하느냐에 따라 다양한 방식으로 새 프로젝트를 시작할 수 있는데 저는 그냥 예전 스타일로 보통 Blank Model 로 시작하는 편입니다.

이렇게 Blank Model 을 만들었으면 이제 Simulink Library Browser 를 열어서 각 구성 요소들을 가져다 사용하면 됩니다. Simulink Library Browser 를 열기 위해서는 아래 그림과 같이 View -> Library Browser 를 클릭하거나 Ctrl+Shift+L 단축키를 눌러주거나 또는 MATLAB 명령창에 slLibraryBrowser 라는 명령어를 타이핑 해도 됩니다.

3. Simulink Library Browser 에서 사용하고자 하는 Block 들을 찾아서 배치해야 되는데~ 목록을 하나 하나 클릭하면서 어떤 Block 이 있는지를 확인하고 배치 할 수도 있고 블록의 대략적인 이름을 아는 경우에는 아래와 같이 검색을 통해 블록을 선택할 수도 있습니다.

위와 같이 Simulink Library Browser 에서 검색을 통해 모델을 일일이 찾아서 Drag & Drop 해서 붙이는 경우 노력이 많이 들기 때문에 Simulink 모델링에 익숙하신 분들은~

아래와 같이 model 창에서 블록을 놓고 싶은 위치를 클릭한 후에 블록명을 타이핑 하면 해당 이름의 블록 목록이 나오고

클릭하면 바로 모델창에 해당 블록이 입력 됩니다.

지금까지 수동으로 Simulink 시작하는 방법에 대해 소개를 했는데 ~ MATLAB 제품들은 굉장히 많은 부분들을 자동화 할 수 있는 방법들을 제공해 줍니다. 아래 포스팅에서 소개한 바와 같이 MATLAB 코드를 사용하여 Simulink 모델링을 자동화 할 수 있습니다.

http://iamaman.tistory.com/1482

Simulink 를 조금더 편리하게 사용하기 위해서는 이러한 자동화 방법에 대해 공부를 해 보시는 것도 좋을 것 같네요.



MATLAB 에 경로를 추가하기 위해서는 주로 addpath 함수를 사용하거나 아니면 pathtool 을 사용합니다. pathtool 에서 아래 그림과 같이 하위폴더와 함께 추가하기를 통해 특정 폴더와 그 하위 폴더 모두를 path 로 추가 할 수 있습니다.

그런데 pathtool 이 아닌 명령어를 통해 하위 폴더와 함께 추가하기를 하는 방법도 있습니다.

이런 경우에는 addpath 라는 명령어를 사용하는데 addpath() 함수의 사용방법은 그냥 아래와 같이 해 주시면 되서 사실 설명할게 없습니다.

addpath(‘폴더 경로’)

하위 폴더와 함께 추가하기를 하기 위해서는 당연히 하위 경로를 알아야 하고 ~

특정 폴더에 대한 하위 폴더를 알기 위해서는 genpath 라는 명령어를 사용 할 수 있습니다.

genpath 의 매뉴얼은 아래 주소에서 확인 할 수 있습니다.

https://kr.mathworks.com/help/matlab/ref/genpath.html

아래와 같은 폴더 구조로 된 D:\workspace\2018-10-08 폴더에 대해

genpath 를 해 보면~ 이렇게 해당 폴더 포함 하위 폴더가 세미콜론(;) 으로 구분되어 나오는 것을 알 수 있습니다.

따라서 MATLAB Command Window 에서 하위 폴더를 포함하여 경로를 추가하고 싶은 경우에는 아래와 같이 해 주시면 됩니다.

addpath(genpath(‘최상위 폴더 경로’))



아래 포스팅에서 Simscape 를 사용한 정말 정말 간단한 회로시뮬레이션을 소개를 했었는데~ 아시는 바와 같이 MATLAB 제품은 매우 고가의 툴입니다. 그래서 회로 시뮬레이션을 할 수 있는 오픈소스 또는 프리웨어 툴은 없을까 해서 검색을 해보니 Circuit Simulator 가 검색이 되더군요.

http://iamaman.tistory.com/2619


학부생때 회로이론 등을 공부하면서 PSpice 와 같은 프로그램을 사용했던 기억이 있는데~ PC 를 사용하여 간단한 회로 실험을 해 보고 싶은 분들을 위해 소개해 보려 합니다.

Circuit Simulator 는 웹 기반의 프로그램이고 아래 주소에서 프로그램을 사용할 수 있습니다.

http://www.falstad.com/circuit/

전압 전원, 저항, 인턱터, 캐패시터 등이 추가된 기본 모델이 나오는데 ~

작은 화면이 아니라 Full Screen version 을 보고 싶으면 아래에 있는 링크를 클릭하고 들어가면 됩니다.

http://www.falstad.com/circuit/circuitjs.html

Circuits 메뉴에 보면 다양한 샘플 회로들이 이미 구현되 있어서 처음부터 다 그리지 않아도 되고 ~

Draw 메뉴를 통해 원하는 소자, Wiring 그림을 그릴 수 있습니다. Wire 는 W, 저항은 R, 선택은 Space, capacitor 는 C, inductor 는 L 와 같은 단축키로 쉽게 조작 할 수 있고,

File 메뉴를 통해 Link, Text 의 형태로 export 도 할 수 있습니다. 학생들이 회로이론에 대한 이해를 위해 사용하기에는 매우 훌륭한 툴로 보였습니다.

제가 학부생일때 이런 툴들이 있었으면 회로이론 공부하기 더욱 더 좋았을 텐데 하는 생각이 들었습니다.

브라우저만 있으면 회로 시뮬레이션을 해 볼 수 있기 때문에 필요하신 분들은 적극적으로 활용해 보시기 바랍니다. 간단하게 해 봤지만 참 재밌네요~



회사에서 MATLAB 을 사용하는데 ver 명령어를 통해 어떤 툴박스가 설치되어 있는지 확인해 보니~ Simscape 툴박스가 설치되어 있더군요. Simscape 와 함께 Simscape Electronics, Simscape Power Systems 도 함께 깔려 있던데 저는 정확히 어떤 차이인지는 잘 모르겠더군요.

어쨌든 학부때 회로이론, 전자회로와 같은 과목을 좋아했던 지라 기왕 깔려 있는거 Simscape 를 한번 사용해 보고 싶다는 생각이 들어서 아래 메뉴얼을 조금 들여다 보고 Simscape 블록으로 아주 간단한 RC 회로를 구성해 봤습니다.

https://kr.mathworks.com/help/physmod/simscape/gs/essential-steps-for-constructing-a-physical-model.html

일단 ssc_new 라고 명령하면 Simscape 를 사용하기 위한 기본적인 configuration 이 설정되는 것 같더군요. 아래와 같이 기본적인 블록이 추가된 형태로 model 파일이 열립니다.

그럼 이제 왼쪽에 있는 Simscape Library 중에서 필요한 블록들을 선택해서 model 파일을 구성하면 되겠네요~

위 모델 파일의 블록 중 PS-Simulink Converter, Simulink-PS Converter 블록은 Simulink 의 블록과 Simscape 블록간에 데이터를 전달하기 위한 블록으로 보입니다.

저는 Simscape 초심자라 간단하게 아래와 같이 RC 회로를 구성해 봤습니다.

전류와 전압값 확인을 위해 Current Sensor 는 직렬로 Voltage Sensor 는 병렬로 연결해 줬고~ 데이터를 Scope 에서 확인하기 위해 PS-Simulink Converter 를 통해 Scope 와 연결 했습니다.

Ctrl + S 를 눌러서 model 파일을 저장하고~ 실행을 해 보니 다음과 같이 전류, 전압 값을 확인 할 수 있었습니다.

그냥 간단하게 해 본거긴 하지만 대충 어떻게 사용하는건지에 대한 감은 오네요. 위 Simscape 관련 tutorial 링크를 좀 더 정독하면서 공부를 한번 해 봐야 겠습니다.

혹시 필요하신 분이 있을까봐 위에 구성했던 모델 파일도 올립니다.

simscapetest2.slx



MATLAB 에디터에서 코드를 작성하고 해당 코드에 대해서 문서를 생성할때 MATLAB 에디터의 퍼블리시 기능을 사용하곤 합니다. MATLAB 퍼블리시에서는 코드에 대해서 html, xml, latex, doc, ppt, pdf 등으로 문서를 생성해 줍니다. 퍼블리시 창에서 작업 폴더나 몇몇 옵션 등을 변경해 줄 수 있지만 사용 방법은 그냥 버튼 하나만 누르면 되기 때문에 뭐 그리 설명할게 없을 것 같습니다.

MATLAB Command Window 에서 문서를 생성하기 위해서는 아래와 같이 publish 명령어를 사용하면 됩니다. 첫 번째 인자로 파일명을 넣어 주고 두 번째 인자로 생성 하고자 하는 문서의 형태를 넣어주면 됩니다.

publish(‘publishTest.m’, ’doc’);

그런데 이렇게 간단한 문서 생성 방법도 코드가 잘못된 경우에는 생성이 잘 안 되는 경우가 있습니다.

바로 아래의 코드 예와 같이 루프문 안에 %% 기호로 된 섹션이 있는 경우에는 문서 생성이 굉장히 오래 걸리는 것을 볼 수가 있었습니다. 따라서 문서 생성을 위해서는 코드의 루프문 안에는 %% 기호를 사용해선 안됩니다.

루프 문 안에 있던 %% 섹션 표시를 % 주석으로 처리하고 문서 생성을 하니 정상적인 속도로 문서가 생성 되더군요.

문서 생성 결과를 보면 %% 로 된 섹션 표시는 하나의 챕터를 표시하는 것을 알 수가 있습니다.

For 문 안에 섹션 표시가 있으면 해당 섹션 부분을 문서의 목차에 계속해서 표시하게 될 것이므로 문제가 될 것입니다. 아마도 publish 기능에 루프 문안의 섹션에 대한 예외 처리는 안되어 있는것으로 생각되네요.



예전에는 Visual Studio Express 를 설치해서 MATLAB 에 필요한 C/C++ 컴파일러를 설치 했었지만 최근에는 Mingw 를 설치하면 되더군요.

아래 주소에서 Add-On 을 통해 MinGW-w64 Compiler 설치하는 방법을 소개 했었는데~

http://iamaman.tistory.com/1664

현재 회사 컴퓨터의 MATLAB 라이센스 Software Maintenance 가 유지되고 있지 않아서 Add-On 에서 TDM-GCC 설치를 할수 없게 막아 놨더군요.

아래 주소에서 TDM-GCC 를 설치했고 path 환경변수도 분명 등록을 했는데 MATLAB 에서 mex -setup 이 안 먹어서 어케 하나 하다가~

http://tdm-gcc.tdragon.net/download

아래 주소에서 MATLAB 에 TDM-GCC 를 설치하는 정확한 방법을 찾아서 기록 겸 공유 합니다.

https://stackoverflow.com/questions/39140398/install-mingw-w64-compiler-matlab2013a-or-2016a

1. 위와 같은 방법으로 TDM-GCC 설치후에~

2. 관리자 모드 CMD 에서

setx MW_MINGW64_LOC "C:\TDM-GCC-64" /m

3. MATLAB Command Window 에서

>> setenv('MW_MINGW64_LOC','C:\TDM-GCC-64')

>> mex -setup

MEX이(가) C 언어 컴파일에 'MinGW64 Compiler (C)'을(를) 사용하도록 구성되었습니다.

경고: 2^32-1개의 요소를 초과하는 MATLAB 변수를 지원하기 위해 ...(중략)


% 컴파일러 빌드 확인

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

>> mex yprime.c

'MinGW64 Compiler (C)'(으)로 빌드됩니다.

MEX가 성공적으로 완료되었습니다.

>> yprime(1,1:4)

ans =

2.0000 8.9685 4.0000 -1.0947



많은 공학도 분들이 MATLAB 의 사용법에 대해서 공부하실 거라고 생각합니다. MATLAB 은 아시는 바와 같이 매우 비싼 툴이고 업데이트를 위한 라이센스 유지비용 역시도 1년에 20~30 % 정도를 내는 걸로 알고 있습니다. 저는 학교에서 MATLAB 수업 과목의 조교를 했었고~ 이런 경험을 바탕으로 MATLAB 사용 방법을 소개하기 위해서 본 블로그를 만들었습니다. 개인적으로도 회사에서 MATLAB 을 사용한 업무를 하지만, 일반적으로 학생들이 학교에서 배우는 MATLAB 을 사용한 알고리즘 개발까지는 사실 MATLAB을 사용할 필요가 없다고 생각합니다.

제 블로그에서 소개했었던 Python, Scilab, Octave 를 비롯해서 매틀랩을 대신하여 알고리즘을 개발해 볼 수 있는 오픈소스 또는 프리웨어 소프트웨어들은 정말 많이 있습니다. 그렇다면 매틀랩을 쓸 수 밖에 없는 경우는 무엇이냐라고 한다면 제가 경험한 바로는 C, RTL 등의 코드 생성 분야와 Simulink 나 Stateflow 를 사용한 MBD(Model Based Design) 분야라고 볼 수 있을 것 같습니다. 학교에서는 Python, Octave 를 비롯한 오픈소스 소프트웨어들을 주로 사용하다가 회사에 와서 MATLAB 을 사용해도 늦지 않다고 생각합니다. 또한 MATLAB 만 잘하는 것 보다는 Python 과 같은 언어를 먼저 잘하는게 범용성과 실용주의적인 관점에서 더 낫다고도 생각합니다.

저는 요즘 아래 주소의 인프런(inflearn) 이라는 사이트에서 딥러닝 관련된 강좌를 보고 있는데 최근에 들어가보니 MATLAB 강좌도 있더군요.

https://www.inflearn.com

‘MATLAB으로 시작하는 프로그래밍’ 이라는 강좌이고 MATLAB 을 처음 접하시는 분들에게 유용할 강좌인것 같습니다. 비용도 무료이므로 부담없이 수강하실 수 있을 것 같습니다.

https://www.inflearn.com/course/matlab-%EC%8B%9C%EC%9E%91-programming/

다음으로 아래 주소의 tutorialspoint 사이트에서도 MATLAB 관련 Tutorial 들이 있더군요.

https://www.tutorialspoint.com/matlab/index.htm

영어 자료이긴 하지만 예제들도 굉장히 잘 정리가 되어 있어서 MATLAB 공부하는데 굉장히 좋은 자료로 보입니다. 공부하시는데 참조하시기 바랍니다.



최근에 시간이 조금 있어서 julia 언어를 공부하고 있습니다. Julia 를 공부하면서 드는 생각은 문법적으로 MATLAB 과 Python을 섞어 놓은 거 같다는 것입니다.

아래 포스팅에서 매트랩을 사용한 연립방정식 계산 방식에 대해서 소개 한 적이 있습니다.

http://iamaman.tistory.com/246

오늘은 위 포스팅에서 사용했던 예제에 대해 julia 를 사용하여 똑같이 계산해 보려고 합니다.

줄리아 역시 MATLAB과 마찬가지로 매트릭스 연산이 기본입니다. 인자간의 계산을 하기 위해서는 .(점) 을 붙여야 하는 것이죠.

MATLAB 에서 연립방정식의 해를 구하기 위해 \ 또는 / 를 사용했는데 Julia 에서도 완벽하게 똑같습니다.

위 코드를 실행해 보면 다음과 같은 결과를 확인할 수 있습니다.

Julia 홈페이지의 벤치마크 결과를 보면 MATLAB 이나 Python 보다 속도가 월등히 빠른것을 볼 수가 있는데… 앞으로 계속해서 사용을 해 봐야 될 거 같습니다.

https://julialang.org/

일단 조금만 접해봐도 MATLAB 이나 Python 을 다루어본 사람에게는 그냥 알고 있던 언어 같다는 느낌을 주고 배열 인덱스가 1부터 시작한다는 것과 slicing, for, if 등의 문법, 그리고 수치 연산과 관련된 것들은 MATLAB 과 유사한데 …. filter(), map() 등과 같은 함수나 리스트 내장 등과 같은 것들은 마치 Python 을 다루고 있는 듯한 느낌을 많이 받습니다. 참~~ 재미 있는 언어네요.



  1. 프로그래머 2019.04.14 15:17

    안녕하세요!
    저는 독일 금융회사에서 줄리아 프로그래머로 일하고있어요
    줄리아는 신생언어인제 한국 포스팅을 본 반갑내요!

    종종 좋은 글 돌려주시기 기대합니다 ^^

    • 남성 2019.04.14 15:48 신고

      아 독일금융회사에서는 벌써 줄리아를 도입해서 사용 중이군요~ 줄리아가 신생 언어라 아직 실무에서는 적용이 많이 안 됐을 거라 생각했는데 이렇게 적용이 된다는 걸 보니 반갑네요 ^^ MATLAB 을 주로 사용하는 사람이라 julia 가 참 매력 있는 언어라는 생각이 들더라구요~ 공부 좀 많이 해봐야 겠네요!!

20대 후반에 ‘남성의 MATLAB LOG’ 블로그를 만들었습니까~ 벌써 제 블로그도 8년 이상이 되었습니다.  뭐 특별한 목적이 있었다기보다는 그 당시에 제가 매우 좋아했던 MATLAB 이라는 프로그램의 사용 방법에 대해서  기록하기 위한 용도로 만들었습니다. 그래서 그런지 저는 회사에서도 MATLAB 을 사용한 개발을 많이 해 왔던 것 같습니다.   가장 최근에 다녔던 회사는 자동차 부품 개발 관련 회사 였고 MBD(Model Based Design) 일을 했었습니다. Simulink Stateflow 제품을 많이 사용하였었고  타겟 보드에 올리기 위해서 Embedded Coder 를 사용하여 C 코드 생성을 했었습니다.


언제인지 잘은 모르겠지만 블로그를 운영하면서  수익을 낼 수 있다라는 것을 알게 되었습니다. 좋아하는 것도 기록하고  수익도 낼 수 있으면 좋으니까 저도 애드센스 광고를 달게 되었습니다.


수익을 목적으로 블로그를 운영하는 경우도 많이 있는 것 같은데~ 예전에 제 블로그에도 어떤 분이 블로그를 사겠다고  댓글을 달았던 적이 있습니다. 다른 사람들에게는 어떻게 보일지 모르겠지만 저에게는 무척이나 애착이 가는 블로그라서  당연히 팔지 않았습니다. 블로그가 수익과 연관이 되다 보니 블로그 분석하는 사이트들이 많이 생겨나고 있는 것 같습니다.


오늘 하고 싶은 얘기는 제가 뭐를 하는 사람이냐에 대한 얘기가 아니라 제가 들어가 봤던 블로그 관련사이트들에 대해서  소개하려합니다.


아래 사이트에서는 블로그 운영과 관련하여 많은 고수들의 이야기들을 볼 수가 있습니다. 운영 방법에 대해서 유료 강의도 하는 것 같더군요.

http://www.blogermoney.com/


정말  고수이신분들은 수익 공개도 하시는데 정말 후덜덜한 수익을 내는 분들이  많이 계시더군요. 아래 주소에서 수익공개 하시는 분들을 보면 50대 이상의 어르신분들도 계신 것 같더군요. 블로그 운영 열심히 해봐야 되겠다는 자극이 되는 것 같습니다.


http://www.blogermoney.com/community/community_list.asp?code=BD10

어쨌든 블로거머니에서는 블로그와 관련된 질문도  할 수 있고 자신의 블로그를 소개 할 수도 있고  수익 인증도 할 수 있습니다.


다음으로  아래의 블로그차트라는 홈페이지에서는  블로그 지수를 확인할 수가 있습니다. 어떤 기준으로 블로그 지수가 매겨지는지는 모르겠지만 방문자가 많은 블로거들은 어떻게 생겼는지 확인을 해 볼 수가 있습니다.  고수의 블로그들을 들어가면서 해당 블로그를 벤치마킹 해 보는 것도 블로그 운영하는데 도움이 될 거라고 생각됩니다.


http://www.blogchart.co.kr

블로그차트 홈페이지에 가입을 하고 블로그 인증을 한 후에, ‘내블로그 분석’  탭에 들어가 보면 자신의 블로그 순위를 확인할 수 있습니다. 제 블로그는 97548 위 네요. ㅋㅋㅋㅋㅋ 그냥 까마득하네요.


역시나 개발 관련된 글들을 주로 쓰다 보니 유효키워드가 거의 없네요. 유효 키워드가 뭔지는 정확하게 모르겠지만 그냥 돈이 되는 키워드가 아닐까요?


아무튼 블로그를 운영하면서  위와 같은 사이트에서 다른 사람들은 어떻게 블로그 운영을 하는지 구경하는 것도 재미있는 거 같습니다.



인간은 도구를 사용하는 존재이고  적재적소에 적절한 도구를 사용하는  것이야말로 현대 사회를  살아감에 있어서 큰 경쟁력이 될 것입니다. 요즘 사람들은 굉장히 다양한 소프트웨어들을 사용하고 있습니다.  이런 소프트웨어들 중에는  상용 소프트웨어도 있고 오픈소스 또는 프리웨어 소프트웨어도 있습니다.

그런데 많은 사람들이 어떤 소프트웨어가 있는지를 모르다보니 기존에 알고 있는 상용 소프트웨어를 불법으로 사용하는 경우가 굉장히 많이 있는 거 같습니다. 그래서 오늘은 상용 소프트웨어에 대하여 대체가능한 오픈소스  또는  프리웨어 소프트웨어를 찾는 방법에 대해서 소개해 보려 합니다.

비슷한 기능을 하는 소프트웨어를 추천해주는 사이트로 alternativeTo 라는 사이트가 있습니다.  해당 사이트의 주소는 아래와 같습니다.

https://alternativeto.net

alternative 는 “대안, 선택 가능한 것” 이라는 뜻입니다. 사용하는 소프트웨어에 대하여 대안이 될 수 있는 소프트웨어를 추천해 주는 사이트입니다.

사용방법은 너무나 간단합니다.  아래의 포스팅에서도 소개한 바와 같이 저는 복사 붙여넣기 프로그램로 ditto 를 사용하고 있습니다. 

http://iamaman.tistory.com/737


alternativeTo 에서 아래와 같이 ditto 라고 검색을 해 보면 해당 프로그램이 나옵니다.  


해당 프로그램을 클릭 하고 들어가 보면 위쪽에는 해당 프로그램의 상용/ 오픈소스/ 프리웨어  여부와 사용가능한 OS 또는  플랫폼이 나오고  아래로 스크롤 해 보면 대체 가능한 소프트웨어들의 목록을 보여 줍니다.

ditto 의 대체 가능한 소프트웨어로 CopyQ, FastKeys, 1clipboard 등이 나오는군요. ditto 는  윈도우  전용 소프트웨어이므로  리눅스 또는 맥을 사용하시는 분들은 CopyQ 라는 소프트웨어를 설치해서 사용하시면 될 것 같습니다.


제 블로그에서 자주 소개하는 프로그램인 MATLAB 의 경우 GNU Octave, R (programming language), Sage, Mathematica, Scilab, SciPy & Numpy, Julia, fxSolver, Maxima, wxMaxima 와 같은 소프트웨어들을 추천해 주는군요.


아무 생각 없이 학교에서 알려준다라는 이유로  불법 소프트웨어를 사용하지 마시고 alternativeTo  와 같은 사이트를 통하여 훌륭한 오픈소스 또는 프리웨어 소프트웨어들을 사용하는 습관을 들여 보시기 바랍니다.


요즘은 굉장히 다양한 오픈소스 프로그램들이 있습니다. 


수치 분석에 주로 MATLAB 을 사용하곤 했지만 요즘은 MATLAB 을 꼭 써야 하는 것들이 아니라면 Python 을 주로 사용하고 있습니다.


회사에서는 차량용 MBD(Model Based Development) 개발을 위해 Simulink 환경에서 Stateflow 툴박스를 주로 활용하는데


모델링의 일부는 Stateflow API 를 사용하여 MATLAB 스크립트를 통해 자동으로 모델을 구성하는 작업을 하곤 합니다.


모델링 구성후에는 당연히 simulation 을 수행하고 simulation 을 마치면 Embedded Coder 를 사용하여 MATLAB 알고리즘/Simulink 모델에 대해 C 코드 생성후 타겟 보드에서 테스트를 진행 합니다.


위와 같은 작업들은 MATLAB/simulink 를 꼭 써야 하는 작업이므로 사용을 하지만, 제어기 로직 설계 하는 것 이외의 다른 분야들에서는 주로 Python 을 사용하고 있습니다.


Python과 같은 프로그램들은 오픈소스 프로그램이라 누구나 사용할 수 있으니 협업시에도 편한것 같네요.


Python 에서도 MATLAB 과 같이 예쁜 그래프들을 표현 할 수 있는데 matplotlib 모듈을 사용하시면 됩니다.


matplotlib 모듈의 홈페이지는 아래와 같습니다. 


https://matplotlib.org/gallery/index.html


위 주소에 들어가 보시면 다양한 그래프 예제들이 있습니다.


하니씩 실행해 보시는것도 재미 있을 겁니다. MATLAB 에 익숙하신 분들은 코드를 이해하는것도 조금더 편할 것 같네요.


matplotlib 는 Anaconda 를 설치하면 기본적으로 설치가 됩니다. 예전에 아래 포스팅에서는 각 모듈들을 하나하나 찾아가며 설치 했었는데


http://iamaman.tistory.com/377


그냥 간편하게 Anaconda 를 설치해서 사용하시는게 정신건강에 이롭더군요.


저도 그래프 하나 그려 봤는데~~ 다음과 같이 코딩을 하면 그래프를 쉽게 그릴수 있습니다.


MATLAB 에서 그래프 그리는것과 유사하죠~ savefig() 함수를 사용하면 아래와 같이 그림으로 저장도 할 수 있습니다. 

matplotlib 의 메뉴얼은 아래 주소에서 확인 할 수 있습니다. 


https://matplotlib.org/tutorials/index.html


아래 포스팅에서 MATLAB, Powershell, Python 에서 Outlook  을 사용하여 자동으로 메일 보내는 방법에 대해 알아봤는데요.




오늘은 Autohotkey 에서 아웃룩을 사용하여 자동으로 메일 보내는 방법에 대해 알아보려 합니다.

코드는 아래와 같습니다.

textBody =

(

안녕하세요. 남성입니다.


메일 보냅니다.

)


tempAttach =C:\Attach.jpg


obj := ComObjCreate("Outlook.Application")

newMail := obj.CreateItem(0)

newMail.Subject := "메일 제목"

newMail.Body := textBody

newMail.To := "받는 사람 메일 주소"


myAttachments := newMail.Attachments

myAttachments.Add(tempAttach)


newMail.Send()

ObjRelease(newMail)

ObjRelease(obj)

위 코드에 대해 간단히 소개하면

tempAttach 에는 첨부파일의 path 를 넣습니다. 다수의 파일을 첨부하고 싶다면 세미콜론(;)으로 구분합니다.

newMail.Subject 에는 메일 제목을 넣고 

newMail.Body 에는 본문의 텍스트를 넣습니다. 보통 본문은 여러 줄로 작성하니 위 예와 같이 textBody 라는 변수를 하나 만들어서 여러 줄로 텍스트를 넣을 수 있습니다.

newMail.To 에는 받는 사람의 주소를 넣습니다. 받는 사람이 여럿일 때는 마찮가지로 세미콜론으로 구분합니다.

추가로 참조를 넣고 싶다면 newMail.Cc 에 참조자의 메일 주소를 넣으면 됩니다.

저는 Autohotkey 를 사용하여 시간이 걸리는 작업을 진행시 작업이 끝났다는걸 알리기 위해 아웃룩 메일을 자동화 하곤 합니다.


Simulink 에서 테스트 진행시 Signal Builder 를 사용하여 test case 를 만들곤 하는데

signal builder 의 출력은 double 값으로 나오기 때문에 해당 출력을 입력으로 사용하는 블록과 데이터 타입을 맞춰주는 과정이 필요 합니다. 

이렇게 데이터 타입을 맞춰주기 위해 Simulink 에서는 Data Type Conversion 블록을 사용하는데 

Signal 이 여러 개가 되는 경우 일일이  Data Type Conversion 블록을 붙여주는 것도 고된 잡업이더군요. 

그래서 여러개의 Data Type Conversion 블록을 자동으로 생성하도록 하는 MATLAB 코드를 만들어 봤습니다.

코드는 다음과 같습니다. 

dataTypeConversionMake  함수를 사용하기 위해 입력 argument 로 signal 의 갯수를 넣어 줍니다.

아래 코드는 8 개의 signal 에 대한 Data Type Conversion  블록을 만드는 명령 입니다. 

 dataTypeConversionMake(8)

위 명령어를 실행하면 다음과 같이 Simulink 모델이 만들어 집니다. 


해당 모델을 열어 보면 8 개의  Data Type Conversion 블록 연결이 있는 걸 볼 수가 있습니다.


+ Recent posts