본문으로 바로가기

# FFT_python

category Domain/Audio 2020. 7. 5. 18:02

아날로그 신호는 사람이 보기에는 하나의 신호로 보이지만 잡음(노이즈) 등 여러 신호들이 섞여있는 형태다.

이런 신호를 주파수 영역에서 보면 각각 주파수 성분을 가지는 신호로 분해가 가능하다.

[시간-진폭 => 주파수-진폭 변환]

 

[python-FFT]

1. x,  y  신호 임의 생성

- x는 20Hz를 가지며, y는 50Hz의 신호를 가짐

- Sampling rate : 2000Hz

#-*- coding:utf-8 -*-
import matplotlib.pyplot as plt
import numpy as np
import math
%matplotlib inline

Fs = 2000.
Ts = 1 / Fs
te = 1
t = np.arange(0, te, Ts)

# Signal
x = np.cos(2*np.pi*20*t)
y = np.cos(2*np.pi*50*t)

plt.rcParams["figure.figsize"] = (15,4)
plt.rcParams['axes.grid'] = True

plt.plot(t, x, 'r')
plt.title('20Hz')
plt.xlabel('time/s')
plt.ylabel('y')
plt.show()

plt.plot(t, y, 'y')
plt.title('50Hz')
plt.xlabel('time/s')
plt.ylabel('y')
plt.show()

2.  x, y 각각 FFT 적용

- 적용 시, 다음과 같이 출력됨

# x 신호 FFT
Nx = len(x)
print("len x data : ", Nx)

kx = np.arange(Nx)
Tx = Nx / Fs
freqx = kx / Tx
freqx = freqx[range(int(Nx/2))]

yfx = np.fft.fft(x) / Nx
yfx = yfx[range(int(Nx/2))]

plt.plot(freqx, abs(yfx), 'g')
plt.xlim(0, Fs / 20)
# plt.ylim(-5, 10)
plt.show()

# y 신호 FFT
Ny = len(y)
print("len y data : ", Ny)

ky = np.arange(Ny)
Ty = Ny / Fs
freqy = ky / Ty
freqy = freqy[range(int(Ny/2))]

yfy = np.fft.fft(y) / Ny
yfy = yfy[range(int(Ny/2))]

plt.plot(freqy, abs(yfy), 'g')
plt.xlim(0, Fs / 10)
# plt.ylim(-5, 10)
plt.show()

 

3.  x, y 신호 합성

z = x + y
plt.plot(t, z, 'r')
plt.title('20 + 50(Hz)')
plt.xlabel('time/s')
plt.ylabel('y')
plt.show()

 

4.  합성 신호(x, y) FFT

N = len(z)
print("len z data : ", N)

k = np.arange(N)
T = N / Fs
freq = k / T
freq = freq[range(int(N/2))]

yfft = np.fft.fft(z)
yf = yfft / N
yf = yf[range(int(N/2))]

plt.plot(freq, abs(yf), 'b')
plt.xlim(0, Fs / 20)
# plt.ylim(-5, 10)
plt.show()

 

=> 다음과 같은 신호에서 band pass filter, low pass filter 등을 적용해 신호를 제거(=노이즈 제거) 또한 할 수 있음

'Domain > Audio' 카테고리의 다른 글

# Band pass Filter + Low pass Filter + High pass Filter_python  (3) 2020.09.17
# Spectrogram_python  (0) 2020.09.16