相互相関関数
相互相関関数を求めるプログラムを書いたのですが、入力信号のずらし幅が負の時と正の時で処理を分けた場合、結果の波形の整合性が取れずに困っております。計算上の根本的違いやコードのミスも含めて、ご指南頂きたいです。
ちなみに参考にしたのは、
http://wwwdoi.elec.nara-k.ac.jp/html/jisyu/j5ec02/taro12-sjt0_p13_2...
の最後の2ページで、入力のサンプルデータは、
http://www.mech.tohoku-gakuin.ac.jp/nken/java/new2/crosscorr7/cross...
のデータを用いました。結果画像を添付します。
#include "stdafx.h"
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#define MAX 10000000
#define buf 256
int main (){
FILE *fpi; //_入力ファイル
FILE *fpo; //_出力ファイル
int num; //_対象波形全点数
double *x,*y; //_波形データ
double *cxy1,*cxy2;//結果
char filename[buf];
/////////ファイルオープン///////////
(省略)
////////////データ読み込み///////////////////
if(((x=(double*)malloc(MAX))==NULL)||((y=(double*)malloc(MAX))==NULL)){
fprintf(stderr,"Can't_allocate_memory.\n");
return 0;
}
num=0;
while ( fscanf(fpi,"%lf,%lf",&x[num],&y[num]) != EOF && num < MAX ){
num++;
}
printf("%d",num);
////////相互相関関数//////////////////////////
if(((cxy1=(double*)malloc(MAX))==NULL)||((cxy2=(double*)malloc(MAX))==NULL)){
fprintf(stderr,"Can't_allocate_memory.\n");
return 0;
}
int i,j,n;
double sum;
n = num-1;
//////////////ずらし幅が負の時の演算////////////
for( i=0; i<n; i++ ) {
sum = 0.0;
for( j=0; j < n-i; j++ ) {
//k = (j + i) % num;
sum = sum + x[j] * y[j+i];
}
cxy1[i]=double(sum/(n-i));
}
////ずらし幅が正の時の演算///
n = num-1;
for( i=0; i<n; i++ ) {
sum = 0.0;
for( j=0; j < n-i; j++ ) {
//k = (j + i) % num;
sum = sum + x[i+j] * y[j];
}
cxy2[i]=double(sum/(n-i));
}
/////////結果の出力///////////////
for(i=0;i<n;i++){
fprintf(fpo,"%f\n",cxy1[i]);
}
for(i=0;i<n;i++){
fprintf(fpo,"%f\n",cxy2[i]);
}
/////////////////////////
fclose(fpi);
fclose(fpo);
free(x);
free(y);
free(cxy1);
free(cxy2);
}
補足
回答有難うございます. グラフを良く見るとT(sec)とtime(sec)がありました. となると,T(sec)は時間ではなく,周期ということでしょうか? 実行させてGragh T(sec)-R を出した後,そのグラフ上をクリックすると,その位置の情報が出てくるのですが,単位がHzになっています. 周期だとすると単位はsecのはずですよね? 以下のURLはアクセスできますでしょうか? もしアクセスできれば,下の方に相互相関解析というものがあります. http://www.mech.tohoku-gakuin.ac.jp/nken/java/java.html よろしくお願いします.