相互相関関数を求めるプログラムを書いたのですが、入力信号のずらし幅が負の時と正の時で処理を分けた場合、結果の波形の整合性が取れずに困っております。計算上の根本的違いやコードのミスも含めて、ご指南頂きたいです。
ちなみに参考にしたのは、
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);
}
No.1ベストアンサー
- 回答日時:
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 …
No.3
- 回答日時:
「404 になる」自体は本当はどうでもよくて本題は「あと」以降なんだけどなぁ.... 特に, 最も重要なのは
あなたはどのような順序で出力したいのでしょうか?
のところ. たとえば, 画像のグラフにおいて横軸の 1 とか 1600 とかにはどのようなものが対応するのですか? そして, それはどのようにして得られるはずのものなんですか?
この回答への補足
説明不足でしたので、お答えしますと、
横軸はずらし幅、で実際には0を中央として、右に行くほど正の方向へずれ、左に行くほど負の方向へずれるようなグラフにしたいのです。
縦軸は各ずれ幅における相関係数になるのだと思います。
ちなみに上記のプログラムには、負方向のにずらした時の相関を現在とは逆の順序に並べ替える必要があることは分かりました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# 質問です 下記のコードを分かりやすく解説お願いします 初心者です #include ‹stdio.h 3 2022/05/26 22:03
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- C言語・C++・C# LU分解法のピボッティングについて(C言語/gcc-9) 3 2022/07/11 23:10
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# このプログラミングの問題を教えてほしいです。 キーボードからデータ数nとn個のデータを入力し、平均値 3 2022/12/19 22:51
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
プログラムでの数字につく”f”の...
-
doubleの変数にintとintの割り...
-
c言語で、繰り返し文の中で、0....
-
C言語を実行すると-infが出てき...
-
float型とdouble型の変数の違い...
-
C言語の型による処理速度の違い
-
C言語 関数プロトタイプ宣言の...
-
C言語で-23乗を取り扱うには
-
方程式を2分法を用いて解くプロ...
-
EXE1→DLL→EXE2数値を受け渡す方法
-
C言語でdouble型の小数点の引き...
-
浮動小数点の定数
-
difftime()について
-
(C,C++言語)関数の引数は自動キ...
-
mallocで動的確保後、値が変わる
-
DWORDの警告
-
数値を指数部と仮数部に分離したい
-
c言語の問題
-
C言語でプログラミングしまし...
-
C++で外積
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
プログラムでの数字につく”f”の...
-
doubleの変数にintとintの割り...
-
float型とdouble型の変数の違い...
-
c言語で、繰り返し文の中で、0....
-
C言語を実行すると-infが出てき...
-
C言語 関数プロトタイプ宣言の...
-
C 開放してるのにエラー(doubl...
-
C言語の型による処理速度の違い
-
至急です! マクロ定義で #defi...
-
関数におけるif文とreturn文に...
-
c言語のプログラミングについて...
-
2分法で方程式の複数の解を自...
-
-1.#IND00と出てしまうのですが...
-
doubleは常に%lfとするべきなのか
-
C言語のpow関数の不具合
-
C言語で-23乗を取り扱うには
-
C言語で台形公式を使った二重積...
-
Cで3乗根を求める方法
-
sin(x)の近似について
-
2次方程式の解を求めるプログ...
おすすめ情報