matplolib/신호및시스템

DTFT예시코드 분석(2) 주파수 변화에 따른 선도(plot) 변화

JackSmith 2023. 5. 27.

[사전지식]

DTFT는 주어진 이산시간 신호를 주파수 영역에서 연속적인 스펙트럼으로 변환한다. 변환된 주파수 영역에서는 신호의 주파수 성분이 표현되며, 이를 통해 신호의 주파수 특성과 주파수 성분의 세기 및 위상 정보를 추출할 수 있다.

Def.)

X(e^jw) = Sigma(from n=-infinity to n=+infinity) [ x[n] * e^(-jwn) ]

X(e^jw): DTFT의 결과인 주파수 도메인 복소 스펙트럼

x[n]: 이산 시간 신호를 나타내는 시퀀스

e^(-jwn): 각각의 주파수 성분을 표현하는 복소지수함수

-변환은 변수 w에 대해 연속적으로 수행되며, 일반적으로 [-np.pi, +np.pi] 또는 [0, 2*np.pi] 범위에서 주파수를 표현한다.

 

[실험내용]

-numpy와 matplotlib 라이브러리 사용, 'np.linspace'를 사용하여 0부터 1까지의 시간벡터를 생성해준다.

(0부터 1까지 사이에 1000개의 아톰을 생성하는데, 이를 위해 0부터1까지의 간격에 대해 (1000-1=999)등분을 해준다.

-주파수가 1Hz인 사인파 신호를 생성한다.

-이후 'np.fft.fft'를 사용하여 signal의 'DTFT'를 계산하고, 'np.fft.fftreq'를 사용하여 signal의 주파수 축을 생성한다.

-이후 'plt.plot'를 사용하여 화면상에 선도(plot)한다.

->추후, f=[1, 10, 20, 40]와 같이 주파수에 변화를 주어 선도의 변화를 관측한다.

 

 

import numpy as np
import matplotlib.pyplot as plt

#폰트 꺠짐 방지
plt.rcParams['font.family'] = 'Malgun Gothic'
#특수문자(-) 깨짐 방지
plt.rcParams['axes.unicode_minus'] = False


#신호 생성하기
t = np.linspace(0, 1, 1000) #시간 벡터 #0에서 1사이에 1000개의 아톰을 배치한다-> (0-1)을 999등분 한다.
f = 1 #신호의 주파수 #어차피 데칼코마니이니까 x의 양축을 선도하고, y축에 대해 뒤짚어주기
signal = np.sin(2 * np.pi * f * t)

#DTFT 계산하기
dtft = np.fft.fft(signal)

#주파수 축 생성하기
freq = np.fft.fftfreq(len(signal), d=t[500]-t[0])


#시간 영역에서 신호 플롯하기
plt.figure(figsize=(10,5))
plt.subplot(2,1,1)
plt.plot(t, signal)
plt.xlabel('시간')
plt.ylabel('진폭')
plt.title('시간 영역의 신호')


#DTFT 스펙트럼 플롯하기
plt.subplot(2,1,2)
plt.plot(freq, np.abs(dtft))

plt.xlabel('주파수 (Hz)')
plt.ylabel('크기')
plt.title('DTFT 스펙트럼')
plt.grid(True)

plt.tight_layout()
plt.show()

위 코드는 주파수가 1(Hz)일때의 코드이다.

 

 

[실험결과]

-시간영역의 신호: f값이 커질수록, 굴곡이 중앙으로 shrink되는 것을 확인할 수 있었다.

-DTFT 스펙트럼: f값이 커질수록, 두 축이 중앙으로 shrink되는 것을 확인할 수 있었다.

 

[실험 결과 분석 및 고찰]

f값이 커지면 시간영역이든 주파수영역이든 그래프가 중앙으로 수축되는 것을 확인할 수 있었다.

댓글