• 締切済み

自己相関関数

データ数が4500個で一つのシグマの固まりに500個のデータがあります (つまり9のグループに分けられます) この隣り合ったグループの離散的な値で自己相関係数を求めたいのですが GSLのgsl_stats_lag1_autocorrelation_m ( const double data [ ] , const size_t stride, const size_t n, const double mean ). を使うところまではわかったのですが引数の中をどのように適用させたらよいのでしょうか? 式で表すと(Σ(1~500)x(t)・x(t+1))/(√Σ(1~500)x(t)^2・Σ(1~500)x(t+1)^2) x(t)のtには何グループ目かを表す数字1~8が入ります 説明下手で申し訳ないです わかる方よろしくお願いいたします

みんなの回答

  • ki073
  • ベストアンサー率77% (491/634)
回答No.1

質問の意味がが分かりにくいのですが、自己相関の場合には同じデータを使いますので、関数に渡すデータ列は一つです。 「隣り合ったグループ」ということですので、違う2つのデータ列の相関係数を計算したいのだと思うのですが、 その場合には共分散を使えば計算できます。GSLだと gsl_stats_covariance または gsl_stats_covariance_m が使えます

関連するQ&A

  • 定義とFFTで導出した自己相関が違います

    ある離散信号x(t)の自己相関を求める際に 「定義通りにf(τ)=Σx(t)x(t-τ)で求めた結果」と 「xをFFTしてパワースペクトルを求めて,その逆FFTで求めた結果」 が異なるのですが,当たり前のことでしょうか? 自己相関の畳み込みはFFTの掛け算と同じだと理解していたのですが... 御教授のほどお願いします.

  • 自己相関関数とパワースペクトル密度関数、フーリエ変換について

    パワースペクトル、パワースペクトル密度と自己相関関数についての質問です。 (tは時間、hは次数、fは周波数として) ある信号x(t)の自己相関関数r(h)をフーリエ変換すると、その信号のパワースペクトル密度関数p(f)になるとネットにあったのですが、パワースペクトル密度関数p(f)と、信号x(t)をそのままフーリエ変換して得たパワースペクトルX(f)はどう違うんでしょうか。 ちなみに数学的な話というよりはコンピュータ上の処理(離散値)で考えています。 もともとパワースペクトルが『自己相関関数の離散フーリエ変換として定義される』と本にはあったのです。 しかし同じ本の中に、『自己相関関数のフーリエ変換は正しくはピリオドグラムと言い、パワースペクトルとはピリオドグラムの平均値で求められる』とも書いてありました。 パワースペクトルとパワースペクトル密度関数はいったいどう違うのか…?とずっと考えているのですが分かりません。 あと自己相関関数と自己相関係数の関係も謎です。 何がどうなっているのか混乱しているので、教えて頂きたいと思いこちらに投稿いたしました。回答よろしくお願いします。

  • 自己相関関数とパワースペクトル密度関数、フーリエ変換について。

    自己相関関数とパワースペクトル密度関数、フーリエ変換について。 パワースペクトル、パワースペクトル密度と自己相関関数についての質問です。 (tは時間、hは次数、fは周波数として) ある信号x(t)の自己相関関数r(h)をフーリエ変換すると、その信号のパワースペクトル密度関数p(f)になるとネットにあったのですが、パワースペクトル密度関数p(f)と、信号x(t)をそのままフーリエ変換して得たパワースペクトルX(f)はどう違うんでしょうか。 ちなみに数学的な話というよりはコンピュータ上の処理(離散値)で考えています。 もともとパワースペクトルが『自己相関関数の離散フーリエ変換として定義される』と本にはあったのを読みました。 しかし同じ本の中に、『自己相関関数のフーリエ変換は正しくはピリオドグラムと言い、パワースペクトルとはピリオドグラムの平均値で求められる』とも書いてありました。 パワースペクトルとパワースペクトル密度関数はいったいどう違うのか…?とずっと考えているのですが分かりません。 あと(自己、相互)相関関数と(自己、相互)相関係数にはどのような関係があるのですか。回答よろしくお願いします。 前回1つ回答頂いたんですが解決できなかったのですみません、もう一度お願いします。

  • 正規化相関において

    あるデータX(0,1,2,,,i)とT(0,1,2,,,i)の相関値(類似度)を正規化相関を用いて計算する場合に、もしどちらかのデータが一定の値(全て同じ値)だったとすると正規化相関の式では分母、分子ともに0になってしまうのですがどのように計算したら良いのか教えてください。

  • matlab初心者です。データ間でのf検定をしようと思ったのですが、

    matlab初心者です。データ間でのf検定をしようと思ったのですが、 ??? 未定義の関数、またはメソッド 'vartest2' (タイプ 'double' の入力引数)。 といったエラーが出てきました。 同じソースコードで3ヶ月前には普通にできたので現在パニック状態です。 ソースコードは以下のとおりです。 p1=(data); p2=(data); pp1=mean(p1(:,3:362),2); pp2=mean(p2(:,3:362),2); [h,p,ci,stats] = vartest2(pp1,pp2) どなたかアドバイスを頂けると助かります。 よろしくお願いします。

  • 相互相関関数

    相互相関関数を求めるプログラムを書いたのですが、入力信号のずらし幅が負の時と正の時で処理を分けた場合、結果の波形の整合性が取れずに困っております。計算上の根本的違いやコードのミスも含めて、ご指南頂きたいです。 ちなみに参考にしたのは、 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); }

  • bsearch関数の内容について

    stdlib関数のbsearch関数で、次のことを教えてください。 void *bsearch(const void *key, const void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *)) { size_t pl = 0; /* 探索範囲先頭の添字 */ size_t pr = nmemb - 1;/* 探索範囲末尾の添字 */ char *x = (char *)base;/*なぜchar *にキャスト?*/ if (nmemb > 0) { while (1) { size_t pc = (pl + pr) / 2;/* 探索範囲中央の添字 */ int comp = compar((const void *)&x[pc * size], key); ~~~~~~~~~~~~~~~~~~~~~~~~~~~ /*なぜsizeを掛けるのか?*/ if (comp == 0) /* 探索成功 */ return (&x[pc * size]); else if (pl == pr) break; else if (comp < 0) pl = pc + 1;/* 探索範囲を後半に絞り込む */ else pr = pc - 1;/* 探索範囲を前半に絞り込む */ } } return (NULL);/* 探索失敗 */ }

  • C++の質問です

    C++の質問です。 c++をコンパイルしたとき、 出力されるのが次のように3つ同時にされるようにしたいのですが、 1、 名前 ○○○○ 番号 ○○○○ x= {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}の平均 2、 x= {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}の分散 y= {10, 9, 8, 7, 6, 5, 4, 3, 2, 1}の標準偏差 3、 x={1,2,3,4,5,6,7,8,9,10}と y={10,9,8,7,6,5,4,3,2,1}の相関係数 下記のソースをどのように変えればいいでしょうか。 ちなみに、C言語ではなくC++なので C++形式でお願いします。 どうかお願いします。 #include <iostream> #include <cmath> using namespace std; double Mean(int *a, int size); double StandardDeviation(int *a, int size); double CoefficientOfCorrelation(int *a, int *b, int sizeA, int sizeB); int main() { int x[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; int y[] = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1}; cout << " 標準偏差 : " << StandardDeviation(x, sizeof(x) / sizeof(int)) << endl << " 相関係数 : " << CoefficientOfCorrelation(x, y, sizeof(x) / sizeof(int), sizeof(y) / sizeof(int)) << endl; return 0; } double Mean(int *a, int size) { if (size <= 0) { return -1.0; } double d = 0.0; for (int i = 0; i < size; i++) { d += *(a + i); } return d / size; } double StandardDeviation(int *a, int size) { if (size <= 0) { return -1.0; } double mean = Mean(a, size); double d = 0.0; for (int i = 0; i < size; i++) { d += pow(*(a + i) - mean, 2); } return sqrt(d / size); } double CoefficientOfCorrelation(int *a, int *b, int sizeA, int sizeB) { if (sizeA > 0 && sizeB > 0 && sizeA != sizeB) { return -1.0; } double meanX = Mean(a, sizeA); double meanY = Mean(b, sizeB); double sdX = StandardDeviation(a, sizeA); double sdY = StandardDeviation(b, sizeB); double coeff = 0.0; for (int i = 0; i < sizeA; i++) { coeff += (*(a + i) - meanX) * (*(b + i) - meanY); } return (coeff / (sizeA * sdX * sdY)); }

  • templateを使ったときの未解決の外部シンボルエラー

    以下のプログラムを、Visual C++ 2008でビルドすると、 『error LNK2019: 未解決の外部シンボル "class A<double> __cdecl add(class A<double> const &,double const &)" (?add@@YA?AV?$A@N@@ABV1@ABN@Z) が関数 _main で参照されました。』 のエラーになります。 template < typename T > class A { private: T x, y; public: A( const T& xx, const T& yy ):x(xx),y(yy){} T getx() const {return x;} T gety() const {return y;} friend A<T> add( const A<T>&, const T& ); }; template < typename T > A<T> add( const A<T>& a, const T& z ){ return A(a.x+z, a.y+z); } /* 直前のテンプレートでこの関数を作ったつもりです A<double> add( const A<double>& a, const double& z){ return A<double>(a.x+z, a.y+z); } /**/ #include <iostream> int main() { A<double> a(1.0, 2.0); double z=3.0; std::cout << add(a,z).getx() << "\n"; } どう書けばよいのでしょうか。

  • Cの関数定義で見慣れない記述がありました

    libeventというソフトのソースに以下のような関数定義がありました。 この関数の定義部分が見慣れないものでした。 この関数は、size_tを戻り値としてもち、_event_strlcpyという名前で、 引数として、dst, src, sizの三つをもつというのはわかるのですが、 どうして_event_strlcpy(dst, src, siz)のように、 引数に型が宣言されていないのでしょうか?こういう書き方はアリなのですか? 普通は、_event_strlcpy(char *dst, const char *src, size_t size) というように書くものではないでしょうか? しかも、_event_strlcpy(dst, src, siz)の次の行からの、 char *dst;const char *src;size_t size;の三行は何なのでしょうか? このような位置にこういった書き方をするのはアリなのですか? size_t _event_strlcpy(dst, src, siz) char *dst; const char *src; size_t siz; { register char *d = dst; register const char *s = src; register size_t n = siz; /* Copy as many bytes as will fit */ if (n != 0 && --n != 0) { do { if ((*d++ = *s++) == 0) break; } while (--n != 0); } /* Not enough room in dst, add NUL and traverse rest of src */ if (n == 0) { if (siz != 0) *d = '\0'; /* NUL-terminate dst */ while (*s++) ; } return(s - src - 1); /* count does not include NUL */ }