IIR digital filterって?
スポーツバイオメカニクスの分野では、計測データのフィルタリング(平滑化)
に主としてこのIIRデジタルフィルタを用います。なぜ、IIRフィルタを使うかっ
ていうことをうまく説明出来る人はなかなかいません。単に先駆者であるWinter
等がIIRフィルタを用いたからでしょう。別にIIRフィルタではなく、FIRフィル
タでも構わないのですがね。目的とする信号の周波数と取り除きたい周波数成分
を見極めて使用することが肝心です。
Mathematicaでフィルタリング
Mathematicaは強力なツールですが、繰り返し計算が苦手です。特にフィルタの
ようにループを使う場合には大変遅く、いらいらします。そこで、MathLinkを使っ
てCプログラムでこの処理をやらせることにしました。こうすると1000倍位早く
なります。
ソース for Any OS
下記のソースを自分の環境下でコンパイルすることで利用可能です。
- iir.c
- iir.tm
例えば、CNS環境下でコンパイルするには次のようにします。
%setenv CC gcc
%make -f Makefile.iir
/* 実行してみる */
%iir
Create link:10000
/* Mathematica側で */
In[1]:= link = Install[LinkConnect["10000"]]
Out[1]= LinkObject[10000@ccz00, 1, 1]
/* これで利用可能 */
In[2]:= ?IIRCVersion
Global`IIRCVersion
IIRCVersion[fs_Real, fc_Real, data_List] :=
ExternalCall[LinkObject["10000@ccz00", 1, 1],
CallPacket[0, {fs, fc, data}]]
で、Makefile.iirはというと
# This makefile can be used to build all or some of the sample
# programs. To build all of them, use the command
# 'make all'. To build one, say addtwo, use the command
# 'make addtwo'.
MLINKDIR = /usr/local/mathematica/AddOns/MathLink/DevelopersKits
SYS = Solaris
CADDSDIR = ${MLINKDIR}/${SYS}/CompilerAdditions
INCDIR = ${CADDSDIR}
LIBDIR = ${CADDSDIR}
CC = gcc
MPREP = ${CADDSDIR}/mprep
all : iir
iir : iir.tm.o iir.o
${CC} -I${INCDIR} iir.tm.o iir.o -L${LIBDIR} -lML -lm -lsocket -lnsl -o $@
.c.o :
${CC} -c -I${INCDIR} $<
iir.tm.c : iir.tm
${MPREP} $? -o $@
とこんな具合。
/usr/local/mathematica-4.1/AddOns/MathLink/DevelopersKits/Solaris/MathLinkExamples/
以下にサンプルがあり、ここにMakefileの雛形があるのでこれを借用すればよい。
バイナリ for W2K
- iir.exe