-
Scilab - 구형 펄스열의 진폭 스펙트럼, 위상 스펙트럼 그리기공부 2022. 9. 29. 13:45
본 포스팅은 작성자가 2020년에 수강했던 수치해석 강의에 제출한 과제를 바탕으로 작성되었으며, 현재의 scilab과 문법이 다를 수 있습니다. 또한 학부 수준의 지식으로 작성되었기에 틀린 부분이 존재할 가능성이 다분합니다.
.
.
.
scilab을 이용하여 T의 주기를 갖고, p의 펄스폭을 갖는 구형 펄스열의 크기와 위상 스펙트럼을 그려볼 것입니다.
주기를 갖는 함수의 크기와 위상 스펙트럼을 그리기 위해서는 먼저 푸리에계수 Cn을 구해야 하는데 Cn을 구하기 위해 복소푸리에적분을 이용합니다. 복소푸리에적분의 공식은 다음과 같습니다.

위 공식에서 T0는 스펙트럼을 구할 신호의 주기이고, x(t)는 스펙트럼을 구할 신호입니다. 또한 적분구간은 한 주기입니다.

적분의 의미는 위 이미지에서 보시는 바와 같이 피적분함수의 적분구간을 굉장히 작게 쪼갠 후, 쪼갠 부분의 넓이를 모두 더하는 것입니다. 이를 이용하여 scilab에서 Cn을 구할 수 있습니다.
Cn을 구했다면 Cn의 크기와 위상을 구해야 합니다. Cn의 형태는 복소수로, A+jB로 표현할 수 있습니다. A+jB의 크기는 $\sqrt{A^2 + B^2}$ 입니다. 또한 A+jB의 위상은 $tan^{-1}(\frac{B}{A})$입니다.

위는 작성한 코드입니다.
먼저, 구형 펄스열의 주기 T와 펄스폭 p를 정의 합니다. 또한 기본주파수 w를 $\frac{2π}{T}$로 정의 하고, j를 $\sqrt{-1}$로 정의합니다.
첫 번째 함수 f(x)는 주기가 T, 펄스폭이 p인 구형 펄스열입니다.
x가 2보다 크면 2보다 작아질 때까지 x에 x-T를 대입합니다.
x가 -2보다 작으면 -2보다 커질 때까지 x에 x+T를 대입합니다. 이제 x의 절댓값이 p/2보다 작으면 1, 크면 0을 반환합니다. 첫 번째 함수의 값은 구형 펄스열의 값과 같습니다.
두 번째 함수 Abs(x)는 Cn의 크기를 구하는 함수입니다.
r에 복소수 x의 실수부인 real(x)를 대 입하고, i에 복소수 x의 허수부인 imag(x)를 대입합니다.
이제 복소수 x의 크기인 $\sqrt{r^2+i^2}$이 0.0001보다 작으면 0, 크면 복소수 x의 크기인 $\sqrt{r^2+i^2}$을 반환합니다. (출력이 0.000000일 때 앞에 -가 붙는 것을 방지하기 위함)
세 번째 함수 Angle(x)는 Cn의 위상을 구하는 함수입니다.
r에 복소수 x의 실수부인 real(x)를 대입하고, i에 복소수 x의 허수부인 imag(x)를 대입합니다.
이제 복소수 x의 위상인 $tan^{-1}(\frac{i}{r})$가 0.0001보다 작으면 0, 크면 복소수 x의 위상인 $tan^{-1}(\frac{i}{r})$를 반환합니다. (출력이 0.000000일 때 앞에 -가 붙는 것을 방지하기 위함)
이제 스펙트럼을 구하기 위해 n값에 따른 Cn을 구합니다.
먼저 적분변수의 증가량인 h를 0.002로 정의합니다.
n이 -15부터 15까지일 때의 스펙트럼을 구하기 위해 for문을 이용하여 n을 -15부터 15까지 증가시켜줍니다.
다음으로 for문 안에서 sum에 0을 대입하고 Cn을 구하기 위한 for문을 시작합니다.
두 번째 for문은 적분변수 t를 0부터 T까지 구형 펄스열의 한 주기동안 h만큼 증가시킵니다.
두 번째 for문 안에서는 sum에 피적분함수 f(t)*exp(-j*n*w*t)/T를 h만큼 쪼갠 조각의 넓이인 h*f(t)*exp(-j*n*w*t)/T를 계속해서 더해줍니다.
두 번째 for문이 끝난 후에 sum은 Cn과 같습니다.
이제 함수 Abs와 Angle을 이용하여 sum 의 크기와 위상을 출력합니다.
마지막으로 plot을 이용해 주파수값(n*w)에 따른 크기와 위상을 각각 빨간색 과 파란색으로 표시합니다.
위 작업을 n을 -15부터 15까지 증가시키며 반복하여 진폭 스펙트럼과 위상 스펙트럼을 그립니다.

출력은 위와 같습니다.

스펙트럼은 위와 같습니다.
'공부' 카테고리의 다른 글
VHDL 디지털시계 소스코드 (0) 2025.01.05 Atmega128 - 장애물 피하기 게임 만들기(2) (0) 2022.10.03 Atmega128 - 장애물 피하기 게임 만들기(1) (0) 2022.09.30