본문으로 바로가기

MATLAB을 이용해서 시뮬레이션을 하다보면 어떤 이유에서든 원신호에 약간의 오차를 주고 싶어질 때가 있습니다. 특히, 오차범위를 정해놓고 작업을 해야하는 경우가 간혹 발생하는데, 이부부을 구현하는 방법이야 많겠지만, 특별히 간단히 rand 함수를 이용해서 오차를 생성해보겠습니다.

먼저 대상 신호를 만들어보죠.

t = 0:0.01:10;

y = sin(2*pi*t);

이렇게 하면

이런 신호가 하나 만들어 집니다. 이제 저의 목표는 저 신호를 10%이내 범위에서 파괴하는겁니다. 그럼 제목에서도 밝혔듯이 rand함수에 대해 간단히 알아보겠습니다.

rand함수는 랜덤변수를 생성합니다. 그런데 rand함수는 0과 1사이에서 임의의 변수를 생성합니다. 사용법은

rand(X,Y)

이렇게 하면 X*Y크기를 가진 0과 1사이의 임의의 실수로 만들어진 행렬을 생성해줍니다. 그래서 저는 방금전 코드에 이어서

e = rand(1,length(t))/10;

이렇게 에러를 생성합니다. 처음 데이터와 같은 크기를 가지도록하는 것이고, 뒤에 "/10"은 5%이내로 오차를 생성할 것이기 때문입니다. 왜 10%가 아니라 5%의 에러냐면,  센터를 기준으로 나눌것이기 때문입니다. 그래서 생성된 에러는

와 같습니다. 0부터 0.1까지의 값을 랜덤하게 가지게 된 것입니다. 이 값에서 0.95를 더하면

입니다.

이제 이 데이터를 원래 y값에다가 곱할 겁니다.

y1 = (e+0.95).*y;

이렇게 구현하면 

이렇게 됩니다. 음... 확실히 하기 위해 피크치부분을 확대해 보겠습니다.

이렇게 해서 원하는 결과를 얻을 수 있습니다. 구현을 위한 전체코드는

t=0:0.01:10;
y = sin(2*pi*t);
e = rand(1,length(t))/10;
y1 = (e+0.95).*y;

plot(t, y)
axis([0 10 -1.5 1.5])
grid on
hold on
plot(t, y1, 'r')

입니다.


댓글을 달아 주세요

  1. BlogIcon 바람처럼~ 2010.03.19 18:47 신고

    전 공학은 다음 생애에서도 무리 ㅠ_ㅠ

  2. 켄신 2010.03.19 19:06 신고

    감사합니다 많은 도움이 되었습니다 이렇게 상세히 적어주시다니

    이해가 잘 되네요 ㅎㅎ

  3. 켄신 2010.03.19 19:33 신고

    근데.. 한가지 질문이 있는데요

    파란색 선을 기준으로 빨간색(랜덤 변수) 선이 항상 크게 나타나나요? 오차라 하면은

    피크치 부분이 파란색 선보다 0.05이내로 작게 나타날수는 없는 건가요?

    • BlogIcon PinkWink 2010.03.20 06:32 신고

      저런... 음...
      마지막 그림을 보시면 원래의 값보다 작은 값을 가지는 곳도 있고 높은 값을 가지는곳도 있는데요...ㅜㅜ

      예를 들면 2.2초가 막 지난 부분이라던지...
      3.2초 지점등등등등...^^

  4. 3학년 2010.03.20 16:41 신고

    아 너무 친절한 설명!
    머리에 쏙쏙 박히네용 감사합니당!!!

  5. 2010.03.21 00:20

    비밀댓글입니다

  6. 2010.03.21 11:07

    비밀댓글입니다

  7. BlogIcon 탐진강 2010.03.22 02:04 신고

    어렵지만 자꾸 보면 가깝게 느껴지는군요. ^^;

    • BlogIcon PinkWink 2010.03.22 03:54 신고

      헉... 저..정말요??? ㅎㅎ
      혹시 제가 설명을 잘해서는 아닐까요???? 헉...ㅜ.ㅜ(지성..^^)
      좋은 한주 보내세요^^

  8. BlogIcon 핑구야 날자 2010.03.24 08:12 신고

    허걱 영어보다 어렵네요,,, 원리는 알아듣게 설명은 잘해주셨는데...헐,

  9. 불타는가슴 2011.05.11 16:07 신고

    신호에 error를 어떤식으로 주나 궁금해했던 적이 있었는데... 딱이거네요 ㅋㅋ

  10. 두식이 2012.04.08 01:20 신고

    복잡한 신호에서의(대략위에서 세번째 그림같은) 양의 피크치는 어떻게 구하죠??

    • BlogIcon PinkWink 2012.04.08 20:38 신고

      단순히 피크값을 구하고 싶으시다면, min, max함수를 사용해보시는 것도 괜찮을 겁니다. 만약 모든 피크치를 다 구하고 싶으시다면, 음... 약간 고민을 해봐야겠는데요.

  11. MATOS 2014.04.07 15:06 신고

    하나 질문이 있습니다!!

    위 5% 만큼의 에러를 생성하는 코드(e = rand(1, length(t))/10)에 추가적으로 -0.05를 해줘야 하지 않을까요?

    그래야 -0.05~0.05 까지의 5% 에러를 낼 수 있는 uniform random code가 생성될 것 같습니다.

    항상 좋은 자료 올려 주셔서 감사합니다!!

    • BlogIcon PinkWink 2014.04.07 18:25 신고

      어떻게 구현하는가의 차이이지 않을까합니다.
      그 후 저는 다시
      y1 = (e+0.95).*y;
      를 통해 조정을 했거든요
      말씀하신것과 흡사한 방식으로 조절한것입니다.

  12. 2014.11.18 22:54

    비밀댓글입니다

    • BlogIcon PinkWink 2014.11.19 12:40 신고

      dec2bin(rand(1)*1000)
      이 명령을 사용해보시고, rand()뒤에 곱해져있는 1000의 '0'을 더 주거나 빼면 워하시는 자릿수가 만들어 질 듯 한데요^^