본문 바로가기
Python

python에서 MATLAB .mat 파일을 읽어오자

by irmus 2008. 8. 18.
공돌이들의 영원한 성역 MATLAB. 학교나 대기업에서는 많이 사용하지만, 우리처럼 작은 회사에서는 언감생심, 그림의 떡, 좋은건 알지만 너무 비싸서 못쓰는 프로그램. 그래서 공짜 python을 쓰는 중이긴 한데...
다른 업체와 같이 일하면서 전달받은 자료가 MATLAB에서 저장된 mat 파일인 경우에는 살짝 난감. 그러나 막강 python에는 왠만한 MATLAB 기능은 다 가지고 있으니, 찾으면 나오게 마련.
구글링하면 mat file을 열기위한 여러가지 방법들이 나오고 있지만 가장 심플하면서 신뢰성 있는 방법은 scipy 모듈을 사용하는 것. 얼씨구나, scipy는 이미 깔려있는거다.

scipy.io.mio.loadmat()

from scipy import io

mat_file = io.loadmat('data.mat')

간단하게 한줄로 끝...은 아니고, 이렇게 하면 data.mat 파일을 읽어 python dicnationary로 만들어준다. python shell에서 mat_file을 살펴보면 어떤 구성인지 보인다.

>>> mat_file
{'tn': array([ 14.001,  14.002,  14.003, ...,  17.298,  17.299,  17.3  ]), 'yn': array([  2.84377000e-04,   3.75931000e-04,  -5.54400000e-06, ..., -1.88240400e-03,  -1.76033200e-03,  -2.80207000e-04]), '__version__': '1.0', '__header__': 'MATLAB 5.0 MAT-file, Platform: PCWIN, Created on: Tue Aug 12 15:00:02 2008', '__globals__': []}
대충 보면 Windows용 MATLAB 5.0에서 만들어진 파일이고, tn, yn 두개의 array가 들어있다. 아마도 시간축 기준으로 y 값을 저장해 놓은 모양이다. 변수 이름에 n이 붙어있으니 digitized data일 것이고, sampling period는 tn[1]과 tn[0]의 차이겠지. 여기에서는 0.001이니깐 1kHz sampling인가보다.

자, 이제 각각의 array를 뽑아내려면 아래와 같이 하면 된다.
tn = mat_file['tn']
yn = mat_file['yn']

이제부터는 그냥 array일 뿐이니 각자 마음대로 쓰면 된다. 간단하게 x-y plot해볼까? 하는김에 FFT도
from pylab import *

figure(1);plot(tn, yn); title('MATLAB data')
figure(2);semilogy(abs(fft(yn))); title('FFT'); show()


mat 파일을 읽은것 까진 좋았는데, 그 파일안에 든 내용이 좀 암울해서 살짝 좌절중...