- 締切済み
相互相関関数
相互相関関数を求めるプログラムを書いたのですが、入力信号のずらし幅が負の時と正の時で処理を分けた場合、結果の波形の整合性が取れずに困っております。計算上の根本的違いやコードのミスも含めて、ご指南頂きたいです。 ちなみに参考にしたのは、 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); }
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- Tacosan
- ベストアンサー率23% (3656/15482)
- SnowShower
- ベストアンサー率40% (140/348)
- Tacosan
- ベストアンサー率23% (3656/15482)
補足
説明不足でしたので、お答えしますと、 横軸はずらし幅、で実際には0を中央として、右に行くほど正の方向へずれ、左に行くほど負の方向へずれるようなグラフにしたいのです。 縦軸は各ずれ幅における相関係数になるのだと思います。 ちなみに上記のプログラムには、負方向のにずらした時の相関を現在とは逆の順序に並べ替える必要があることは分かりました。