- 締切済み
相互相関関数
相互相関関数を求めるプログラムを書いたのですが、入力信号のずらし幅が負の時と正の時で処理を分けた場合、結果の波形の整合性が取れずに困っております。計算上の根本的違いやコードのミスも含めて、ご指南頂きたいです。 ちなみに参考にしたのは、 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)
「404 になる」自体は本当はどうでもよくて本題は「あと」以降なんだけどなぁ.... 特に, 最も重要なのは あなたはどのような順序で出力したいのでしょうか? のところ. たとえば, 画像のグラフにおいて横軸の 1 とか 1600 とかにはどのようなものが対応するのですか? そして, それはどのようにして得られるはずのものなんですか?
- SnowShower
- ベストアンサー率40% (140/348)
- Tacosan
- ベストアンサー率23% (3656/15482)
2つの URL がどちらも 404 になるので見えません. あと, この画像は何を意味するのでしょうか? あなたはどのような順序で出力したいのでしょうか? 蛇足ですが, 「malloc で MAXバイトとっておきながらそのあとの while ループで num < MAX という比較を行っている」ところはおかしい可能性が高い (sizeof(double)==1 という環境でない限りおかしい)です.
補足
申し訳ありません。一つ目が、以下URLの [後期:Javaで試しながら学ぶ信号処理]の欄、 1.自己相関と相互相関の項目の右側のPDFファイルになります。 http://wwwdoi.elec.nara-k.ac.jp/html/jisyu/j5ec02/ 2つ目が以下URLの[周波数解析など]の欄、相互相関の項目になります。 http://www.mech.tohoku-gakuin.ac.jp/nken/java/java.html
補足
説明不足でしたので、お答えしますと、 横軸はずらし幅、で実際には0を中央として、右に行くほど正の方向へずれ、左に行くほど負の方向へずれるようなグラフにしたいのです。 縦軸は各ずれ幅における相関係数になるのだと思います。 ちなみに上記のプログラムには、負方向のにずらした時の相関を現在とは逆の順序に並べ替える必要があることは分かりました。