[사전지식]
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값이 커지면 시간영역이든 주파수영역이든 그래프가 중앙으로 수축되는 것을 확인할 수 있었다.
'matplolib > 신호및시스템' 카테고리의 다른 글
DTFT예시코드 분석(1) 샘플링주파수 변화에 따른 선도(plot) 변화 (0) | 2023.05.27 |
---|---|
푸리에 변환에 대해 알아보자! (3) | 2023.04.12 |
ReLU함수에 대해 알아보자! (1) | 2023.03.24 |
sigmoid(시그모이드)함수에 대해 알아보자! (1) | 2023.03.24 |
댓글