FFT 가 되는 신호에 대한 zero padding 효과가 어떻게 되는지를 알아보자

다음과 같은 sin() 그래프가 있고 이에 대한 FFT 를 수행해보자

pha = linspace(0,2*pi,32)';

x=sin(pha);

y=fft(x);

figure(1), plot(pha,x,'b:.'), grid on

아래 코드와 같이 x 값의 뒤에 0 을 넣어 보자. 이를 zero padding 이라 한다.

x 값의 크기 만큼, 이 예에서는 32 만큼의 0을 뒤에 넣어 보자. 그리고 이에 대해 fft 를 해보자


 xZero = [x ; zeros(32,1)];

yy=fft(xZero);


 x 대한 fft 결과인 y 값과 zero padding 신호에 대한 fft 결과인 yy 같이 그리기 위하여 다음과 같이 x 축을 설정하고 FFT 결과에 대한 절대값 그래프를 확인해 보자.


 x_axis=0:length(x)-1;

x2_axis= length(x)/length(xZero)*(0:length(xZero)-1);

 figure(2), plot(x_axis,abs(y),'r:*' , x2_axis, abs(yy),'b-->'), grid on, title('| FFT reselt |'),legend('Original','Zero padded')


 

 

다음과 같이 Original 신호의 FFT 결과의 중간 중간에 점이 하나씩 생긴 것을 확인 있을 것이다.

, fft 이전 신호의 부분에 zero padding 하게 되면 FFT 이후에 그만큼 oversample 된다는 것을 있다.

나아가서 예에서 Original 신호의 중간에 두개씩이 생기게 하고 싶다면 개의 zero 넣어줘야 할까에 대해서도 생각해 있다.

x 뒷부분에 64개의 0 추가 준다면 점이 두개씩 생겨나게 된다.


MATLAB 수식 작성 중 초보자들이 많이 틀리는 부분이 element 간의 계산에 대한 부분인 것 같다.

x=[1:10]    

x = 1 2 3 4 5 6 7 8 9 10

y=[1:10]

y = 1 2 3 4 5 6 7 8 9 10

위와 같은 변수가 있고, x와 y의 element 간의 곱을 하기 위하여

z=x*y 라는 명령어를 넣고 결과가 나오기를 기대하는 것은 MATLAB 의 operator 에 대하여 정확한 이해가 되지 않은 사람들이 하는 실수이다.

MATLAB 은 기본적으로 매트릭스 연산을 기준으로 한다. 위에 설정한 변수 x, y 는 둘 다 1행 10열의 벡터이므로 x*y의 매트릭스 곱은 성립될 수 없다. element 간의 곱을 하려면 연산자 앞에 . 을 붙여야 한다.


z=x.*y 라는 명령어를 command 창에 넣어보면 정상적인 결과 값을 볼 수가 있을 것이다.


위의 예에서와 같은 비교적 간단한 경우는 문제 될게 없다.


하지만 비교적 복잡한 아래와 같은 예에서는 일일이 연산자 앞에 . 을 붙이는 것이 불편하게 느껴질 때가 있다.


z=x^2*y^2+3*x^5*y  

??? Error using ==> mpower

Matrix must be square.


이러한 경우 vectorize()라는 함수를 이용하면 쉽게 해결 된다.


q=vectorize('x^2*y^2+3*x^5*y')

   q = x.^2.*y.^2+3.*x.^5.*y


위의 q 라는 변수는 char 변수이다. 따라서 값을 얻기 위해서는 이에 대한 evaluation 필요하며 이를 행해주는 함수가 바로 eval() 이다.


z=eval(q)  

z = 4 208 2268 12544 47500 141264 355348 790528 1600884 3010000


위와 같이 정상적인 결과를 얻을 수 있다.

MATLAB notebook 을 이용해 보도록 하자.

본 기능을 이용하기 위해서는 당연히 MS Office 프로그램이 깔려 있어야 한다.

MATLAB Command Window에 다음과 같이 타이핑하면 다음과 같은 내용이 Command 창에 뜨면서

워드 창이 하나 뜰 것이다. 워드 창은 다음과 같은 추가 기능이라는 탭이 하나 생겼다.

워드 문서에 간단한 사인 그래프나 한번 그려 넣어보자.

매트랩을 이용하듯이 워드창에 똑같이 쓴다.

 이렇게 코드를 타이핑 했으면 이제 매트랩에서 실행시키듯이 똑같이 실행 시키면 된다.

실행시키고자 하는부분을 블록으로 설정하고 다음과 같이 오른쪽 버튼 클릭후 Evaluate Cells 를 클릭하자.

 

 워드 창에 아래와 같이 그림이 샤라락~ 하고 생기는걸 볼 수가 있다.

  

또한 MATLAB 에서도 x,y 변수가 Workspace에 저장이 된걸 확인 할 수 있고, 위의 그래프가 Figure 창에 나오는 것을 확인 할 수 있을 것이다.

 

매트랩 에디터의 기능중 사소하게 지나치기 쉬운 매우 유용한 스킬중 하나로 MATLAB iteration 기능을 하나 소개하고자 한다.

다음과 같이 0~2*pi 에 대하여 sin 그래프를 그리는 간단한 예를 들어보자.


x=0:0.01:2*pi;

a=1; y=sin(x)*a;

plot(x,y), grid on, axis([0 7 -20 20])

 

코드에서 a=1 값을 1 올려가며 바꾸고 바뀐 그림을 계속 보고자 for 문을 돌리거나 아님 간단히 1 2 바꾸고 실행한다거나 하면 것이다

 하지만, 우리는 iteration 기능을 이용하여 이를 수행해 보자

아래 동영상에서 보는 바와 같이 숫자 앞에 커서를 놓고 iteration + - * / 를 누르면 원하는 iteration을 수행할 수 있다.




  1. 행복지구 2017.04.14 18:01

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

+ Recent posts