IIR digital filterって?

スポーツバイオメカニクスの分野では、計測データのフィルタリング(平滑化) に主としてこのIIRデジタルフィルタを用います。なぜ、IIRフィルタを使うかっ ていうことをうまく説明出来る人はなかなかいません。単に先駆者であるWinter 等がIIRフィルタを用いたからでしょう。別にIIRフィルタではなく、FIRフィル タでも構わないのですがね。目的とする信号の周波数と取り除きたい周波数成分 を見極めて使用することが肝心です。

Mathematicaでフィルタリング

Mathematicaは強力なツールですが、繰り返し計算が苦手です。特にフィルタの ようにループを使う場合には大変遅く、いらいらします。そこで、MathLinkを使っ てCプログラムでこの処理をやらせることにしました。こうすると1000倍位早く なります。

ソース for Any OS

下記のソースを自分の環境下でコンパイルすることで利用可能です。
  1. iir.c
  2. 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

  1. iir.exe