아래 포스팅에서 MATLAB에서 다각형 그리는 방법에 대해 설명드린적이 있는데요~

 

 

2014/04/09 - [programming language/MATLAB] - MATLAB 원(Circle), 다각형(Polygon) 그리기




오늘은 이렇게 만들어진 다각형 내부의 점들을 찾는 inpolygon() 함수에 대해 설명 드리려 합니다.

 

예를 다음과 같이 사각형을 하나 그려보죠~

 

xv=[-1 1 1 -1]; xv=[xv xv(1)];

yv=[1 1 -1 -1]; yv=[yv yv(1)];

plot(xv,yv), grid on

axis([-2 2 -2 2])

다음으로 정규분포를 갖는 랜덤 한 x, y 값들을 생성합니다. randn 함수에 대해서는 아래 포스팅 참조바랍니다. 



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


x = randn(256,1); y = randn(256,1);

 

(x,y)의 값들중에서 xv, yv 로 구성된 다각형 안에 있는 점들만 추려내기 위해서는 inpolygon함수를 사용합니다.

 

아래와 같이 사용가능합니다.

in = inpolygon(x,y,xv,yv);

 

inpolygon함수의 결과인 in 변수에는 x, y 좌표 중 xv,yv 로 구성된 다각형 내의 값들의 인덱스가 logical 값으로 표현됩니다.

 

MATLAB 에서는 logical 값들은 인덱스로 사용할 수 있으므로 다음과 같이 표현하면~ x, y 좌표 중 xv,yv 로 구성된 다각형 내에 있는 값들만 추릴 수도 있겠죠~

x(in),y(in)

 

반대로 x, y 좌표 중 xv,yv 로 구성된 다각형 내에 없는 값들만 추리기 위해서는 in 값에 ~(NOT) 을 붙여줘서 다음과 같이 할 수 있습니다.



x(~in),y(~in)

 

그럼 이제 위 설명들을 종합해서 x, y 좌표 중 xv,yv 로 구성된 다각형 내의 값과 그렇지 않은 값들로 구분해서 그래프를 그려 볼까요?

코드는 다음과 같습니다.

 

xv=[-1 1 1 -1]; xv=[xv xv(1)];

yv=[1 1 -1 -1]; yv=[yv yv(1)];

 

x = randn(256,1); y = randn(256,1);

 

in = inpolygon(x,y,xv,yv);

 

plot(xv,yv,x(in),y(in),'r+',x(~in),y(~in),'k>'), grid on

axis([-2 2 -2 2])

legend('Polygon','In Polygon', 'Out Polygon' )



  1. artcloud 2014.07.07 12:43 신고

    안녕하세요, 제가 지금 원에 대해서도 저걸 적용해보려고 하는데 원도 저런 방식으로 하면 당연히 될까요?
    원 영역 안에 있는 점들에 대해서만 연산을 적용하고 싶은데, 위 방법이 원에 대해서도 된다면 편할 것 같아서요.
    최종적으로는 부채꼴 면적 안에 들어가는 애들만 하게 하고 싶은데, 일단은 원 영역 전체로 하고 싶습니다.

  2. artcloud 2014.07.07 14:54 신고

    아 해결되었습니다.

  3. 구름 2017.03.28 01:57

    원에대한 적용은 어떤식으로 해야할까요 ㅠ?
    매트랩 왕초보라 전혀 모르겠습니다

    • 남성 2017.03.28 08:27 신고

      아래 글 참조하여 원의 값을 구한다음

      http://iamaman.tistory.com/1235


      inpolygon() 함수에 넣어주면 되겠네요.

    • 구름 2017.03.28 13:43

      코드를 다운받아서 짤수는없ㅇ는상황이라서 어떻게해야하는지 모르겠습니다ㅠㅠ

    • 2017.03.28 16:01

      비밀댓글입니다

    • 남성 2017.03.28 16:18 신고

      위에 댓글 달았듯이 http://iamaman.tistory.com/1235 글 참조하여 원을 그리고
      찾고자 하는 x,y 값을 meshgrid 를 사용하여 구하고
      마지막에 위 포스팅 참조하여 inpolygon() 함수를 적용하고 그래프 그리면 될 겁니다.

MATLAB BER simulation 관련 검색을 하다가 아래 주소의 글을 발견했습니다.

 

http://www.mathworks.com/matlabcentral/fileexchange/22316-communication-systems-reference-curves

 

위 파일에서 설명하는 내용은 아래와 같습니다.

 

- PSK and QAM over AWGN Channel (BER and SER)

- BPSK over Rayleigh fading channel (BER)

- Convolutional Coded BPSK over AWGN (BER)

 

일단 BER 이나 SER 시뮬레이션을 어떻게 해야 할 지 모르는 분들이 보기에 참 좋은 코드라는 생각이 들더군요.

 

위 주소에 들어가서 아래 그림과 같이 Download Submission 버튼을 누르면 파일을 다운로드 할 수 있습니다.

 

위 코드가 실행되기 위해서는 MATLAB 뿐만 아니라 Simulink, Communications Toolbox, Communications Blockset 이 필요 합니다.

 

다운로드 받은 Submit_v2.zip 파일을 압축해제 하고~ RunMe.m 파일을 실행시키면 아래 그림과 같이 웹 화면이 나옵니다.

 

웹 화면에서 뒤로 가기를 누르면 정상적으로 실행 안 되는 경우가 있으므로 이전 페이지의 내용을 다시 돌려 보고 싶다는 분들은 RunMe.m 파일을 다시 실행하고 들어가서 실행시키면 됩니다.

 

다양한 내용들이 있는데~ 저는 그 중에서 Rayleigh Flat Fading Channel Bit Error Rate curves 만 한번 실행해 봤습니다.

 

아래 그림과 같이 Simulink 파일이 실행되면서 시뮬레이션이 진행 됩니다.

 

시뮬레이션이 진행 될 때마다~ 아래 그림과 같이 BER 그래프에 결과가 하나씩 추가되며~

 

맨 마지막에는 다음과 같은 결과를 확인 할 수 있습니다.

 

BER 또는 SER 시뮬레이션을 해 보려고 하시는 엔지니어 분들이나 디지털 통신을 공부하시는 학생 분들에게 대단히 좋은 예가 될 것 같네요~


아래 포스팅에서 BPSK, QPSK BER(Bit error rate) simulation in AWGN channel 에 대해 설명 드렸었는데~

   

2011/03/27 - [programming language/MATLAB] - MATLAB QPSK BER simulation in AWGN channel


2011/03/19 - [programming language/MATLAB] - MATLAB BPSK BER simulation in AWGN channel

 

8 PSK(Phase-shift keying) 시뮬레이션에 대해 질문하신 분이 있어서 답변 드립니다.

 

먼저 제 경험을 말씀 드리면, 8 PSK 나 16 PSK 의 경우 책에서 공부한적은 있지만 실제 통신 시스템에서 사용하는 것을 본적은 없는 것 같습니다. 사용하지 않는 이유에 대해서는 아래 글을 참조해 보시기 바랍니다. 아래 글은 16 QAM 과 16 PSK 의 SER (Symbol Error Rate)성능 비교에 대한 내용인데 16 PSK 가 16 QAM 대비하여 확실히 SER 성능이 안 좋다는 것을 확인 할 수 있습니다.

 

http://www.dsplog.com/2008/03/29/comparing-16psk-vs-16qam-for-symbol-error-rate/

 

일단 QPSK, BPSK 의 경우 각 constellation 지점들이 90 도 또는 180 도 위상차이를 보이기 때문에 심볼에 대해 위상을 구할 필요가 없이 BPSK 의 경우 간단하게 x=0 지점을, QPSK 의 경우 x=0, y=0 지점을 기준으로 심볼 demapping 을 할 수 있었습니다.

 

하지만 8 PSK 의 constellation 은 아래 그림과 같이 8개 지점(45도 간격)으로 구성되어 있습니다. 이런 경우에는 당연히 45/2 = 22.5 도 간격으로 symbol demapping 을 해야 하므로 수신 심볼의 위상을 구해야 할 것입니다.

 

이미지 출처 : http://commons.wikimedia.org/wiki/File:8PSK_Gray_Coded.svg

 

PSK 시뮬레이션을 위해서는 PSK 의 Gray code 에 대해 공부를 하셔야 하고~ 아래 주소에 굉장히 좋은 설명이 있더군요. MATLAB/OCTAVE 코드도 있으니 실습해 보시면서 천천히 공부해 보시기 바랍니다.

 

http://www.dsplog.com/2008/05/12/gray-code-to-binary-conversion-for-psk-pam/

 

http://www.dsplog.com/2008/05/11/binary-to-gray-code-conversion-psk-pam/

 

다음으로 질문하신 8 PSK BER 시뮬레이션에 대해 소개하겠습니다.

 

아래 주소에 16 PSK BER 시뮬레이션에 대해 소개하는데~

 

http://www.dsplog.com/2008/05/18/bit-error-rate-for-16psk-modulation-using-gray-mapping/

 

코드는 아래 주소에서 다운로드 받을 수 있습니다.

 

http://www.dsplog.com/db-install/wp-content/uploads/2008/05/script_16psk_gray_mapping_bit_error_rate.m

 

위 코드를 실행해보면~ 16 PSK 뿐만 아니라 8 PSK, QPSK도 시뮬레이션 해 볼 수 있습니다.

 

위 주소에서 설명한 16 PSK 부터 시뮬레이션을 해보죠~ 아래 코드의 모든 권리는 http://www.dsplog.com 사이트의 Krishna Pillai 에게 있습니다. 재 배포를 하실 경우 원저자를 명시 하시기 바랍니다.

 

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% All rights reserved by Krishna Pillai, http://www.dsplog.com

% The file may not be re-distributed without explicit authorization

% from Krishna Pillai.

% Checked for proper operation with Octave Version 3.0.0

% Author    : Krishna Pillai

% Email        : krishna@dsplog.com

% Version    : 1.0

% Date        : 17 May 2008

% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

 

% Bit Error Rate for 16-PSK modulation using Gray modulation mapping

 

clear

N = 10^5; % number of symbols

M = 16; % constellation size

k = log2(M); % bits per symbol

 

 

thetaMpsk = [0:M-1]*2*pi/M; % reference phase values

 

Eb_N0_dB = [0:25]; % multiple Es/N0 values

Es_N0_dB = Eb_N0_dB + 10*log10(k);

 

% Mapping for binary <--> Gray code conversion

ref = [0:M-1];

map = bitxor(ref,floor(ref/2));

[tt ind] = sort(map);

 

ipPhaseHat = zeros(1,N);

for ii = 1:length(Eb_N0_dB)

 

% symbol generation

% ------------------

ipBit = rand(1,N*k,1)>0.5; % random 1's and 0's

bin2DecMatrix = ones(N,1)*(2.^[(k-1):-1:0]) ; % conversion from binary to decimal

ipBitReshape = reshape(ipBit,k,N).'; % grouping to N symbols having k bits each

ipGray = [sum(ipBitReshape.*bin2DecMatrix,2)].'; % decimal to binary

 

% Gray coded constellation mapping

ipDec = ind(ipGray+1)-1; % bit group to constellation point

ipPhase = ipDec*2*pi/M; % conversion to phase

ip = exp(j*ipPhase); % modulation

s = ip;

 

% noise

% -----

n = 1/sqrt(2)*[randn(1,N) + j*randn(1,N)]; % white guassian noise, 0dB variance

 

y = s + 10^(-Es_N0_dB(ii)/20)*n; % additive white gaussian noise

 

% demodulation

% ------------

% finding the phase from [-pi to +pi]

opPhase = angle(y);

% unwrapping the phase i.e. phase less than 0 are

% added 2pi

opPhase(find(opPhase<0)) = opPhase(find(opPhase<0)) + 2*pi;

 

% rounding the received phase to the closest constellation

ipPhaseHat = 2*pi/M*round(opPhase/(2*pi/M))    ;

% as there is phase ambiguity for phase = 0 and 2*pi,

% changing all phases reported as 2*pi to 0.

% this is to enable comparison with the transmitted phase

ipPhaseHat(find(ipPhaseHat==2*pi)) = 0;

ipDecHat = round(ipPhaseHat*M/(2*pi));

 

% Decimal to Gray code conversion

ipGrayHat = map(ipDecHat+1); % converting to decimal

ipBinHat = dec2bin(ipGrayHat,k) ; % decimal to binary

 

% converting binary string to number

ipBinHat = ipBinHat.';

ipBinHat = ipBinHat(1:end).';

ipBinHat = str2num(ipBinHat).' ;

 

% counting errors

nBitErr(ii) = size(find([ipBit- ipBinHat]),2); % couting the number of errors

 

end

simBer = nBitErr/(N*k);

theoryBer = (1/k)*erfc(sqrt(k*10.^(Eb_N0_dB/10))*sin(pi/M)); % PSK 의 이론적 BER

 

close all; figure

semilogy(Eb_N0_dB,theoryBer,'bs-','LineWidth',2);

hold on

semilogy(Eb_N0_dB,simBer,'mx-','LineWidth',2);

axis([0 20 10^-5 1])

grid on

legend('theory', 'simulation');

xlabel('Eb/No, dB')

ylabel('Bit Error Rate')

title('Bit error probability curve for 16-PSK modulation')

 

위 코드를 돌려보면~ 아래 그림과 같이 16 PSK 결과가 나옵니다. 아래 BER 그래프에서 16 dB 이상에서 이론 값과 약간 달라 보이는 것은 시뮬레이션 횟수가 부족해서 BER 이 0 으로 나오는 경우가 생겨서 그런 것입니다. 고 dB 에서도 이론값과 같은 결과를 보이고 싶다면 심볼수인 N = 10^5 값을 좀더 늘려 보시기 바랍니다. 

 

위 코드를 약간 수정해서~질문하신 8 PSK 시뮬레이션을 해보죠~ 위 코드에서 빨간색 표시한 부분들만 아래와 같이 변경합니다.

 

M = 8; % constellation size

Eb_N0_dB = [0:15]; % multiple Es/N0 values

axis([0 15 10^-5 1])

title('Bit error probability curve for 8-PSK modulation')

 

시뮬레이션을 해보시면~ 다음과 같이 8 PSK 결과를 확인 할 수 있습니다.

 

다음과 같이 변경하면 QPSK 시뮬레이션이 되는거죠~

 

M = 4; % constellation size

Eb_N0_dB = [0:10]; % multiple Es/N0 values

axis([0 10 10^-5 1])

title('Bit error probability curve for QPSK modulation')

 


  1. 2014.04.17 15:33

    비밀댓글입니다

    • 남성 2014.04.17 18:23 신고

      네~ 방문해 주셔서 감사합니다. ^^ 열공하세요~

  2. 곰비 2014.05.12 00:34

    QPSK의 BER이론치를 구하는 공식을 알수잇을까요.??ㅠㅠㅠ

    • 남성 2014.05.12 08:02 신고

      PSK 의 이론적 BER 이라고 되 있는 부분의 코드를 보시면 수식을 아실 수 있을 겁니다.

  3. yj 2017.09.25 20:31

    BPSK는 해당 이론식에 적용되지 않는건가요?

    • 남성 2017.09.26 04:21 신고

      아니요 위 포스팅에서는 그냥 시뮬레이션 안 한 것뿐입니다. 똑같이 적용 됩니다

  4. 궁금해 2018.11.10 00:54

    이론값과 실제값이 차이나는게 심볼 수 때문이라고 하는데 왜 그런 차이가 나는건가요??
    오차가 생기는 원인이 궁금합니다ㅠㅠ

    • 남성 2018.11.10 21:43 신고

      확률적인 시뮬레이션이니까 시뮬레이션 샘플수가 많을수록 이론적인 값과 근사하게 되겠죠.

오늘은 간단하게 MATLAB 을 사용하여 원을 그리는 방법에 대해 소개하려 합니다.

 

아래 포스팅에서도 소개한 적이 있지만~ 아래 포스팅에서는 ezplot 를 사용하여 그래프를 그렸었는데~


2011/03/13 - [programming language/MATLAB] - MATLAB ezplot() 함수로 그래프를 쉽게 그리자

 

오늘은 수치적인 방법으로 그래프를 그려 보도록 하죠~

 

원이나 다각형 그래프들은 단순한 그래프라 조그만 생각해 보고 코딩하면 되겠지만

 

MATLAB File Exchange 에 보니 괜찮은 코드가 있어서 소개 하려 합니다.

 

http://www.mathworks.com/matlabcentral/fileexchange/2876-draw-a-circle

 

위 주소에서 아래 그림과 같이 코드를 다운로드 받습니다.

 

다운로드 받은 circle.zip 파일을 풀어보면~ circle.m 파일이 있는데요~

 

circle.m 파일은 함수 입니다. 함수 원형은 다음과 같더군요.

 

H=CIRCLE(CENTER,RADIUS,NOP,STYLE)

 

위 함수에서 CENTER 는 원의 중심을 의미하고, RADIUS 는 반지름, NOP 는 Number of Point 를 원을 그리고자 하는 점의 개수, STYLE 은 그릴 선의 스타일을 말합니다.

 

위 함수에서 저는 좀더 그래프가 정확하게 보이게 하기 위해 맨 뒤에 다음과 같은 코드 한 줄을 추가해서 사용합니다.

 

function H=circle(center,radius,NOP,style)

%---------------------------------------------------------------------------------------------

% H=CIRCLE(CENTER,RADIUS,NOP,STYLE)

% This routine draws a circle with center defined as

% a vector CENTER, radius as a scaler RADIS. NOP is

% the number of points on the circle. As to STYLE,

% use it the same way as you use the rountine PLOT.

% Since the handle of the object is returned, you

% use routine SET to get the best result.

%

% Usage Examples,

%

% circle([1,3],3,1000,':');

 

% circle([2,4],2,1000,'--');

%

% Zhenhai Wang <zhenhai@ieee.org>

% Version 1.00

% December, 2002

%---------------------------------------------------------------------------------------------

 

if (nargin <3),

error('Please see help for INPUT DATA.');

elseif (nargin==3)

style='b-';

end;

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

axis square;

axis equal; 

다운로드 받은 Circle() 함수를 사용하여 간단하게 원을 한번 그려 볼까요?

 

중점이 10,5 지점에 반지름 3,2,1 인 원 세 개를 그리는 예제 입니다.

 

circle([10,5],3,1000,'r');

hold on

circle([10,5],2,1000,'b--');

hold on

circle([10,5],1,1000,'g:');

 

다음과 같이 그래프가 나오죠.

 

 

circle.m파일을 열어서 코드를 확인해 보시면~ circle() 함수를 사용하면 정다각형도 그릴 수 있다는 것을 알 수 있을 겁니다.

 

간단하게 삼각형, 오각형, 팔각형 하나씩 그려보죠~

 

circle([10,5],3,4,'r');

hold on

circle([10,5],2,6,'b--');

hold on

circle([10,5],1,9,'g:');

 

위 코드를 보시면 유추해 볼 수 있겠지만~

 

그리고자 하는 다각형의 꼭지점의 수보다 1 만큼 크게 NOP 값을 설정해 주면 됩니다. 그래서 삼각형을 그릴 때 4 라는 수를 설정해 준겁니다.

 

위 코드를 돌려 보면 다음과 같이 삼각형, 오각형, 팔각형 그래프가 나옵니다.

 

결과적으로 Circle 함수를 사용하여 원을 그리는 것은 정다각형의 꼭지점의 개수(NOP)를 상대적으로 크게 늘려서 그리는 것이라는 것을 확인 할 수 있습니다.

 

다각형(polygon) 에 대한 정의는 아래 주소 참조바랍니다.

 

http://terms.naver.com/entry.nhn?docId=1078892&cid=40942&categoryId=32224



  1. 2016.04.15 11:19

    비밀댓글입니다

    • 남성 2016.04.15 12:04 신고

      다운로드 받은 Circle 함수를 사용하는거죠. Circle 함수 내에 써주는게 아닙니다. Circle 함수를 다운로드 받고 압축을 해제한 후에 MATLAB workspace 를 Circle 파일을 들어 있는 함수로 이동 한 다음에 위 코드를 실행해 보세요.

    • 2016.04.21 13:38

      circle 파일을 들어있는 함수로 이동한 다음에 실행을 어떻게 하는거죠...?

      circle.m이라는 파일이 projects1 라는 폴더에 있어요!

    • 남성 2016.04.21 13:41 신고

      해당폴더로 이동후에 위에적은 코드를실행하는거죠. 함수 실행 방법에 대해 공부를 해야 할 것 같네요

    • 2016.04.21 16:05

      비밀댓글입니다

    • 남성 2016.04.21 16:53 신고

      네 다행이네요.

  2. 2016.05.11 09:45

    비밀댓글입니다

    • 2016.05.11 09:46

      비밀댓글입니다

    • 남성 2016.05.11 12:07 신고

      네 맞습니다. 꼭지점이 많으니까 원처럼 보이는거죠. 원이란게 사실 꼭지점이 무한대인 다각형이라고 생각할 수도 있는거니까요.

  3. 2016.10.10 23:41

    비밀댓글입니다

    • 남성 2016.10.11 23:25 신고

      사각형이 원이 디면 inpoligon 이 유지는 안 될것 같은데요.

전자과에서 수학을 접하다 보면 sinc 함수를 접하게 됩니다. 특히 신호처리 과목을 듣는 사람들이라면 거의 백퍼 접하게 되는게 sinc 함수 입니다.

 

Sinc 함수는 아래 주소에 설명이 잘 나와있습니다.

 

http://ko.wikipedia.org/wiki/%EC%8B%B1%ED%81%AC%ED%95%A8%EC%88%98

 

sinc 함수를 푸리에 변환하면 직사각형 함수(Rectangular Function)가 되게 되고~ 처음 이 사실을 알고 참~ 신기하다는 생각을 한적이 있습니다.

 

오늘은 위에 설명한 사실을 MATLAB 을 사용하여 확인 해 보려 합니다.

 


MATLAB 에서 sinc 함수는 Signal Processing Toolbox에 들어있습니다. Signal Processing Toolbox가 없는 분들은 간단한 함수이니 위 수식대로 만들어서 사용해도 될 겁니다.

 

다만 x=0 인 경우 분모도 0 이 되므로 이 부분만 주의해서 사용하시면 됩니다.

 

따라서 다음과 같이 작성 할 수 있습니다. 함수명은 기존 sinc 함수와의 충돌을 방지하기 위해 sinc_ 로 했습니다.


function y=sinc_(x)

i=find(x==0);

x(i)= nan;

y = sin(pi*x)./(pi*x);

y(i) = 1;

 

간단하게 x=0 인 경우만 아래 포스팅에서 배웠던 NaN(Not-a-Number)을 넣어줬다가 그 값만 1 로 바꿔주는 거죠. Nan 이 아니라 아무 값이나 넣고 싶은 값을 넣어도 결과는 같고~ 그냥 x(i)= nan; 을 없애도 상관 없습니다. 


2011/04/20 - [programming language/MATLAB] - MATLAB NaN

 

그럼 sinc 함수를 그려보죠~ 


x=-6:0.1:6;

y=sinc_(x);

 

figure,

plot(x,y), grid on

 

 

 

다음으로 위에서 얘기했던 sinc() 함수의 푸리에 변환이 구형함수가 되는지 확인해 보죠~ 구형 함수를 나타내기 위해 좀 긴~~ sinc 함수의 x 축을 좀 길게 잡습니다.  


x=-80000*pi:0.1:8000*pi;

y=sinc_(x);

ffty=fft(y);

 

fftShifted=fftshift(ffty);

plot(abs(fftShifted)), grid on

 

다음과 같이 sinc 함수의 푸리에 트랜스폼 결과가 직사각파가 되는 것을 확인 할 수 있습니다. Sinc 함수 … 참~~ 신기하죠?? 나만 신기한가…



오늘은 MATLAB 을 이용한 16 QAM BER Simulation코드에 대해 소개해 보려 합니다.

 

예전에 제가 작성했던 코드들도 있지만~

 

아래 주소를 보니 16 QAM 의 Gray coding 부터 이론적인 BER 성능 까지 자세히 설명되어 있더군요.

   

http://www.dsplog.com/2008/06/05/16qam-bit-error-gray-mapping/

   

코드는 위 블로그의 약간 아래 쪽을 보시면~ 링크가 되어 있습니다.

 

못찾으실 분들을 위해 링크를 걸죠, 아래 주소를 오른쪽 클릭한 후에 파일로 다운로드 받거나 그냥 클릭하고 들어가서 전체 선택후에 m 파일에 붙여넣기 해도 됩니다.

 

http://www.dsplog.com/db-install/wp-content/uploads/2008/06/script_16qam_gray_mapping_bit_error_rate.m

 

혹시 못 찾으실 분들을 위해 코드도 넣습니다. 다시 한번 밝히지만 아래 코드는 Krishna Pillai, http://www.dsplog.com 님이 작성하신 겁니다.

 

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% All rights reserved by Krishna Pillai, http://www.dsplog.com

% The file may not be re-distributed without explicit authorization

% from Krishna Pillai.

% Checked for proper operation with Octave Version 3.0.0

% Author    : Krishna Pillai

% Email        : krishna@dsplog.com

% Version    : 1.0

% Date        : 05 June 2008

% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

 

% Bit Error Rate for 16-QAM modulation using Gray modulation mapping

 

clear

N = 10^5; % number of symbols

M = 16; % constellation size

k = log2(M); % bits per symbol

 

% defining the real and imaginary PAM constellation

% for 16-QAM

alphaRe = [-(2*sqrt(M)/2-1):2:-1 1:2:2*sqrt(M)/2-1];

alphaIm = [-(2*sqrt(M)/2-1):2:-1 1:2:2*sqrt(M)/2-1];

k_16QAM = 1/sqrt(10);

 

Eb_N0_dB = [0:15]; % multiple Es/N0 values

Es_N0_dB = Eb_N0_dB + 10*log10(k);

 

% Mapping for binary <--> Gray code conversion

ref = [0:k-1];

map = bitxor(ref,floor(ref/2));

[tt ind] = sort(map);

 

for ii = 1:length(Eb_N0_dB)

 

% symbol generation

% ------------------

ipBit = rand(1,N*k,1)>0.5; % random 1's and 0's

ipBitReshape = reshape(ipBit,k,N).';

bin2DecMatrix = ones(N,1)*(2.^[(k/2-1):-1:0]) ; % conversion from binary to decimal

% real

ipBitRe = ipBitReshape(:,[1:k/2]);

ipDecRe = sum(ipBitRe.*bin2DecMatrix,2);

ipGrayDecRe = bitxor(ipDecRe,floor(ipDecRe/2));

% imaginary

ipBitIm = ipBitReshape(:,[k/2+1:k]);

ipDecIm = sum(ipBitIm.*bin2DecMatrix,2);

ipGrayDecIm = bitxor(ipDecIm,floor(ipDecIm/2));

% mapping the Gray coded symbols into constellation

modRe = alphaRe(ipGrayDecRe+1);

modIm = alphaIm(ipGrayDecIm+1);

% complex constellation

mod = modRe + j*modIm;

s = k_16QAM*mod; % normalization of transmit power to one

 

% noise

% -----

n = 1/sqrt(2)*[randn(1,N) + j*randn(1,N)]; % white guassian noise, 0dB variance

 

y = s + 10^(-Es_N0_dB(ii)/20)*n; % additive white gaussian noise

 

% demodulation

% ------------

y_re = real(y)/k_16QAM; % real part

y_im = imag(y)/k_16QAM; % imaginary part

 

% rounding to the nearest alphabet

ipHatRe = 2*floor(y_re/2)+1;

ipHatRe(find(ipHatRe>max(alphaRe))) = max(alphaRe);

ipHatRe(find(ipHatRe<min(alphaRe))) = min(alphaRe);

ipHatIm = 2*floor(y_im/2)+1;

ipHatIm(find(ipHatIm>max(alphaIm))) = max(alphaIm);

ipHatIm(find(ipHatIm<min(alphaIm))) = min(alphaIm);

 

% Constellation to Decimal conversion

ipDecHatRe = ind(floor((ipHatRe+4)/2+1))-1; % LUT based

ipDecHatIm = ind(floor((ipHatIm+4)/2+1))-1; % LUT based

 

% converting to binary string

ipBinHatRe = dec2bin(ipDecHatRe,k/2);

ipBinHatIm = dec2bin(ipDecHatIm,k/2);

 

% converting binary string to number

ipBinHatRe = ipBinHatRe.';

ipBinHatRe = ipBinHatRe(1:end).';

ipBinHatRe = reshape(str2num(ipBinHatRe).',k/2,N).' ;

 

ipBinHatIm = ipBinHatIm.';

ipBinHatIm = ipBinHatIm(1:end).';

ipBinHatIm = reshape(str2num(ipBinHatIm).',k/2,N).' ;

 

% counting errors for real and imaginary

nBitErr(ii) = size(find([ipBitRe- ipBinHatRe]),1) + size(find([ipBitIm - ipBinHatIm]),1) ;

 

end

simBer = nBitErr/(N*k);

theoryBer = (1/k)*3/2*erfc(sqrt(k*0.1*(10.^(Eb_N0_dB/10))));

 

close all; figure

semilogy(Eb_N0_dB,theoryBer,'bs-','LineWidth',2);

hold on

semilogy(Eb_N0_dB,simBer,'mx-','LineWidth',2);

axis([0 15 10^-5 1])

grid on

legend('theory', 'simulation');

xlabel('Eb/No, dB')

ylabel('Bit Error Rate')

title('Bit error probability curve for 16-QAM modulation')

 

실행 시키고 조금만 기다려 보면~~ Krishna Pillai의 블로그에 있는것과 같이 다음과 같은 시뮬레이션 결과를 확인 할 수 있습니다.

 

 

위 코드를 배포 하실 때는 원저자를 명시하셔야 합니다.


  1. 홍팡 2015.07.31 17:20

    안녕하세요
    매틀랩 공부를 하다가 우연히 들어오게 되었습니다!
    혹시 64QAM도 시뮬레이션 돌리려면 어디어디 수정해야하는지 알수있을까요?ㅜ

    • 남성 2015.08.01 13:45 신고

      간단하게 말씀 드리면 mapping 과 demapping 부분 그리고 파워 계산 부분이 바뀌어야하는데 위 코드에서 바꾸려면 대부분 다 바뀌어야 할 것 같네요.

  2. 홍팡 2015.08.03 15:49

    죄송합니다만 조금만 더 알려주실 수 있을까요??
    16QAM 에 대해 도움을 많이 얻어서 감사합니다

    • 남성 2015.08.03 19:39 신고

      for 문 내의 시뮬레이션 과정은 반복적으로 비트를 생성해서 16qam 으로 변조하고 잡음을 넣어주고 복조하는 과정인데 결국에는 이 내부가 대부분 바뀌어야 할거라는 말씀 입니다.

      아래 주소의 글을 보시면 constellation 을 확인 할 수 있는데 64 qam constellation 대로 비트를 심볼로 맵핑하고 수신단에서는 심볼을 다시 비트로 demapping 하는 과정이 필요 할 겁니다.

      http://iamaman.tistory.com/205

      이 과정을 생각하면 위 코드의 많은 부분이 바뀌게 되어 어디 한군데만 바뀌면 된다라고 하기가 힘들것 같습니다.

    • 홍팡 2015.08.04 16:04

      그렇군요.. 감사합니다.

      마지막으로 죄송합니다만 혹시 64QAM 코드도 가지고 계시다면
      공유 부탁드려도 될까요?? 제 비루한 코딩실력으로 변경하기가 쉽지가 않아서요.
      감사합니다.

    • 남성 2015.08.04 19:56 신고

      아래 주소에 포스팅 했습니다.

      http://iamaman.tistory.com/1631

      자주 방문해 주세요. ^^

  3. 홍팡 2015.08.09 16:50

    아 정말 감사합니다 많은 도움이 되었습니다!

수학 관련 알고리즘을 하다 보면 행렬의 값 대부분이 0으로 채워진 행렬을 다뤄야 하는 경우가 종종 있다. 이런 행렬을 sparse matrix 라 하고 한글로는 희소 행렬이라 한다.

 

이런 경우 0 으로 채워진 부분까지 행렬로 표현하는 방법은 메모리의 낭비이다.

 

희소 행렬에 대한 설명은 아래 주소에 잘 나와 있다.

 

http://ko.wikipedia.org/wiki/%ED%9D%AC%EC%86%8C%ED%96%89%EB%A0%AC

 

오늘은 MATLAB 에서 sparse matrix를 다루는 방법에 대해 간단히 알아보려 한다.

 

우리가 알고 있는 대표적인 희소 행렬은 Identity matrix 일 것이다.

 

다음과 같이 Identity matrix 하나를 생성해 보자.

 

x=eye(100);

 

위와 같이 명령하면 100 × 100 열의 Identity matrix 가 만들어 진다.

 

다음으로 위에서 만들어진 x 를 sparse matrix로 만들어보자.

 

xsparse=sparse(x)

 

이제 메모리가 얼마나 줄었는지 확인해보자.

 

MATLAB command windows 에 whos 라는 명령어를 내리면 다음과 같이 현재 workspace의 변수 내역을 볼 수 있다.

 

 

sparse matrix로 만들면서 80000 바이트의 변수 x 가 2408 바이트의 변수 xsparse 로 바뀌는 것을 확인 할 수있다.

 

다음으로 sparse matrix를 일반적인 매트릭스로 만드는 방법은 full() 이라는 함수를 사용하면 된다.

 

 

다음과 같이 xfull 은 다시 x 와 같이 일반적인 매트릭스가 되었음을 알 수 있다.


아래 포스팅에서 MATLAB 을 이용한 만델브로 그래프를 그리는 코드를 소개 드린적이 있는데요


2012/05/25 - [programming language/MATLAB] - MATLAB Fractal, Mandelbrot (만델브로) 집합의 아름다움.....


MATLAB File Exchange 에는 훨씬더 다양한 내용들이 소개 되더군요.

 

그 중에 오늘은 Jurassic Park Fractal 라고 불리우는 Dragon Curve 를 그리는 MATLAB 코드가 있어서 소개 드리려 합니다.

 

코드는 아래 주소에서 다운로드 할 수 있습니다.

 

http://www.mathworks.com/matlabcentral/fileexchange/11069-dragon-curve-aka-jurassic-park-fractal

 

아래 그림과 같이 Download Submission 을 클릭해서 다운로드 후에 ~ DragonCurve.zip 파일의 압축을 풉니다.

 

MATLAB command 창에서 dragon_curve.m 파일을 실행 시킵니다.

 

dragon_curve.m 파일을 열어서~ 아래 그림과 같이 angle, n, MAX_LENGTH 값을 적절히 조절하고~

 

파일을 실행 시켜보면~ 요렇게 예쁜~ Dragon Curve를 그려보실 수 있습니다.

 

아래 포스팅에서 MATLAB Game Stellaria 에 대해 소개해 드린 적이 있는데요~

  

2014/01/12 - [programming language/MATLAB] - MATLAB Game Stellaria


오늘은 MATLAB Tetris 에 대해 소개해 드리려 합니다.

 

먼저 아래 주소의 포스팅을 보니 MATLAB 자체적으로도 Tetris 가 있더군요.

 

http://lstudio.egloos.com/viewer/2262652

 

위 포스팅의 설명대로 sim('sf_tetris2') 라는 명령을 Command Window 에 치면 아래 그림과 같이 Tetris가 실행 됩니다.

 

sim 명령을 사용하는 것을 보면 아시겠지만, MATLAB Tetris는 시뮬링크로 구성되어 있으며, 아래 명령을 통해 모델을 열어 보니 몇몇 상수값들과 Uniform Random Number 블록,  Stateflow 블록으로 구성되어 있는 듯 하더군요.

 

open('sf_tetris2')

 

즉 위에서 설명한 Tetris 는 Simulink가 없는 분들은 즐길 수가 없다는거죠~ 물론 MATLAB 으로 테트리스를 하고자 하는 사람들은 그리 많지 않겠지만….

 

암튼 그래서 MATLAB에서 돌아가는 Tetris를 찾아보니 역시나 있더군요.

 

http://www.mathworks.com/matlabcentral/fileexchange/34513-matlabtetris

 

아래 그림과 같이 Download Submission 버튼을 클릭해서 다운로드 받을 수 있습니다. Matt Fig 라는 분이 작성했더군요. 

 

matlabtetris.zip 파일을 다운로드 받아서 압축해제 한 후에 matlabtetris.m 파일을 실행 시키면 됩니다.

 

아래 그림과 같이 실행이 되고~ Start 버튼을 누르면 게임이 시작합니다. 일반적으로 테트리스 게임하듯이 화살표 버튼을 이용해서 블록들을 조작 할 수 있습니다.

 

위에서 설명한 Tetris 이외에도~ 두 개의 Tetris 가 더 있었습니다. 아래 소개하는 두 개 모두 위에서 설명한 matlabtetris 에 영향을 받았다 하는군요.

 

첫 번째로 tetris-for-dummies 입니다. 아래 주소에서 다운로드 하시면 되구~ 압축해제후에 play2.m 파일을 실행하시면 됩니다.

 

http://www.mathworks.com/matlabcentral/fileexchange/21246-tetris-for-dummies

 

 

조작 방법은 화살표가 아니라 아래 그림과 같더군요. QESW 키를 사용하여 조작 가능합니다.

 

두 번째로~ tetris-vs-ai 인데요. 아래 주소에서 다운로드 할 수 있습니다.

 

http://www.mathworks.com/matlabcentral/fileexchange/33701-tetris-vs-ai

 

압축 해제후에 tetris.m 파일을 실행하면 되고 화살표와 스페이스 바로 조작이 가능하더군요.

 

요렇게 생겼습니다.



MATLAB 은 공학용 프로그램으로 널리 알려져 있지만~ 하나의 언어이니 만큼 다양한 분야에서도 사용할 수 있습니다.

 

아래 포스팅에서도 설명한 바와 같이 이 비싼 MATLAB 프로그램을 사용하여 게임을 만들어서 팔겠다 하시는 분들은 거의 없겠지만~ 


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

 

마음만 먹는다면 게임을 만들어서 해 볼 수도 있습니다.

 

오늘 소개할 MATLAB Game 은 Stellaria 라는 게임인데요~ 아래 주소에서 다운로드 할 수 있습니다.

 

http://www.mathworks.com/matlabcentral/fileexchange/31449-stellaria-tech-demo-the-best-matlab-shooting-game-ever

 

Download App 과 Download Submission 이 있는데요~ 둘 중 아무거나 클릭해서 다운로드 받아도 상관 없더군요.

 

 

다운로드를 받게 되면 StellariaTechDemo1_4_0.zip 라는 파일을 받게 됩니다. 압축 해제를 하고~

 

README.txt 파일을 읽어 보시면~ 게임 실행 방법 및 작동 설명이 나와있습니다.

 

읽어보니 MATLAB Command 에서 StellariaTechDemo1_4_0\stl_StellariaMain.m 파일을 실행하면 되더군요~

 

그럼 이렇게 Stellaria 게임이 실행되게 됩니다. 1인 용으로 할려면~ 1 을 2 인이 할려면 2를 누르면 됩니다.

 

조작 방법은 위에 말씀드린 README.txt 파일에 있는데요~ 아래 내용과 같이 설명되어 있더군요~

 

Control

-------

Player 1: WSAD - Movement, U - Fire, I - Bomb;

Player 2: DirKeys - Movement, Insert - Fire, Delete - Bomb;

You may skip the opening scene and credits screen by pressing 1 or 2

. They stands for 1 player and 2 players, respectively.

 

근데….. 난이도가 너무 어려움…. 아옹~~ 이건 뭐 어케 깰 수가 없네..  전 폭탄만 계속...ㅋㅋㅋㅋ 

 


관심 있으신 분들은 한번 해 보시길~


MATLAB 을 이용한 통신 시뮬레이션 코드를 찾다 보니 아래 주소의 블로그를 발견했다.

 

http://www.dsplog.com/

 

대단히 자세한 이론 설명과 훌륭한 MATLAB 예제 코드들을 보면 디지털 통신을 공부하는데 정말 부족함이 없어 보인다.

 

학부 시절에 FSK(Frequency Shift Keying)를 공부하면서~ BER(Bit Error Rate) 시뮬레이션 까지는 못해봤던 것 같은데~

 

아래 주소에 Frequency Shift Keying BER 시뮬레이션 코드가 있었다.

 

http://www.dsplog.com/2007/08/30/bit-error-rate-for-frequency-shift-keying-with-coherent-demodulation/

 

이론적 설명도 자세하고 세부 코드까지 포함되어 있어서 굉장히 도움이 많이 되는 포스팅이라는 생각이 든다.

 

아래 코드는 저자의 시뮬레이션 코드에 스펙트럼 확인을 하기 위해 몇 가지 코드를 추가한 예이다. 내가 추가한 부분은 빨간색으로 표시했다.

 

아래 코드에서 T 변수의 주석에 symbol duration 이라고 되어 있어서 약간 헷갈렸지만~ 변수 T 가 Sampling Rate(Fs)이다.

 

암튼 저자의 FSK simulation 코드를 보면 Coherent FSK 복조까지 명확하게 알 수 있어서 FSK 를 공부하는 분들이 참조하기에 대단히 좋은 코드라는 생각이 든다.

 

아래 코드에서 내가 스펙트럼을 확인하기 위해 사용한 pwelch() 함수를 사용하기 위해서는 MATLAB Signal Processing Toolbox 가 있어야 한다.

 

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% All rights reserved by Krishna Pillai, http://www.dsplog.com

% The file may not be re-distributed without explicit authorization

% from Krishna Pillai.

% Checked for proper operation with Octave Version 3.0.0

% Author    : Krishna Pillai

% Email        : krishna@dsplog.com

% Version    : 1.0

% Date        : 05 June 2008

% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

 

% Simple Matlab example of binary Frequency Shift Keying using

% coherent demodulation

 

clear

N = 10^5 % number of bits or symbols

T = 8; % symbol duration

Fs=T; % Sampling Rate

t = [0:1/T:0.99]; % sampling instants

tR = kron(ones(1,N),t); % repeating the sampling instants

 

Eb_N0_dB = [0:11]; % multiple Eb/N0 values

 

for ii = 1:length(Eb_N0_dB)

% generating the bits

ip = rand(1,N)>0.5; % generating 0,1 with equal probability

freqM = ip+1; % converting the bits into frequency, bit0 -> frequency of 1, bit1 -> frequency of 2

freqR = kron(freqM,ones(1,T)); % repeating

x = (sqrt(2)/sqrt(T))*cos(2*pi*freqR.*tR); %generating the FSK modulated signal

 

% noise

n = 1/sqrt(2)*[randn(1,N*T) + j*randn(1,N*T)]; % white gaussian noise, 0dB variance

 

% coherent receiver

y = x + 10^(-Eb_N0_dB(ii)/20)*n; % additive white gaussian noise

op1 = conv(y, sqrt(2/T)*cos(2*pi*1*t)); % correlating with frequency 1

op2 = conv(y, sqrt(2/T)*cos(2*pi*2*t)); % correlating with frequency 2

 

% demodulation

ipHat = [real(op1(T+1:T:end)) < real(op2(T+1:T:end))]; %

nErr(ii) = size(find([ip - ipHat]),2); % counting the number of errors

 

end

simBer = nErr/N;

theoryBer = 0.5*erfc(sqrt((10.^(Eb_N0_dB/10))/2)); %theoretical BER

 

close all

figure

semilogy(Eb_N0_dB,theoryBer,'b-');

hold on

semilogy(Eb_N0_dB,simBer,'mx-');

axis([0 11 10^-4 0.5])

grid on

legend('theory:fsk-coh', 'sim:fsk-coh');

xlabel('Eb/No, dB')

ylabel('Bit Error Rate')

title('Bit error probability curve')

 

 

%%

 

figure

pwelch(y,1024,512,1024,Fs)

 

위 MATLAB 코드를 실행시켜보면 다음과 같이 Coherent Frequency Shift Keying BER 과 FSK Power Spectral Density 그래프를 확인 할 수 있다.


< Coherent Frequency Shift Keying BER >

< Coherent FSK Power Spectral Density >

 

정확히 주파수 1, 2 Hz 에 톤이 뜨는 것을 확인 할 수 있다.


  1. Genius 2014.02.03 13:53

    좋은 자료 감사합니다.
    담아갈께요. ^^

    • 남성 2014.02.04 10:38 신고

      방문 감사합니다. 공지에 밝혔다 시피 링크만 허용합니다.

  2. ryu 2014.06.19 17:29

    conv에서 t 설정은 어떻게 해주는건지 잘 모르겠어요ㅠㅠ

    • 남성 2014.06.20 19:58 신고

      질문이 무슨 뜻인지 잘 몰겠네여... 위에 보시다시피 t = [0:1/T:0.99];

      t 는 1/T 간격으로 해 준건데요....

  3. chobo 2016.06.10 21:35

    안녕하세요 좋은자료 잘봣습니다.
    혹지 저기서 fs 는 뭘 말하는 건가요?
    FSK에서의 sampling rate가 의미하는걸 잘 모르겟어서..

    • 남성 2016.06.12 21:26 신고

      FSK 에서의 의미라기 보다는 디지털에서의 의미이라고 볼 수 있을것 같네요. 초당 Fs 샘플이 있다는 거죠.

아래 글을 보니 MATLAB 소프트웨어 단속 하나 보네요~

 

http://www.clien.net/cs2/bbs/board.php?bo_table=park&wr_id=26152226

 

위 주소의 글에 따르면 특정 교수 연구실 하나 지목해서 압수수색영장 가지고 싹 잡아서 20 카피에 54억 불렀다고 하는데~

 

한 카피당 2.7억 정도 부른건데… 제가 아는 가격보다는 한 2천정도 덜 부른 거 같네요.

 

보통 MATLAB 을 크랙으로 사용할 때는 필요한 툴박스만 사용하는 게 아니라 풀패키지를 깔게 되고~

 

풀 패키지 가격이 요즘 한 2.9 억 정도 되는 것 같던데~

 

뭐 일단 저는 대학에서 MATLAB 을 배우긴 했고 지금도 MATLAB 을 좋아하긴 하지만 대학에서 MATLAB 을 가르치는 것 자체는 반대하는 입장입니다.

 

위에 밝힌 바대로 MATLAB 은 어마어마한 비용이 들어가는 툴입니다. 정말 방대한 실용적인 툴박스들이 제공되서 편리하긴 하지만 툴 박스 하나 하나의 가격이 만만치가 않습니다. 또한 1년에 한번씩 업데이트를 위한 라이선스 유지 비용도 듭니다.

 

비싼 툴박스는 2천만원이 넘는 것도 있죠~ 가격에 대해서는 아래 글 참조바랍니다.

 

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


 

암튼 대학에서 알고리즘을 공부하는데 있어서 MATLAB 을 대체할만한 오픈 소스 프로그램들은 얼마든지 있습니다.

 

제 블로그에서도 종종 소개드리는 Scilab, Octave, Freemat 과 같은 툴들이 있고~ 파이썬을 사용하는 Spyder 같은 프로그램도 있습니다.


 

http://iamaman.tistory.com/category/programming%20language/Octave



http://iamaman.tistory.com/category/programming%20language/SCILAB


 

2012/08/20 - [유틸] - MATLAB 과 유사한 Open Source 프로그램 FreeMat



2013/11/13 - [유틸] - 과학 분석에 사용되는 Python IDE Spyder



2013/11/26 - [컴퓨터일반] - ipython으로 unique 하게 sorting 하기



2014/09/05 - [programming language/Octave] - Windows OCTAVE 3.8 GUI 환경


대학에서는 이런 툴들에 대해 가르쳐야지 MATLAB 을 정식과목으로 채택하면 이건 뭐 학생들한테 크랙 사용하라는 소리 밖에 안 되지 않을까요?

 

대학에서는 MATLAB 만 가르쳐서 학생들이 MATLAB 만 사용할 줄 안다면 이건 매스웍스의 마케팅 전략에 놀아나는 꼴 밖에 안 되고~ 학생들을 MATLAB 의 노예로 만드는 꼴밖에 되지 않는다고 생각되네요.

 

대한민국이 참~~ 크랙 많이 사용하는데~ 운영체제인 윈도우부터 크랙을 사용하다 보니 MATLAB 크랙 사용하는 거야 너무나 당연한 걸로 생각하게 되는 것 같습니다.

 

우리나라가 윈도우 위주의 세상이 된 건, 생각 없는 정부의 소프트웨어 정책을 원망해야겠지만~ MATLAB 교육에 대한 결정권자들은 대학 교수들일거라고 생각되네요. 교수님들이 위에 얘기했던 MATLAB 대체 프로그램들을 적극적으로 교육해야 한다고 생각합니다.

 

지금 위에 털린 연구실 뿐만 아니라 정말 많은 연구실들이 지금도 크랙을 많이들 사용하고 있을 겁니다. 털면 다~~ 털리는거죠 뭐….

 

이제 우리나라도 소프트웨어의 라이선스 정책에 대해 심각하게 생각해 볼 때가 되지 않았나 생각합니다.

 

일단 운영체제부터 리눅스를 주로 활용할 수 있어야 하겠고~ 운영체제를 오픈 소스로 사용하다 보면 자연스럽게 소프트웨어들도 오픈 소스 또는 프리웨어에 관심을 갖게 될 것 같습니다.

 

저도 윈도우만 사용할 때 보다 리눅스를 사용하면서 정말 다양하고 좋은 오픈 소스 또는 프리웨어들에 관심을 갖게 되었고, 지금은 알고리즘을 하는데 있어서는 MATLAB 이 아니어도 딱히 불편함이 없는 상황 입니다.


 

물론 MATLAB 이 없으면 안 되는 상황에서는 MATLAB 을 사서 사용해야겠지만~~ 간단한 알고리즘 몇 개 공부하는데 MATLAB 으로 하는 건…. 파리잡는데~ 대포쏘는 것 같은 느낌이네요. Octave, Scilab 같은 프로그램을 사용할 줄 안다면 회사에서 MATLAB 에 적응하기는 매우 쉬울 걸로 생각되네요~

 

예전에는 윈도우, 오피스, MATLAB 과 같은 프로그램에 대해 대체할만한 프로그램이 없어서 어쩔 수 없었다고 하더라도… 지금은 대체할만한 오픈 소스 또는 프리웨어 프로그램들이 많습니다.

 

과연 지금 대학의 소프트웨어 교육들이 바람직한 것인지… 대학에서의 소프트웨어 교육에 대해 교수님들이 적극적으로 고민해 주셨으면 좋겠네요.


  1. ㄴㅇㄹ 2014.09.20 16:25

    블로그주인님쿨하셔요

  2. 학생요 2014.12.17 16:01

    학생용은 5만원이에요

  3. Daniel Heo 2015.08.31 01:19

    학교에서 MathWorks와 라이센스 계약을 체결해서 무료로 제공하기도 합니다. 저희도 그렇구요. 아마 매트랩 강의가 있는 학교면 거의 다 그러지 않을까 싶네요. 블로그 둘러보니 배울 것이 많은 곳이네요 ㅎㅎ 저도 요즘 드론 프로젝트 하면서 블로그 운영하고 있는데 자주 찾아오겠습니다.

    • 남성 2015.08.31 03:11 신고

      방문해 주셔서 감사합니다. ^^ 학교 컴퓨터 실에서야 당연히 라이센스 계약을 하고 사용하겠죠. 그런데 대학 연구실에서는 그렇지 않은 곳도 많은것 같습니다. 개인도 마찮가지구요. MATLAB 툴박스를 꼭 사용해야 하는것이 아니라면 학생들은 Octave, Python 등을 사용하는게 좋을것 같고 아래 주소에서 소개한 Julia 등과 같은 언어를 사용하는것도 좋을것 같네요.

      http://iamaman.tistory.com/1479

      개인적 경험으로도 MATLAB 만 사용할 때 보다는 위에서 소개한 오픈소스를 사용하면서 실력이 더 늘었다고 생각되네요.

      드론 프로젝트 하신다고 하셨는데~ 재밌겠네요! 좋은 결과 있으시길~

  4. 맷랩사용 2015.09.16 01:08

    뜬금없이 matlab알려주고 이거 알아서 깔라고한다음 그날과제에 matlab으로 푸는걸 내줌 쓰는법도모르는데

    • 남성 2015.09.16 08:18 신고

      대책이 없네요. 학생용을 사서 사용하셔도 되는데 일단 교수한테 오픈소스 사용해서 해도 되냐 물어보는게 좋을것 같네요. 방문해 주셔서 감사합니다.

  5. ㅁㄴ 2015.09.16 17:44

    저도 수업때 내준 매트랩 과제하려고 매트랩 다운받는법 찾다가 들어왔는데요
    오픈소스가 뭔가요?? 빨리 받아서 해야하는데... 답답하네요

    • 남성 2015.09.16 18:35 신고

      오픈소스에 대한 정의는 아래 주소 참조하시기 바랍니다.

      https://ko.wikipedia.org/wiki/%EC%98%A4%ED%94%88_%EC%86%8C%EC%8A%A4

      MATLAB 이 없으시면 octave 나 freemat 을 사용해 보세요. 문법이 거의 유사합니다.

      octave : http://iamaman.tistory.com/1427
      freemat : http://iamaman.tistory.com/639

  6. 공대생 2016.11.03 21:56

    형님. 저는 기계공학과에 다니는 학생인데요. 매트랩을 하려고 합니당. 요즘 회사에서도 그렇고 실무자들이 매트랩없으면 안된다고 해서요. 아직 카티아나 오토캐드밖에 못다루는데요. 요것도 해야한다고 하네요. 그런데 행님, 매트랩 학생용 에디션으로는 안되는겁니깡? octave, freemat은 오픈소스용 수치해석 툴인가요? 일단 이거 쓰고 있으면 될까요? 아니면 돈 좀 주고서라도 학생용에디션 번들까지 55$하던데 요거 얼렁 사서 책 봐야 할까요

    • 남성 2016.11.03 22:23 신고

      음 어떤 분야, 어떤 회사냐에 따라 다를것 같은데... 카티아 오토캐드 등은 기구물 디자인 할 때 쓰지 않나요? 저는 들어는 봤지만 사용해 보지도 할줄 도 모릅니다.
      어떤 분야를 하고 싶은지를 정하고 공부하시는게 좋을 듯 하네요.
      자동차 제어기용 소프트웨어를 하고 싶다면 C 를 할 줄 알아야 하고 임베디드에 대한 지식이 있어야 합니다.
      요즘 자동차 제어기는 MBD(Model Based Design) 로 가려는 추세이므로 Simulink 로 제어기 소프트웨어를 만드는 추세 입니다. 학생용 stateflow 가 있는지 모르겠지만 stateflow 를 할줄 알면 좋습니다.
      Simulink 를 사용한다고 해도 MATLAB 이 기본입니다.

      octave, Freemat 은 MATLAB 과 문법이 굉장히 유사한 툴입니다. MATLAB 스크립트에 대해 공부한다면 그냥 octave, Freemat 을 사용해도 될것 같고 MBD를 하고 싶다면 어쩔수 없이 Simulink, Stateflow 가 들어있는 학생용 MATLAB 을 사서 공부하셔야 할 겁니다.
      대학생이시면 학교 컴터실에 MATLAB, Simulink 등이 많이들 설치되어 있으므로 사용해 보시길 추천 합니다.

  7. OnDraw 2018.10.23 11:06 신고

    이렇게 배운 인력은 나가서도 매트랩을 써야 하지요...

    연구성과를 외부의 다른사람이 전달받아 쓰게 되면 그사람도 매트랩 써야 하구요

하드를 뒤지다 보니 몇 년 전에 제작 했던 GUI 가 남아 있더군요.

 

간단하게 Churchill equation 그래프를 그리고 변수 넣으면 값 출력 되고 정도의 GUI 라서 별거는 아니지만 유체역학을 공부하시는 분들은 필요하실 것도 같아서 이렇게 소개하고 올립니다.

 

유체 정역학에서 사용되는 Churchill equation은 Moody가 상용 원형관을 실험하여 마찰계수(f), 레이놀즈수(Re), 상대조도계수(ε/D)의 관계를 구한 것으로 수식은 다음과 같습니다.

 

해당 파일 첨부합니다.

ChurchillGUI_MATLAB.zip

 

레이놀즈수(Re)와 상대조도계수(ε/D)를 알면 마찰계수(f) 를 구할 수 있습니다.

 

Churchill equation에 대한 GUI 파일은 다음과 같이 ChurchillGUI.m, ChurchillGUI.fig 파일로 구성되어 있고~ 명령창에 파일명 ChurchillGUI 를 치고 실행하면 다음과 같은 Churchill equation GUI 를 볼 수가 있습니다.

 

다음으로 위에서 설명한데로 레이놀즈수(Re)와 상대조도계수(ε/D)를 입력하면~

 

위 그림과 같이 해당 마찰계수가 별표로 표시되고~ 그 값이 표시 됩니다.

 

Plot, Clear 등은 굳이 설명 안 드려도 알겠죠~ 관계된 공부 하시는 분들은 유용하게 사용하시길~

MATLAB의 행, 열을 바꿔보자

x=magic(4) % 4행 4열의 매트릭스 x

x =

16 2 3 13

5 11 10 8

9 7 6 12

4 14 15 1

   

이 매트릭스를 2행 8열로 만들어 보자. 이러한 경우 reshape() 함수를 쓸 수가 있다.

   

y2= reshape(x,2,8)

   

y2 =

16 9 2 7 3 6 13 12

5 4 11 14 10 15 8 1

 

결과를 확인 해보면 열을 기준으로 한다는 것을 알 수 있다. 즉, x의 1열의 값들을 배치하고 그담에 x의 2열의 값들이 배치하고 한다는 것이다. 매트랩의 대부분의 함수들도 대부분이 이처럼 열을 기준으로 한다는 것을 알아두자

   

다음으로 8행 2열로 만들어보자  

y2= reshape(x,8,2)

y2 =

16 3

5 10

9 6

4 15

2 13

11 8

7 12

14 1

 

참 쉽게 행, 열이 휙~ 휙~ 바뀐다.



2013-11-29 추가 내용

다음과 같이 행 또는 열에 대해서만 숫자를 지정해 준 후에 나머지 한 변수를 대괄호 [ ] 로 처리하면 알아서 matrix 의 크기를 변환 시켜 준다.

열만 지정해준 경우는 다음과 같고~

>> y2= reshape(x,[],2)

y2 =

16 3

5 10

9 6

4 15

2 13

11 8

7 12

14 1

 

행만 지정해준 경우는 다음과 같다

>> y2= reshape(x,8,[])

y2 =

16 3

5 10

9 6

4 15

2 13

11 8

7 12

14 1


MATLAB에는 다양한 colormap이 있어서 다양한 색상으로 그래프를 표현하곤 하는데요~

 

아래 매뉴얼어서도 볼 수 있듯이 많이 사용하는 색상 테이블들이 default 로 제공됩니다.



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


 

기본적으로 제공되는 built-in colormaps 들은 다음과 같은데요.

 

jet, hsv, hot, cool, spring, summer, autumn, winter, gray, bone, copper, pink, lines


 


이런 built-in colormap중에도 자신이 사용하고자 하는 색상 테이블이 없는 경우가 있습니다.

 

이럴때는 당연히 자신만의 colormap 을 만들어서 사용해야겠죠.

 

colormap이라는게 RGB 값으로 구성된 테이블이므로 RGB 값을 매트릭스의 형태로 만들어도 되지만 이러한 방법보다는 자신이 직접 색상을 확인하면서 colormap 을 만드는게 편리하겠죠~

 

MATLAB 에는 색상을 확인하면서 colormap 을 설정할 수 있도록 colormapeditor 라는 툴을 제공해 줍니다.

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

 

MATLAB command windows에서 colormapeditor라는 명령어를 치면 Figure 창과 함께 다음과 같은 Colormap Editor가 나타납니다.

 

자신만의 colormap을 설정하기 위해 중간에 있는 색상 Marker 들을 클릭하고 좌우로 드래그 해 보시면 색상의 인덱스 들이 바뀌는 것을 확인 할 수 있습니다.

 

다음으로 색상을 바꾸고 싶은 Marker 를 클릭한 후에 Ctrl+B를 누르거나 Edit → Edit Marker Color 를 누르면 색상을 변경 가능합니다.

이렇게 선택하면 다음과 같이 바뀐 것을 확인 할 수 있습니다.

 

다음으로 색상을 좀더 넣고 싶다면 다음과 같이 해당 색상 부분을 클릭하시면 추가적인 색상을 넣을 수 있는 Marker가 생성 됩니다.

 

원하는 colormap으로 변경 완료 했다면 이제 Apply 버튼을 눌러서 현재의 Figure창에 적용 합니다.

 

적용을 했으면 colormap을 저장해야겠죠~

 

다음 명령어로 바뀌어진 colormap을 mycmap 라는 변수에 저장하고

 

mycmap = get(gcf,'Colormap'); % 현재 figure 창의 colormap을 선택

 


향후에도 사용하기 위해 파일에 MyColormaps 라는 파일에 저장합니다.


save('MyColormaps','mycmap')        % MyColormaps 파일에 colormap 저장

 

향후에 이전에 만들었던 colormap을 사용하고 싶다면 다음과 같이 파일로부터 colormap을 로드해서 사용할 수 있습니다.


load('MyColormaps','mycmap')        % MyColormaps 파일에서 colormap load 해서 사용

 

mycmap라는 colormap을 사용할 때는 다음과 같이 합니다. 아래 명령에서 new_fig는 colormap을 적용하고자 하는 Figure handle 입니다.


set(new_fig,'Colormap',mycmap)

 

이상으로 Colormap Editor 를 이용한 커스텀 colormap 생성방법에 대한 소개를 마치겠구요.

 

혹시 이런 GUI 가 아닌 함수를 사용해서 colormap을 만들고자 하시는 분들은 아래 주소의 글들을 참조하면 도움이 되실 것 같네요.

 

http://www.mathworks.com/matlabcentral/fileexchange/40318-build-custom-colormaps


http://cresspahl.blogspot.kr/2012/03/expanded-control-of-octaves-colormap.html




아래 포스팅에서 MATLAB BPSK BER simulation 에 대해 설명 드린적이 있는데요.

 

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

2011/03/19 - [programming language/MATLAB] - MATLAB BPSK BER simulation in AWGN channel

2011/03/27 - [programming language/MATLAB] - MATLAB QPSK BER simulation in AWGN channel


오늘은 어떤 분이 질문을 하셔서 unipolar signaling을 한 경우의 BER simulation 을 해 보려 합니다.

 

일단 시뮬레이션의 Es 는 1 로 정규화하고, unipolar signaling 의 경우 M=2 이므로 최종적인 unipolar signaling 의 잡음 분산 수식은 BPSK 시뮬레이션과 마찬가지로 아래 수식이 됩니다.

 

하지만 unipolar signaling 이므로 비트 0을 0 으로 1 을 sqrt(2) 로 mapping 해야 평균 심볼 에너지가 1이 되게 됩니다.

 

다음으로 Decision Boundary 를 설정해야 는데, BPSK 인 경우에는 -1~1 사이의 딱 중간인 0을 Decision Boundary 설정했었죠~

 

Unipolar Signaling에서는 0 ~ sqrt (2) 사이의 딱 중간인 1/sqrt(2) 가 되겠죠~

 

물론 위에 계산 한 Decision Bound는 비트 1,0의 발생 확률이 같다는 가정하에서 계산되는 겁니다. 1, 0의 발생 확률이 다르다면 Decision Boundary 는 딱 중간이 안 됩니다.

 

다음으로 Unipolar Signaling 의 이론적인 BER 성능을 알아야겠죠~

 

이제 Unipolar Signaling 에 대한 AWGN 환경에서의 BER simulation 을 위한 준비는 다 된 거 같네요.

 

위 포스팅에서 했던 BPSK 시뮬레이션 코드에서 몇 군데만 손을 보면 다음과 같이 됩니다.

 

이미지로 올렸더니 오타 나시는 분들인 많은 것 같아서 코드로 올립니다.


clc

clear

close all 

 

N_bits=7000000; % 생성할 비트 수

Eb_No_dB=0:2:10; % Eb/N0 dB scale

BER_buffer=zeros(size(Eb_No_dB)); % BER 저장할 버퍼

 

 

for n=1:length(Eb_No_dB)

Eb_No_ral_scale= 10 ^(Eb_No_dB(n)/10); % Eb/N0 real scale 값 변환

sigma_v=sqrt(1./(2*Eb_No_ral_scale)); % 잡음의 표준 편차 값 계산

 

bits_v=randi([0 1],N_bits,1); % 비트 생성

Symbols=bits_v* sqrt(2); % symbol mapping

 

noise_v=randn(N_bits,1)*sigma_v; % AWGN 생성

 

tx_signal=Symbols + noise_v ; % 신호 + 잡음

 

demapped_bits= tx_signal > (1/sqrt(2)) ; % 수신단 demapping

 

BER_buffer(n)=sum(bits_v ~= demapped_bits) ./ N_bits; % BER calculation

 

fprintf('Eb/No= %g BER: %g\n',Eb_No_dB(n) ,BER_buffer(n))

end

 

%% 이론적인 Unipolar Signaling BER 계산

 

Eb_N0_theory=0:0.05:10 ;

snr=10.^ (Eb_N0_theory./10);

Ber_value_theory= 0.5*erfc(sqrt(snr)./sqrt(2)); % Theoretical Unipolar Signaling BER

 

%% 그래프 그리기

 

figure(1),semilogy(Eb_No_dB,BER_buffer,'b*',Eb_N0_theory,Ber_value_theory,'r--'), xlabel('Eb/No [dB]'), ylabel('BER')

grid,axis([0 10 0.000001 1]), legend('Simulated result','Theoretical Unipolar Signaling result')

 

결과는 다음과 같이 나오게 되는군요.

  

참조

http://www.mathworks.co.kr/matlabcentral/fileexchange/7458-bpsk-and-ask-simulation



  1. 답변부탁드릴게요 2013.11.19 07:14

    snr 계산에서 식이 snr=10.^(Eb_No_dB/10); 인 이유를 설명 부탁드려도 될까요

    • 남성 2013.11.19 18:12 신고

      DB 스케일을 real 스케일로 변환하는 겁니다.

    • 감사합니다 2013.12.04 19:48

      늦었지만 정말 감사드립니다

    • 남성 2013.12.06 03:11 신고

      도움 되셨다니 다행이네요~ ^^

  2. 통신 2015.01.13 19:52

    noise_v=randn(N_bits,1)*sigma_v 에서 왜 표준편차를 곱하죠?

    • 남성 2015.01.13 23:36 신고

      randn() 함수는 평균이 0 이고 분산 또는 표준편차가 1인 가우시안 랜덤 넘버를 생성하죠.
      위 시뮬레이션 코드에서는 평균이 0 이고 표준편차가 sigma_v 인 가우시안 랜덤 넘버를 생성해야 하니까 sigma_v 값을 곱해 준 겁니다. sigma_v 값을 계산하는 과정은 위 포스팅의 수식을 참조하시면 됩니다.

  3. 통신기사 2015.11.09 22:25

    너무 좋은자료 감사합니다. 그런데 저기 수신단mapping이라는 부분이 이해가 안되서 질문 드립니다.

    • 남성 2015.11.09 23:50 신고

      수신 신호가 1/sqrt(2) 보다 크면 비트 1 그렇지 안으면 비트 0 으로 판단하는 겁니다.

제 블로그를 방문해 주시는 분들이라면 대부분이 MATLAB을 사용하는 분들일 텐데요.

 

MATLAB 은 굉장히 좋은 툴이지만 편리한 툴도 더 편리하게 사용하고 싶은 게 사람의 욕심이죠~

 

오늘은 Autohotkey를 사용한 MATLAB 단축키 프로그램에 대해 소개하려 합니다.

 

제가 사용해 본 결과 아래 프로그램을 통한 단축키는 MATLAB Editor 가 Undock 돼 있는 경우에만 유용하더군요.

 

소개할 프로그램은 아래 주소에서 다운로드 받을 수 있고요.

http://www.mathworks.com/matlabcentral/fileexchange/5452-meditor-ctrl+tab-support

 

아래 그림과 같이 버튼을 클릭해서 다운로드 후 압축을 풀고 MEditor72_CtrlTab.exe 파일을 실행하시면 됩니다.

 

실행 하시면 윈도우 하단에 다음과 같이 메뉴가 나타납니다.

 

마우스를 가져다 대면 기본적인 단축키 들에 대해 나타나는데요. MATLAB Editor 에 여러 파일이 열려 있을 때, Ctrl+Tab 을 누르면 다음 파일로 가고, Ctrl+Shift+Tab 를 누르면 이전 파일로 넘어가는 형태입니다.

 

MATLAB 에서 기본적으로는 Editor 의 파일간의 전환은 Ctrl+ Page Up, Ctrl+ Page Down 으로 전환하게 되는데 이게 분편하신 분들만 사용하시는 게 좋을 것 같군요.

  

Editor 가 MATLAB desktop 에 dock 돼 있는 경우에는 Ctrl+Tab 을 누르면 MATLAB desktop 의 각 구성 패널간에 전환이 일어나더군요.


 

그래서 저는 MATLAB Editor 가 Undock 돼 있는 경우만 Ctrl+Tab, Ctrl + Shift + Tab 단축키를 사용합니다.

 

다음으로 Ctrl + Caps Lock 단축키인데요. Ctrl+Caps Lock 를 누를 때 마다 Command Windows 와 Editor 간의 전환이 이루어 집니다.

 

MATLAB 에서는 기본적으로 Ctrl + 0 을 누르면 Command Windows 로 이동하고, Ctrl + Shift + 0 를 누르면 Editor 로 이동하는데 한 손으로 단축키를 누르고 싶다 하시는 분들한테는 유용할 것 같네요.

 


  1. kcr 2016.07.17 22:22

    좋은 정보 감사합니다

    • 남성 2016.07.17 22:24 신고

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

아래 포스팅에서 윈도우 command 창에서 명령어의 결과를 clipboard 에 저장하는 방법에 대해 설명드린 적이 있는데요.

 

2013/04/15 - [컴퓨터일반] - MS Windows 명령 창 팁들


오늘은 MATLAB command window 에서의 실행 결과를 clipboard 에 저장하는 방법에 대해 설명 드리려 합니다.

 

clipboard 를 사용하는 방법은 다~~ 아시다시피 복사, 붙여 넣기가 있는데요.

 

Command Window 결과를 복사하는 방법은 Command Window 에서 블록을 잡아서 복사를 해도 되지만

 

clipboard() 라는 함수를 이용하여 프로그램적으로 할 수도 있습니다.

 

복사하는 방법은 다음과 같습니다. 

clipboard('copy', data)

 

위 원형에서 data 는 변수 입니다. 예는 다음과 같습니다.

 

위 예와 같이 하면 clipboard 에는 [8 1 6;3 5 7;4 9 2]로 저장 됩니다.

 

언듯 보면 그리 쓸모 없어 보이는 기능일지 몰라도 아래 포스팅에서처럼 윈도우 CMD 창에서 MATLAB 스크립트 등을 돌리고 그 결과를 clipboard 에 저장하고 싶을 때, 사용 할 수 있습니다.


2011/11/20 - [programming language/MATLAB] - Window command 에서 MATLAB 실행 방법


다음으로 붙여 넣기 하는 방법인데요. 다음과 같이 붙여 넣기 할 수 있습니다. str이라는 변수를 보면 아시겠지만 char 의 형태로 저장이 됩니다. 

str = clipboard('paste')

 

문자의 형태로 저장이 되면 아래 포스팅에서 설명한 eval() 함수를 통해 실행 시킬수가 있죠~

  

2010/01/17 - [programming language/MATLAB] - String evaluation, eval()

 

예를 한번 보죠. 현재의 clipboard 에는 [8 1 6;3 5 7;4 9 2] 이 저장 되 있습니다.

 

마찬가지로 CMD 에서 MATLAB 스크립트를 실행시키는 경우 clipboard 의 내용을 사용하고자 할 때~ 적용 할 수 있겠죠~



MATLAB 은 실험 데이터 등을 분석하는데도 많이들 사용하실 텐데요.

 

파일 읽고 쓰기 등도 굉장히 편하게 할 수 있다는 장점이 있습니다.

 

그 중에서 오늘은 쉼표로 나눠진 파일인 csv 파일을 읽고 쓰는 방법에 대해 설명 드리려 합니다.

 

MATLAB 에서 csv 파일을 읽기 위해서는 csvread()라는 함수를 사용합니다.

 

사용방법은 굉장히 간단한데요. 기본 사용법만 설명 드리겠습니다.

 

다음과 같이 구성된 데이터 파일에 대해 파일을 읽어보죠~


 

간단하게 csvread() 함수와 함께 파일 명만 적어 주면 됩니다.


A=csvread('test.dat')


 

이제 csv 파일을 한번 써 볼까요? 핸드폰의 주소록 같은 경우에 CSV 파일 형태로 많이들 돼 있는데~

 

저는 MATLAB 의 변수 등을 C/C++ 코드에서 변수로 사용하고 싶을 때 사용합니다.

 

C/C++ 에서는 벡터 등에 변수를 저장 할 때 ,(comma) 로 구분하니깐요~

 

간단하게 예제를 보시죠. 뭐 너무 간단해서 설명할것도 없네요. ㅋㅋ 


csvwrite('temp.txt',A)



 

다음과 같이 CSV 파일이 생성된 것을 볼 수 있습니다.



블로그에 MATLAB 사용법과 관련한 포스팅을 작성해서 그런지 MATLAB 가격에 대해 문의하는 분들이 종종 계시더군요. ㅋㅋㅋ

 

저는 한 3년 전에 MATLAB 을 회사에서 구매를 한 경험이 있는데…

 

한국 매쓰웍스에 전화해서 구매했었습니다. 전화해서 구매할려고 한다 하니깐 가격 적혀 있는 문서 같은거 보내주더군요.

 

그 중에서 구매할 제품들 선택해서 견적내서 구매했었습니다.

 

MATLAB, Simulink 랑 툴박스 한 4~6 개?(정확히 기억은 안나네요…) 정도 해서 한 2천만원 정도 했던 것 같네요.

 

그 당시에 제 기억으로는 Simulink HDL Coder 같은 경우에는 툴박스 하나만 2천 만원이 넘었던 걸로 본거 같고~ 가격표 보고 뜨아~~ 했던 기억이 납니다.

 

저는 뭣도 모르고 사용하고 싶은 툴박스들 다 적어서 회사에 견적 올렸다가 욕 먹고 빠꾸 맞았던 기억이 ㅋㅋㅋㅋㅋ

 

암튼 MATLAB 2천만원 어치(콩나물도 2천원어치도 아니고 2천만원어치 하니깐 좀 웃기네요)가 제 회사 컴퓨터에 깔릴때의 그 부담감이란… 후덜덜 ㅡㅡ;

 

MATLAB 가격에 대해 검색을 좀 해보니 아래 주소에 대략적인 가격이 나오더군요.

 

http://www.softwarecatalog.co.kr/src/Item/Itemmaster.aspx?Serial=1223




 

가격 밑에 보니 회원으로 로그인하면 저렴한 가격으로 만나보실수 있다고 써져 있던데… 아마도 좀더 마진을 붙여서 써 놓은 것 같네요.

 

제 기억으로는 위 주소의 가격 정도는 아니었던 것 같습니다. 시간이 지나서 오른건지는 모르겠지만… 저거보다는 쌌던 것 같네요…

 

MATLAB 에 드는 돈과 관련하여 좀더 말씀 드리면 MATLAB 은 구매 하다고 다가 아닙니다.

 

MATLAB 은 1년에 2번 업데이트가 되는데. SMS인가하는 유지 비용이 있습니다. 그래서 업데이트를 하려면 1년에 한 번씩 유지비를 내야 업데이트를 받을 수가 있습니다.

 

MATLAB 구매하시려는 분들의 궁금증이 어느 정도 해소됐으면 좋겠네요.




통신 시뮬레이션을 하면서 Root Raised Cosine Filter 는 많이들 사용하실 텐데요.

 

아래 포스팅에서 소개했다시피, Root Raised Cosine Filter Coefficient 는 Communications System Toolbox 의 rcosine() 함수를 통해서 구할 수가 있었습니다.

 

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

2011/03/09 - [programming language/MATLAB] - [디지털 통신] EYE PATTERN


그런데 최근에 사용해보니 다음과 같이 향후에는 없어질 함수이니 fdesign.pulseshaping 을 사용하라고 나오더군요.

 

MATLAB 을 사용할 수 없는 환경에서는 OCTAVE 를 사용할 때, communications package 는 있지만 rcosfir, rcosflt 와 같은 함수들은 아직 제공되지 않더군요.

 

http://octave.sourceforge.net/communications/overview.html

 

Root Raised Cosine Filter Coefficient 수식을 보고 작성하는 방법도 있겠지만, 이런 코드들은 대부분 인터넷을 찾아보면 나오기 마련이라

 

찾아보니 아래 주소에 있더군요. 

http://www.mathworks.com/matlabcentral/fileexchange/14809-m-qam-modulation-and-demodulation

 

위 주소에서 다음 그림과 같이 QAM.zip 파일을 다운로드 한 후에 압축을 해제 합니다. 파일 이름에서도 알 수 있겠지만, QAM 변복조 함수들이 포함되어 있더군요.

 

 

몇가지 함수 중에 my_rrc.m 함수가 Root Raised Cosine Filter Coefficient 를 생성하는 함수 입니다.

 

함수 원형이 다음과 같으니 네 개의 변수를 넣는다는건 아실테고~ 위에서 설명드린 rcosine() 함수와 비슷하더군요.

 

function f = my_rrc(fd, fs, beta, delay)

% MY_RRC Produces the impulse response of a root raised cosine filter

% F = MY_RRC(Fd, Fs, BETA, DELAY) is the impulse response of a root

% raised cosine FIR filter with rolloff factor BETA and delay DELAY. 


fd 는 원 신호의 sample rate, fs 는 oversample rate, beta 는 Root Raised Cosine Filter 의 rolloff factor, delay 는 말 그대로 filter 의 delay 심볼 수 입니다.

 

제가 테스트 해보니

 

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

Sqrt_r_filter_2=my_rrc(1e6,8e6,0.2,3);

D=Sqrt_r_filter_2(:)-Sqrt_r_filter(:)

plot(D)

 

차이가 10-16 대로 동일한 계수가 나오더군요.

 

간단하게 Root Raised Cosine Filter 를 roll off 에 따라 그려봤습니다.

 

Sqrt_r_filterAll=[];

legCell={};

 

n=1;

for r=0.2:.2:.9

Sqrt_r_filterAll(:,n)=my_rrc(1e6,8e6,r,3);

legCell{n}=num2str(r);

n=n+1;

end

 

figure,

plot(Sqrt_r_filterAll), grid on

legend(legCell)

OCTAVE 에서도 확인해보니 정상적으로 Root Raised Cosine Filter Coefficient 가 나오더군요. 




아래 포스팅에서 MATLAB containers.Map 에 대해 소개했었는데요.



2012/06/10 - [programming language/MATLAB] - MATLAB MAP data structure


 

검색을 하다 보니 또 다른 방식으로 hash table을 구성 할 수 있더군요.

 

Hash table 은 key => Value 의 쌍으로 구성된 데이터 타입인데~

 

아래 포스팅에서는 hash table 을 MATLAB struct 와 java 를 이용하는 방식으로 소개 합니다.

 

http://smlv.cc.gatech.edu/2010/03/10/hash-tables-in-matlab/

 

첫번째로 struct 를 사용하는 방식의 예제 코드는 다음과 같습니다.

 

terms = { 'price' 'cents' 'govern' 'billion' 'company' 'state' 'economy' 'stock' };

ids = num2cell(1:length(terms));

dict = reshape({terms{:};ids{:}},2,[]);

dict = struct(dict{:});

dict.('cents') % my two cents!

 

위 예제에서 dict 라는 변수는 struct 라는 것을 확인 할 수 있고~ 다음과 같이 struct 의 field 와 값의 형태로 구성됩니다.

 

 

위에서 struct 를 사용하는 방식은 hash table 의 크기가 작을때는 유용하게 사용할 수 있을 것 같은데… 그 크기가 커지면 그렇게 좋은 방식은 아닌 것 같군요.

 

다음으로 java 를 사용하는 방식인데~ 에제 코드는 다음과 같습니다.

 

dict = java.util.Hashtable;

dict.put('key',[1 2 3]);

dict.get('key')

dict.containsKey('key')

 

dict.size 라고 하면 hash table dict 의 크기를 알 수 있고~ dict.keySet 라고 하면 어떤 key 값들이 정의되어 있는지 확인 할 수 있습니다.

 


MATLAB 을 사용해서 또 어떤걸 해 볼까~~ 하고 찾아보던 중~ batman 함수를 그려보면 잼 있겠다는 생각이 들어서 검색을 해 봤습니다.

 

역시나 무수한 자료들이 나오더군요.

 

아래 주소의 내용에는 MATLAB 코드도 있어서 한번 그려보기로 했습니다.

 

http://gauravtiwari.org/2011/09/24/how-to-draw-the-famous-batman-equation/

 

코드는 다음과 같습니다. 아래 코드가 정상적으로 실행되기 위해서는 Symbolic Math Toolbox 가 설치되어 있어야 합니다.

 

clf; clc; clear all;

syms x y

eq1 = ((x/7)^2*sqrt(abs(abs(x)-3)/(abs(x)-3))+(y/3)^2*sqrt(abs(y+3/7*sqrt(33))/(y+3/7*sqrt(33)))-1);

eq2 = (abs(x/2)-((3*sqrt(33)-7)/112)*x^2-3+sqrt(1-(abs(abs(x)-2)-1)^2)-y);

eq3 = (9*sqrt(abs((abs(x)-1)*(abs(x)-.75))/((1-abs(x))*(abs(x)-.75)))-8*abs(x)-y);

eq4 = (3*abs(x)+.75*sqrt(abs((abs(x)-.75)*(abs(x)-.5))/((.75-abs(x))*(abs(x)-.5)))-y);

eq5 = (2.25*sqrt(abs((x-.5)*(x+.5))/((.5-x)*(.5+x)))-y);

eq6 = (6*sqrt(10)/7+(1.5-.5*abs(x))*sqrt(abs(abs(x)-1)/(abs(x)-1))-(6*sqrt(10)/14)*sqrt(4-(abs(x)-1)^2)-y);

 

axes('Xlim', [-7.25 7.25], 'Ylim', [-5 5]); hold on

ezplot(eq1,[-8 8 -3*sqrt(33)/7 6-4*sqrt(33)/7]);

ezplot(eq2,[-4 4]);

ezplot(eq3,[-1 -0.75 -5 5]);

ezplot(eq3,[0.75 1 -5 5]);

ezplot(eq4,[-0.75 0.75 2.25 5]);

ezplot(eq5,[-0.5 0.5 -5 5]);

ezplot(eq6,[-3 -1 -5 5]);

ezplot(eq6,[1 3 -5 5]);

colormap([0 0 1]), title('Batman'); xlabel(''); ylabel(''); hold off

 

실행해보니 이런 결과가 나오더군요.

 

 

뭐 너무 유명한 그림이다 보니 아래 주소에서도 batman 함수를 다양한 방법으로 그려 볼 수 있는 스크립트가 있더군요.

 

http://www.mathworks.com/matlabcentral/fileexchange/33124-batman-equation-the-legend

 

위 주소에 가셔서 아래 그림과 같이 코드를 다운로드 받을 수 있습니다.

 

다운로드 받은 zip 파일을 압축해제하고~ plotbatmaneq.m 파일을 실행해 보시면 아래 그림과 같은 결과를 얻을 수 있습니다.

 

아래 그림은 octave 에서 그려본건데요~ MATLAB 에 비해 약간 시간은 걸렸고~ 아래 그림과 같은 0 나누기 에러메시지는 나왔지만~

 

결과는 정상적으로 나오더군요.

 

재미있죠~

 

그 외 참조자료

 

http://www.wolframalpha.com/input/?i=batman+function&lk=4&num=1



MATLAB 을 사용시~ 저는 제 컴퓨터의 home 폴더를 주로 사용합니다.

 

리눅스라면~ /home/계정 폴더가 되겠고~ 윈도우라면~ 보통 C:\Users\계정 이 됩니다.

 

Windows 에서 MATLAB workspace 의 시작 위치는 간단하게 MATLAB 실행 링크 파일의 속성에 들어가서~ 아래 그림과 같이 원하는 시작위치를 설정하면 됩니다.

 

하지만 이 이외에도 MATLAB 을 사용 하다 보면 자신 만의 초기 설정을 하고 싶은 경우가 있습니다.

 

이런 경우에는 MATLAB 의 command windows 에서 아래 그림과 같이 userpath 라고 타이핑 하면 startup.m 파일을 넣을 위치가 나오게 됩니다.

 

보통 다음과 같이 C:\Users\계정\Documents\MATLAB 폴더가 되는데~ 자신이 원하는 폴더로 변경도 가능합니다.

 

그럼 MATLAB 에서 cd 명령을 이용하여~ 해당 폴더로 workspace 를 이동합니다.

 

edit startup.m 라는 명령어를 통해 startup.m 파일을 하나 만들어 줍니다.

 

그리고 다음 그림과 같이 간단하게 초기 시작 시에 설정하고 싶은 것들을 설정합니다.

 

저는 시작 폴더와~ 남성의 MATLAB 이라는 메시지가 나오도록 설정했습니다.

 

이제 startup.m 파일을 저장하고~ MATLAB 을 다시 실행해 보면~ 방금 설정했던 startup.m 파일의 내용대로 메시지가 나오는 것을 확인 할 수 있습니다.


필터 함수는 FIR 또는 IIR 필터링을 수행하는데 이용이 되는 함수이다.

다음과 같이

Z=filter(x,1,y); 하면 x 라는 필터 계수를 가진 필터로 FIR 필터링을 수행하는 것이다.

그런데 filter() 함수를 한번만 이용하는 것이 아니라 루프를 이용하여 필터링을 해야 하는 경우가 있다.

예를 들면 프레임 단위의 시뮬레이션을 하는 경우 등이다.

이럴 때는 filter() 함수의 옵션 몇 가지를 이용하면 가능 하다.

filter() 함수는 다음과 같이 이용할 수 있다.


[y,zf] = filter(b,a,X,zi)


위 표현에서 y 는 필터링 결과 zf 는 필터의 최종 상태, zi 는 초기 상태, b 는 필터의 numerator, a 는 필터의 denumerator, X 는 필터의 입력 이다.

zi 값은 a, b 의 길이중 최대값 -1 의 길이를 갖는다.

 

예를 들어 a=[1 ] 이고 b=[ 1 2 3 4 5] 라고 한다면

a 의 길이는 1 이고 b 의 길이는 5 이므로 zi 의 길이는 5-1 = 4 가 된다.

필터의 초기값으로 0 을 준다면 zi=zeros(4, 1) 이라고 선언을 하면 되는 것이다.

 

그럼 for 루프 안에서 필터링을 연속으로 하는 예를 들어 보자.

X=rand(100) 이라는 100 행 100 열의 매트릭스의 값을 각 열 별로 for 문을 이용하여 필터링을 해 볼 것이다.

 

X=rand(100); % X 의 값

a=[1]; % 필터의 denumerator

b=[1 2 3 4 5]; % 필터의 numerator

zi = zeros(4,1); % 필터의 초기 상태

Y=zeros(100); % 필터링 결과를 저장 할 버퍼

 

이제 for 문을 구성 해 본다.

 

for n=1:100

[Y(:,n) zi]=filter(b,a,X(:,n), zi); % 이 부분에서 필터 초기 상태와 필터 최종상태의 변수를

% 동일하게 놓음으로서 상태가 연속이 되도록 할 수 있는것이다.

end

 

위 결과값 Y(:) 는

Y2=filter(b,a,X(:)) 의 결과인 Y2 값과 동일한 결과이다.



아래 글에서는 Powershell 에서 Cartesian Product 를 구하는 방법에 대해 설명드렸었는데~ 


2013/08/18 - [powershell] - Powershell 경우의 수 조합 다 구하기(Cartesian Product)

 

이번 포스팅에서는 MATLAB에서 Cartesian Product 를 구하는 방법에 대해 설명 드리려 합니다.

 

사실 MATLAB 에서 Cartesian Product 를 구하는 방법은 매우 간단합니다.

 

바로 ndgrid() 함수를 이용하는 방법인데요~

 

다음과 같은 set 에 대해 조합의 경우의 수를 구해보죠~

 

A=[1 2];

B=[3 4];

C=[5 6];

 

경우의 수는 2 x 2 x 2 니까 8 개가 나오겠고 단순히 생각하면 for 문을 3개 중첩되게 만들면 해결 되겠지만~ 이보다는 ndgrid() 함수를 사용해서 아래와 같이 코딩하는게 더 좋은 방법이라고 생각됩니다.

 

A=[1 2];

B=[3 4];

C=[5 6];

 

sets = {A, B, C};

[x y z] = ndgrid(sets{:});

cartProd = [x(:) y(:) z(:)];


 

보시다 시피 굉장히 간단하게 구해지죠~ 위 코드를 실행 시켜보면 cartProd 변수에 결과가 저장되지만 아래 결과처럼 첫번째 열이 정렬이 안 되서 나옵니다.


 

경우에 따라 정렬이 필요하신 경우에는 sortrows() 함수를 사용해서 정렬 하시면 됩니다. sortrows() 함수의 두번째 인자는 정렬 기준이 되는 column index 를 의미 합니다.

 

2번째 column 을 기준으로 정렬하고 싶으신 분들은 아래 코드의 두번째 인자인 1 을 2로 바꾸시면 되겠죠~

 

sorted_cartProd =sortrows(cartProd, 1)

 

 

 

아래 주소에는 이에 대한 cartesianProduct() 라는 함수도 소개되고 있으니 필요하신 분들은 사용해 보시기 바랍니다.

 

http://stackoverflow.com/questions/4165859/matlab-generate-all-possible-combinations-of-the-elements-of-some-vectors


요즘 오라클, MY-SQL 과 같은 데이터베이스 프로그램들 많이들 사용하실텐데요~

 

이와 같은 데이터베이스 프로그램들은 네티워크 기반의 프로그램들인데 반해 SQLite 는 파일 기반의 데이터 베이스 프로그램 입니다. 요즘 안드로이드 폰 많이들 사용하실텐데~ 안드로이드에도 기본으로 SQLite 가 탑재 되어 있습니다. SQLite 에 대한 간단한 설명은 아래 주소를 참조하시기 바랍니다.

 

http://ko.wikipedia.org/wiki/SQLite

 

SQLite 는 다른 데이터베이스 프로그램들과 마찬가지로 다양한 컴퓨터 언어에서 사용할 수 있는 API 들을 제공하는데요.

 

오늘은 MATLAB 에서 SQLite 를 사용하는 방법에 대해 설명드리려 합니다. 프로젝트 명은 mksqlite 구요~ 프로젝트 주소는 아래와 같습니다.

 

http://developer.berlios.de/projects/mksqlite/

 

GNU LGPL 라이센스이고~ 보통의 오픈소스 프로그램들과 같이 바이너리와 소스코드 다운로드를 제공해 줍니다.

 

그런데 특이하게도 바이너리는 윈도우 바이너리만 제공해 주더군요. 것도 32 비트만 ㅋㅋㅋ

 

그래서 어차피 소스코드를 다운로드 받아서 각자의 MATLAB 에서 C-mex 를 이용하여 빌드를 해야 합니다.

 

소스는 아래 주소에서 다운로드 가능합니다.

 

http://developer.berlios.de/project/showfiles.php?group_id=9966&release_id=18976

 

아래 그림과 같이 현재는 1.12 버전이 가장 최신 버전이더군요. mksqlite-1.12-src.zip 파일을 다운로드 받아서 압축을 해제 합니다.

 

저는 일단 C:\Users\Administrator\Downloads\mksqlite-1.12-src 에 압축을 해제 했습니다.

 

이제 MATLAB 을 실행 합니다.

 

C-MEX 를 사용하기 위해서는 윈도우의 경우엔 Visual C++ 컴파일러와 . NET Framework 가 필요합니다.

 

http://www.mathworks.co.kr/support/sysreq/previous_releases.html

 

각자의 MATLAB 버전에 따라 사용가능한 컴파일러나 Framework 버전이 다를테니 위 주소에서 설치해야 할 프로그램을 확인 합니다.

 

아래 그림과 같이 Supported Compilers 를 확인 하시고 각자 운영체제에 맞게 설치 하시면 됩니다.

 

아래 주소 참조해서 Visual studio 와 SDK 를 설치 하시기 바랍니다.

 

http://www.mathworks.co.kr/support/solutions/en/data/1-ECUGQX/

 

SDK 설치시 중요한 부분은 아래 그림처럼 Visual C++ Compilers 에 꼭 체크를 해야 한다는 겁니다.

 

C- MEX 사용에 필요한 프로그램들이 다 설치가 됐으면 아래 그림처럼 MATLAB 에서 C-MEX 사용을 위한 setting 을 합니다. 맨 마지막에 Done ... 나오면 C-MEX 사용을 위한 셋팅은 끝난겁니다.



이제 MATLAB 의 workspace 를 압축 해제한 C:\Users\Administrator\Downloads\mksqlite-1.12-src 폴더로 갑니다.

 

아래 그림처럼 COMMAND 창에 buildit 라이고 친후에 엔터를 치면 각자 운영체제에 맞는 MEX 파일이 만들어 집니다. 저는 현재 윈도우 64 bits 여서 mksqlite.mexw64 라는 파일이 만들어 졌습니다.

 

 

요즘 많은 분들이 Windows 7 64 bits 를 사용하실테니 필요하신 분들은 아래 파일 받으시면 됩니다.

 

mksqlite.mexw64



이제 MATLAB 에서 sqlite 를 사용하기 위해서 mksqlite.mexw64 파일이 들어 있는 폴더를 MATLAB 의 path 에 추가 합니다.

 

command 창에서는 addpath('c:/디렉토리') 와 같이 하시면 되고~

 

set path 에 들어가셔서 아래 그림처럼 Add Folder 를 누르고 원하는 폴더를 설정하셔도 됩니다.

 

이제 만들어진 SQLite 를 MATLAB 에서 사용해 볼까요~

 

사용법에 대해서는 아래 주소에 간단하게 나와 있고~ 당연한 얘기지만 SQLite 문법에 대해 공부를 하셔야 합니다.

 

http://mksqlite.berlios.de/mksqlite_eng.html

 

저도 간단하게 예제를 만들어 봤습니다.

 

dbid = mksqlite('open', 'DataBaseFile.db'); % DataBaseFile.db 파일 열기

 

<TestTable 테이블 생성>

mksqlite(dbid,'CREATE TABLE TestTable (id integer primary key, Name text, unique(Name))'); 

 

< Database 에 자료 입력>

mksqlite(dbid,'INSERT INTO TestTable (Name) VALUES ("김철수")'); % 김철수 입력

mksqlite(dbid,'INSERT INTO TestTable (Name) VALUES ("안중근")'); % 안중근 입력

mksqlite(dbid,'INSERT INTO TestTable (Name) VALUES ("이순신")'); % 이순신 입력

 

< Select 해 보기 >

Req=mksqlite(dbid,'select * from TestTable') % TestTable 의 값들 보기

 

Command 창에서 Select 결과 확인를 확인해 보면 아래 그림과 같이 Struct 형태로 나오는 것을 확인 할 수 있습니다.

 

< Database 파일 닫기 >

mksqlite(dbid, 'close')

 

오늘 강좌는 여기까지 입니다.


간만에 MATLAB 관련 포스팅이네요.

 

하드를 뒤지다 보니~ 예전에 했던 Gibbs Phenomenon 에 대한 MATLAB 시뮬레이션 했던 것이 있어서 소개하려 합니다.

 

뭐 간단한 거지만 처음 아래의 시뮬레이션 했을때 굉장히 신기해 했던 기억이 납니다.

 

Gibbs Phenomenon 에 대한 것 보다는 어떻게 사각파가 사인파들의 합으로 구성이 될까~~ 하면서 신기해 했었죠 ㅋㅋㅋㅋ

 

아무튼~ Gibbs Phenomenon 은 불연속을 포함하는 파형이 푸리에 합성되었을 때 불연속 값 근처에서 나타나는 불일치 현상을 의미하는데~

 

MATLAB 코드는 다음과 같습니다.

 

n =999;

t = (-1.1:0.01:1.1).';

 

%%

 

for k = 0 : n

F(:, k+1) = 1 / (2 * k + 1) .* sin((2 * k + 1) * pi .* t )* 4 / pi;

F2=sum(F,2);

figure(1), plot(t, F2,'r:.'), grid on,axis([-1.5 1.5 -1.5 1.5])

end

 

코드는 무지하게~~ 간단하죠~

 

위 코드는 아래 그림과 같은 사각파를 푸리에 합성을 해서 도시하는 코드 입니다.

 

돌려 보시면 다음과 같은 영상을 확인 하실 수 있을 겁니다.




아래 포스팅에서 MATLAB 을 이용하여 BPSK, QPSK BER(Bits Error Rate)에 대한 시뮬레이션을 수행한적이 있는데요.

 


2011/03/27 - [MATLAB] - MATLAB QPSK BER simulation in AWGN channel


2011/03/19 - [MATLAB] - MATLAB BPSK BER simulation in AWGN channel



전자 공학을 공부하다보면 로그 스케일에 대해 다뤄야 할때가 있고 많은 그래프들을 로그 스케일로 그리게 되죠~

 

오늘은 MATLAB 에서 로그 스케일 그래프를 그리는 방법에 대해 간단히 설명 드리겠습니다.

 

MATLAB 에서 로그 스케일 그림을 그릴수 있게 해주는 함수로는 위 제목에서 밝힌데로 semilogx(),semilogy(), loglog()의 세가지가 있습니다.

 

semilogx() 는 함수 이름에서 추측할 수 있는 바와 같이 x 축을 로그 스케일로 표시 할 때 사용합니다.

 

semilogy()는 y 스케일을 loglog() 는 x,y 축을 로그스케일로 표시할 때 사용합니다.

 

간단하게 예제를 하나씩 그려보죠~~ 코드는 다음과 같구요.

 

x= 0:0.1:10;

x_10=10.^x;

 

figure, subplot(211), plot(x_10,x), grid on

title('Real scale')

subplot(212), semilogx(x_10,x), grid on

title('semilogx')

 

%%

 

figure, subplot(211), plot(x,x_10), grid on

title('Real scale')

subplot(212), semilogy(x, x_10), grid on

title('semilogy')

 

%%

 

figure, subplot(211), plot(x_10,x_10), grid on

title('Real scale')

subplot(212), loglog(x_10,x_10), grid on

title('loglog')

 

이런 결과가 나옵니다. 그림에 따라 각 축이 로그 스케일로 적용된 것을 확인 할 수 있습니다.

 

<semilogx>

 

<semilogy>

 

<loglog>


아래 포스팅에서 MATLAB 에서 recursive 하게 하위 디렉토리까지 파일 검색 하는 방법에 대해 설명한 적이 있는데요~

 


2011/12/21 - [MATLAB] - MATLAB dos 명령 사용하기


 

위 주소에서 사용한 방법은 dos command 의 dir 을 사용해서 처리를 했었습니다.

 

검색을 하다 보니 rdir 이라는 괜찮은 함수가 있어서 소개합니다.

 

아래 주소에서 rdir 함수를 다운로드 할 수 있습니다.


 

http://www.mathworks.co.kr/matlabcentral/fileexchange/19550-recursive-directory-listing


 

위 주소에서 아래 그림처럼 download 버튼을 누르면 rdir() 함수를 다운로드 할 수 있습니다.

 

 

다음으로~ rdir 함수를 MATLAB 에서 사용할 수 있게 path 설정을 해 줍니다.

 

MATLAB command 창에 path 라고 쳐 보면~

 

MATLAB 에서 검색 가능한 path 들이 나오는데~ 그 중의 아무 폴더에 다운로드 받은 rdir.m 파일을 넣으시면 됩니다.

 

저 같은 경우에는 D:\MATLAB_LIBRARY 라는 폴더를 하나 따로 만들어서 그 곳에 라이브러리 파일들을 보관하곤 합니다.

 

당연히 D:\MATLAB_LIBRARY 폴더는 MATLAB path 로 설정되어 있구요.

 

MATLAB 의 path 설정을 하는 방법은 File  → Set Path 메뉴에 들어가서 할 수 있습니다.

 

path 설정은 아래 포스팅에서도 그림과 함께 소개한 바 있으니 참조하시기 바랍니다.

 

http://iamaman.tistory.com/703

 

command 창에서 path 설정하는 방법은 아래 예와 같이 하면 됩니다. 빨간 글자로 표시한 부분에 추가하고자 하는 폴더명을 넣으시면 됩니다.

 

addpath('D:\MATLAB_LIBRARY')

 

path 설정을 했으면 MATLAB 에서 위에서 다운로드 받은 rdir() 함수를 사용해 보죠~

 

 

위 예는 현재 폴더 및 하위 폴더에서 m 파일을 다 찾으라는 명령어 입니다.

 

눈치 빠른 분들은 아시겠지만, * 을 두 번 하면 해당 폴더 및 하위폴더를 의미 합니다.

 

위 결과에 있는 datenum 나 bytes 같은 field 를 이용하여 TEST 조건을 줄 수도 있습니다.

 

예를 들어 현재 및 하위 폴더의 100 바이트 이상의 m 파일만 찾는 예제는 다음과 같습니다.

 

 

써보니 상당히 편하고 좋은 것 같네요~


+ Recent posts