본문 바로가기
Python

파이썬에서 fft를 출력할때 고려해야할 사항

by 붕어사랑 티스토리 2024. 5. 16.
반응형

1. fftshift와 fftfreq 그리고 plot

 

매틀랩에서는 fft데이터를 flot할 때 fftshift를 한번 해주고 plot했던 기억이 있다

 

이유는 DFT는 주파수 0에서 다음주기 주파수까지 샘플링 하기 때문이다.

 

하여 원 신호의 주파수 리스폰스(데칼코마니처럼 생긴거)를 보려면, fft한 결과를 반으로 잘라서 오른쪽에있는걸 왼쪽으로 옮겨주어야 한다. 이를 fftshift함수로 이용한다.

 

 

 

나비로 비유하자면, fft로 계산한 결과값은 나비 왼쪽날개가 오른쪽으로 가고, 오른쪽 날개가 왼쪽으로 가있는 상태라, 이를 fftshift로 옮겨주면 된다는말

 

 

 

 

헌데 파이썬에서는 굳이 fftshift를 안하고 데칼코마니 모양으로 플롯할 수 있다. 코드상 더 깔끔하다

 

 

fftfreq는 샘플갯수와 주파수 간격을 입력해주면 x축에 출력할 주파수 축 array를 만들어준다.

array 절반을 기준으로 좌측은 양의 주파수, 우측은 음의 주파수. 나비로 비유하면 오른쪽날개, 왼쪽날개를 만들어준다.

 

이를 그대로 plot하면, 왼쪽날개는 음의값을 가지므로 좌측에 출력되고, 오른쪽날개는 양의값을 가져 우측에 출력되어 굳이 fftshift를 하지 않아도 데칼코마니가 출력된다.

data = [ 나의 데이터 ]

sampling_rate = 250



fft_data = np.fft(data)
freq = np.fft.fftfreq(N, 1/sampling_rate)
plt.plot(freq, np.abs(fft))

 

예를들어

 

x = [1,2,3,-1,-2,-3]

y = [1,2,3,4,5,6]

 

위 데이터를 출력하면 -3은 6이랑 매칭되어 가장 좌측에 출력되는 원리이다.

 

 

 

2. DC Component와 Harmonic Distortion

 

학교에서는 배울때는 단순히 시뮬레이션이라 몰랐는데, 실제 현업에서 센서 데이터를 읽어오면 노이즈 문제가 발생한다.

 

여기서 두가지  노이즈를 기본적으로 고려해야한다. 바로 DC Component와 Harmonic Distortion이다

 

 

DC Component는 직류전원에 의한 노이즈, 즉 주파수가 0인 데이터값이다. 

 

Harmonic Distortion은 교류전원에 의해 발생하는 성분으로, 교류 주파수와 그의 배수 에서 생기는 노이즈이다. 갸령 60hz 전원을 쓰고있으면 60, 120, 180 등에서 노이즈가 나타난다.

 

각각의 노이즈를 제거하는 방법은 다음과 같다

 

  • DC Component : 신호의 평균값을 빼준다. detrend 함수가 이를 작업해준다
  • Harmonic distortion : 각각의 하모닉에 노치필터를 적용해준다

 

import numpy as np

# 가정: 'signal'이라는 이름의 numpy 배열이 있고, 이 배열에는 DC 컴포넌트를 제거하려는 신호가 들어있습니다.

# 신호의 평균을 계산합니다.
mean = np.mean(signal)

# 신호에서 평균을 뺍니다. 이렇게 하면 DC 컴포넌트가 제거됩니다.
signal_without_dc = signal - mean

 

DC Component가 평균값인 이유는 다음과 같다

 

 

 

 

위식의 첫번째 에서 주파수성분이 0인값은 X(0) 이다. 식을 대입해보면 결국엔 x(n)의 합이고 이는 N*평균값과 같다.

이값을 시간도메인에서 값을 구하는 방법은 아래 IDFT에서 X(0)를 제외한 나머지 값을 전부 0으로 세팅하면 된다.

그러면 1/N * X(0) 값만 남게되고 이는 곧 평균값이다.

 

 

반응형

댓글