アプリ版:「スタンプのみでお礼する」機能のリリースについて

相互相関関数を求めるプログラムを書いたのですが、入力信号のずらし幅が負の時と正の時で処理を分けた場合、結果の波形の整合性が取れずに困っております。計算上の根本的違いやコードのミスも含めて、ご指南頂きたいです。
ちなみに参考にしたのは、
http://wwwdoi.elec.nara-k.ac.jp/html/jisyu/j5ec0 …
の最後の2ページで、入力のサンプルデータは、
http://www.mech.tohoku-gakuin.ac.jp/nken/java/ne …
のデータを用いました。結果画像を添付します。

#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);
}

「相互相関関数」の質問画像

A 回答 (3件)

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/ja …

補足日時:2010/02/01 12:26
    • good
    • 0

「404 になる」自体は本当はどうでもよくて本題は「あと」以降なんだけどなぁ.... 特に, 最も重要なのは


あなたはどのような順序で出力したいのでしょうか?
のところ. たとえば, 画像のグラフにおいて横軸の 1 とか 1600 とかにはどのようなものが対応するのですか? そして, それはどのようにして得られるはずのものなんですか?

この回答への補足

説明不足でしたので、お答えしますと、
横軸はずらし幅、で実際には0を中央として、右に行くほど正の方向へずれ、左に行くほど負の方向へずれるようなグラフにしたいのです。
縦軸は各ずれ幅における相関係数になるのだと思います。

ちなみに上記のプログラムには、負方向のにずらした時の相関を現在とは逆の順序に並べ替える必要があることは分かりました。

補足日時:2010/02/01 13:18
    • good
    • 0
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!