Wavelet超入門 その5 Daubechiesの Φ関数



 1.Daubechies(ドブシー、ドビッシー)のΦ関数を描いてみる

   大体やね、どの書籍等を見ても、Daubechiesの関数を、y=f(x)の形で書いた式がありません.......

    調べてみると、何と! この関数は、y=f(x)の形で描けない関数なのだそうです、たまげた! http://www2.starcat.ne.jp/~fussy/algo/algo8-9.htm

    こんなん、初めて..... y=f(x)と、書けんはずやわ......

    只、

     
    なる関係(two-scale relation)は、満たされており、

    この関係が満たされていれば、 t=1/2, 1/4, 1/8, 1/16, 1/32等を代入する事により、幾らでも細かい数字が

    その1つ、ランク下の関数で表現できて、関数の数値が求まるとの事です、 おもしろい。

 

 2.0.25間隔のDaubechiesのΦ関数の値を求めてみる


    これは、プログラムを書いて、この関数の数値を順番に求めて行くしか、手がありません。



    上記の関係を参考に、以下のプログラムを作りました。


//Daubechies  N=2  two-sacle relation
#include "stdafx.h"
#include "math.h"

static double p[]={0.6830,1.1830,.3170,-0.1830}; // P1,P2,P3,P4 これらの値は、Daubechiesの数表に載っているもの。
                                                                                                                                                        Orthogonal Daubechies coefficients (normalized to have sum 2) 参照の事

 

double phai_origin[4]={0,1.366,-0.366,0};    //φ(0)、φ(1)、φ(2)、φ(3) の値 これらの値は、予め求めておく tks http://www2.starcat.ne.jp/~fussy/algo/algo8-9.htm

double daubechies[13]={0}; //
0から3までの、0.25間隔のφ(t)を求める数列

void prepare()
{
 int i;
 for(i=0;i<4;i++)
  daubechies[i*4]=phai_origin[i];  //φ(0)、φ(1)、φ(2)、φ(3) の値を代入
}

double phai_value(int index)
{
 
//daubechies配列のindexの範囲を超えていたら、零、そうでなければ、値を返す

 return ( (index<=0) || (index>12) ? 0 : daubechies[index]);
}

void calc_array(double* array,int i)
{

  double value=p[0]*phai_value(i*2)+p[1]*phai_value(i*2-4)
   +p[2]*phai_value(i*2-8)+p[3]*phai_value(i*2-12);

  array[i]=(abs(value)<0.001 ? 0 : value); //小さい値は零にする
}

int _tmain(int argc, _TCHAR* argv[])
{
 prepare();
 for(int k=0;k<2;k++)  //一回で1/2まで求まる。2回廻すと、1/4まで求まる。
  for(int j=0;j<13;j++)
   calc_array(daubechies,j);
 return 0;
}

    こうして求めたDaubechiesのΦ関数の値を、wxMaximaで描いてみる




    そして



    と、すれば

    と、描ける。

    今回は、Daubechiesの関数で求まる Φ(t)を描いてみただけでした。

         もっと、細かく描けるアルゴリズムを考えなければ......

    それでも、随分、時間掛かったわ、何せ、ユニークな、私にとって新鮮な関数です。

H.20.10.14