#define MAXKAISUU s //微分演算をおこなう時に利用する過去の情報の最大数
#define m_chk_mean true //最終的に平均値を零とする処理をおこなうかどうか
#define m_DT 1.0 //時系列のサンプリング時間間隔
//入力信号をそのまま微分する
//*data・・・微分をおこなう対象データのポインタ
//bibun・・・微分階数
//s・・・データの大きさ
void CFractionalDlg::FractionalDifferential(double *data, double bibun, int s)
{
register int m, t;
//bibunが整数かどうか判別する(整数の時には動作が異なる)
int kaisuu = (bibun == (int)bibun)? (int)bibun: MAXKAISUU;
double* ganma = new double[kaisuu + 1];
//ガンマ関数の値をストックする (n+1)C(m+1)
//ついでに符号も保存する
ganma[0] = 1.0;
for(m = 1;m <= kaisuu; m++)
ganma[m] = - ganma[m - 1] * (bibun - m + 1) / (double)m;
//非整数階微分をする
double p = pow(m_DT, bibun); //h^d
for(t = s; t; data[--t] -= data[0]); //先頭の値を零にする
register double f;
int M;
for(t = s; t; ){
--t;
M = (t < kaisuu)? t: kaisuu;
for(f = data[t], m = 1; m <= M; f += ganma[m] * data[t - m], m++);
data[t] = f / p;
}
delete [] ganma;
//データの平均を0に
if(m_chk_mean){
for(f = 0.0, t = s; t; f += data[--t]);
for(f /= s, t = s; t; data[--t] -= f);
}
}
言語は一応C++です.(C言語も混ざっていますが).