반응형

안녕하세요. 

 

Low Pass Filter, High Pass Filter, Band Pass Filter를 이용한 신호 처리와 FFT 변환으로 주파수 영역에서 필터가 제대로 동작했는지 확인하는 것까지 파이썬으로 구현합니다. 


from scipy import signal
import matplotlib.pyplot as plt
import numpy as np
import scipy.io
import os


mat_file = scipy.io.loadmat('signal1.mat')
(file_path, file_id) = os.path.split('signal1.mat')  # file path, file name

fs = 1024  # sample rate
order = 10  # order
cut_off_freq = 150  # cut off frequency

# raw signal
# t = np.linspace(0, 1, fs, False)  # 1 second
# sig = np.sin(2*np.pi*100*t) + np.sin(2*np.pi*50*t)  # signal
sig = mat_file[file_id[:-4]][0]

freq = np.fft.fftfreq(len(sig), 1/1024)

# filtered signal
sos = signal.butter(order, [cut_off_freq], 'low', fs=fs, output='sos')  # low pass filter
filtered = signal.sosfilt(sos, sig)

# raw signal fft
raw_fft = np.fft.fft(sig) / len(sig)
raw_fft_abs = abs(raw_fft)

# filter signal fft
filtered_fft = np.fft.fft(filtered) / len(filtered)
filtered_fft_abs = abs(filtered_fft)

# plot
fig, ((ax00, ax01), (ax10, ax11)) = plt.subplots(2, 2)

# raw signal plot : 0 row 0 column
ax00.plot(t, sig)
ax00.set_title('Raw Data Time Domain')
ax00.set_xlabel('Time [seconds]')
ax00.set_ylabel('Amplitude')

# filtered signal plot : 1 row 0 column
ax10.plot(t, filtered)
ax10.set_title('Filtered Data Time Domain')
ax10.set_xlabel('Time [seconds]')
ax10.set_ylabel('Amplitude')

# raw signal fft plot : 0 row 1 column
ax01.stem(freq, raw_fft_abs, use_line_collection=True)
ax01.set_title('Raw Data Frequency Domain')
ax01.set_xlabel('Frequency [HZ]')
ax01.set_ylabel('Amplitude')

# filtered signal fft plot : 1 row column
ax11.stem(freq,filtered_fft_abs, use_line_collection=True)
ax11.set_title('Filtered Data Frequency Domain')
ax11.set_xlabel('Frequency [HZ]')
ax11.set_ylabel('Amplitude')

# plot
plt.tight_layout()
plt.show()

 

 

1. Low Pass Filter

sos = signal.butter(order, [cut_off_freq], 'low', fs=fs, output='sos')
filtered = signal.sosfilt(sos, sig)

2. High Pass Filter

sos = signal.butter(order, [cut_off_freq], 'high', fs=fs, output='sos')
filtered = signal.sosfilt(sos, sig)

3. Band Pass Filter

sos = signal.butter(order, [150, 200], 'band', fs=fs, output='sos')
filtered = signal.sosfilt(sos, sig)

 


Low Pass Filter, Cut off frequency: 150Hz

 


High Pass Filter, Cut off frequency: 150Hz


Band Pass Filter, Cut off frequency: 150-200Hz

728x90
반응형
반응형

1. 상단 디스크 모양 (Figure 저장)

Figure 예시2
Figure 예시1 결과

 

 

 

2. plot 위 디스크 모양 (다른 이름으로 저장)

Figure 예시2
Figure 예시2 결과

 

 

Figure 예시 결과는 저장된 PNG 원본 그대로 붙임.

 

1번의 경우 그림도 작고 선명하지 않음.

 

 PPT에 선명한 그림을 넣으려면 2번이 적합함. 

 

2번의 경우 그림도 크고 legend, x axis, y axis 등 글씨가 선명함.

728x90
반응형
반응형

안녕하세요.

 

오늘은 파이썬으로 mat파일 불러오는 실습을 해보도록 하겠습니다. 

 

제가 matlab을 잘 사용하지는 못하지만, 데이터 사이언스에서 중요한 부분이 데이터 전처리 부분이기 때문에 

 

연습하고 있습니다. 

 

우선 mat파일 하나를 불러 오겠습니다.

 

 

5637 X 768 크기의 mat파일이 있습니다.

 

그리고 위의 표는 1 X 768의 부분을 plot 한 부분입니다. 

 

위 matlab을 python에서 똑같이 구현하겠습니다.

 

우선 mat을 불러오기 위한 scipy.io와 데이터 슬라이싱을 위한 numpy와 표를 그리기 위한 matplotlib를 임포트합니다.

 

 

 

 

 

1. mat파일을 불러오기 

 

import numpy as np
import matplotlib.pylab as plt
import scipy.io

mat_file_name =  "x_test_shuffled.mat"
mat_file = scipy.io.loadmat(mat_file_name)

 

loadmat으로 불러옵니다.

 

 

 

 

 

2. mat파일 타입

 

print(type(mat_file))

 

mat_file type

타입이 'dict'으로 찍히네요. 

 

dict의 속성은("index" : "data")이 있습니다. 그렇다면 좀 더 살펴보겠습니다.

 

for i in mat_file:
    print(i)

 

dict

mat파일을 살펴보니 인덱스가 네 개가 있습니다. 여기서 실제 데이터는 

 

"x_test_shuffled"라는 인덱스에 실제 matfile 데이터가 들어 있습니다.

 

 

 

 

3. mat파일 데이터 불러오기

 

mat_file_value = mat_file[mat_file_name[:-4]]

 

mat_file_name[:-4] 뒤에 .mat부분을 자릅니다.

 

 

 

 

4. mat파일의 사이즈 불러오기

 

print("size :",len(mat_file_value), "X", len(mat_file_value[0]))

 

 

5637 X 768

 

 

5. mat파일의 1 X 768 

(*주의사항 : matlab의 배열 인덱스 : 1부터 시작, python의 배열 인덱스 : 0부터 시작)

mat_file_x = []

for i in range(0, len(mat_file_value[0])):
      mat_file_x = np.append(mat_file_x, i)

 

 

 

6. mat파일 plot하기

 

plot을 하기 위해서는 x축과 y축의 갯수가 같아야 합니다.

 

print('x :',len(mat_file_x))
print('y :',len(mat_file_value[0]))

 

 

plt.title(mat_file_name[:-4])
plt.plot(mat_file_x, mat_file_value[0])
plt.show()

 

 

matlab 그래프와 python에서 그린 그림이 똑같이 나오네요.

 





import numpy as np
import matplotlib.pylab as plt
import scipy.io

mat_file_name = "x_test_shuffled.mat"
mat_file = scipy.io.loadmat(mat_file_name)

print(type(mat_file))

for i in mat_file:
    print(i)

mat_file_value = mat_file[mat_file_name[:-4]]

print("size :",len(mat_file_value), "X", len(mat_file_value[0]))   #x축

print(mat_file_name[:-4])

mat_file_x = []

for i in range(0, len(mat_file_value[0])):
    mat_file_x = np.append(mat_file_x, i)
print('x축 :',len(mat_file_x))
print('y축 :',len(mat_file_value[0]))

plt.title(mat_file_name[:-4])
plt.plot(mat_file_x, mat_file_value[0])
plt.show()





 

 

 

아직 많이 미숙하지만 좀 더 데이터를 다루는 연습을 해서 더 많은 글을 올리도록 하겠습니다.

728x90
반응형

+ Recent posts