はじめてMATLABを5時間くらい使ったのでメモ。

#結構検索して見に来てくれる人がいるのに内容なくて申し訳ないので、よさそうなサイトへのリンクを貼っておきます。

MATLABプログラミング入門
MATLABプログラミング入門
posted with amazlet at 11.12.29
上坂 吉則 牧野書店 売り上げランキング: 7572

基本的な使い方は、分かる人が周りにいないとちょっと難しかったかもしれない。 フィルタの使い方とかhelp見ても難しかった。 でも、プログラム書くのは難しくはなかった。

今回書いたのは,24個のソースからの100HzのデータのCSVファイル(24列n行) がたくさんあって,そのデータにローパスフィルタをかけてからCSVファイルに保存する、っていうプログラム。

MATLABは行列でデータを処理していくのが正しい使い方で、要素毎にfor文で、っていうのはよくないみたい。

プログラムはこんな感じ。(一部省略) MATLAB初心者なので、冗長な部分や間違ってる部分があると思います。

[matlab] sourcepath = 'csv';
sourcefiles = dir(fullfile(sourcepath,'/*.csv'));
outpath = 'filtered_csv';

c=0;
for i=1:size(sourcefiles, 1)
curfile = sprintf('%s/%s', sourcepath, sourcefiles(i).name); outfile = sprintf('%s/%d.csv', outpath, c); %curfile

%read csv file
data = csvread(curfile, 1, 1);

%low pass filter
[B, A] = butter(10, 1/5, 'low');
answer = filter(B, A, data);

dlmwrite(outfile, answer, 'precision', '%.5f');

c = c+1;

end
[/matlab]

部分毎にメモ。

[matlab] sourcepath = 'csv';
sourcefiles = dir(fullfile(sourcepath,'/*.csv'));
[/matlab]

csvディレクトリの、全てのcsvファイルを処理したい。
sourcefilesを後に出てくるfor文で一つずつ処理する。

[matlab] c=0;
for i=1:size(sourcefiles, 1)
curfile = sprintf('%s/%s', sourcepath, sourcefiles(i).name); outfile = sprintf('%s/%d.csv', outpath, c); %curfile [/matlab]

ここのforループでsorcefilesに来るファイルを一つずつ処理。 cはカウンタ。
処理するファイル名ををcurfileに入れる。 出力するファイル名をoutfileに入れる。 %で始まる行はコメント。この行は,デバッグ時にcurfileを表示してた。行末にセミコロンを付けないと,行の結果が標準出力に出る。 変数名を書けば、その変数をプリントするような感覚?で使える。

[matlab] data = csvread(curfile, 1, 1);
[/matlab]

curfileで指定するcsvファイルを読み込んで,dataに入れる。行列になる。
1, 1 というのは,1行目と1列目を除くっていう意味。今回扱うファイルは1行目、1列目に属性名が入っていたので、そこを除いて処理にかける。

たしかcsvreadっていう関数の中でdlmreadっていう関数が呼ばれる。

[matlab] [B, A] = butter(10, 1/5, 'low'); answer = filter(B, A, data); [/matlab]

10次のlowpassのButterworseフィルタを作って、係数をA, Bに代入。
参考: バターワースフィルタ - Wikipedia

1/5というのは,100Hzのデータに対して20Hz以上の部分をカットしてしまう、という意味。
係数を指定して、先ほど読み込んだ行列dataをfilterにかける。結果の行列をanswerに入れる。

[matlab] dlmwrite(outfile, answer, 'precision', '%.5f');
[/matlab]

結果の行列answerをファイルに書き込み。 書き込むファイル名はoutfileから参照。

csvwriteという関数もあるけど、有効数字の指定をするためにdlmwriteを使ってる。

そんな感じ。 フィルタを簡単に使えるのがいい。たしかに慣れたら便利そう。