Excelで求めた相互相関関数のように,間引きの大きい計算では,大まかな相関の変化はつかめるが,詳細な相互相関関数値が読み取れなかった.
しかしながら,正確な相互相関関数値を求めるには,Excelでは,かなりの労力を要する.
そこで,相関関数をCプログラムによって簡単に計算させるプログラム例を示しておきます.
このプログラムを改良することで,相互相関関数値を瞬時に求めることができます.
なお,求められた相互相関関数値の出力をExcelによって,グラフ表示させる方法については,以下の手順を参考にしてください. |
|
|
次に,上の処理を体験した後,今度はC言語によって2つの関数f(t)とg(t)の相関係数rを求めるプログラムを作成する.
まず,順番に以下の関数を作成していくことをお勧めする. |
- ノルムを求める関数 double nol(double *data1,int samp)
- 内積を求める関数 double nai(double *data1,double *data2,int samp)
- 相関係数を求める関数 double soukan(double *data1,double *data2,int samp)
|
これらの関数でdouble
*dataは,samp次元のサンプリングデータ値です.
関数名は,各自で自由につけてもらってかまわない.
プログラム例を以下に示しておくので参考にしてもらいたい.
ただし,ノルムが0であるときの処理はしていないので気をつけること. |
|
相関関数のプログラム例(Cプログラムはここです) |
#include<stdio.h>
#include<math.h>
//ここに,#define SAMP
36 と書いて,
//関数の引数部でSAMPと書けば,別の次元でもすぐに対応できる
double nol(double
*,int);
double nai(double *,double *,int);
double sokan(double *,double
*,int);
main()
{
double f[36],g[36];
//ここは,double f[SAMP],g[SAMP]となる
int i;
//2つの関数データの作成
for(i=0;i<36;i++)
{
f[i] =
sin((double)i / 36.0 * 3.14159); //<--f(t)
g[i] = cos((double)i / 36.0 * 3.14159);
//<--g(t)
printf("%7.3lf,%7.3lf\n",f[i],g[i]);
}
printf("nol f,%7.4lf\n",nol(f,36));
printf("nol
g,%7.4lf\n",nol(g,36));
printf("nai fg,%7.4lf\n",nai(f,g,36));
printf("sokan fg,%7.4lf\n",sokan(f,g,36));
//関数部では,printf("sokan
fg,%7.4lf\n",sokan(f,g,(int)SAMP));
//と書けばいいだろう.
}
double
nol(double *f,int d) //ノルムを計算する関数
{
double
sum = 0.0;
int i;
for(i=0;i<d;i++) sum += pow(f[i],2.0);
return(sqrt(sum));
}
double nai(double *f,double *g,int d)
//内積を計算する関数
{
double sum = 0.0;
int i;
for(i=0;i<d;i++) sum += f[i] * g[i];
return(sum);
}
double sokan(double *f,double *g,int d) //相関係数を計算する関数
{
return(nai(f,g,36) / (nol(f,36) *
nol(g,36)));
} |
|
ここでは,math.hをインクルードしているので,コンパイル時に-lmオプションをつけてください.
つまり,
cc soukan.c -lm
とすればよい. |
|
|