コヒーレンス関数についての調査結果

このQ&Aのポイント
  • コヒーレンス関数は、二つの波形の一致率を調べるための方法です。
  • コヒーレンス関数は、クロスパワースペクトルとパワースペクトルを使用して計算されます。
  • クロスパワースペクトルは、二つの信号のスペクトル密度の相互関係を表す指標です。
回答を見る
  • ベストアンサー

コヒーレンス関数について

二つの波形の一致率を調べるための方法を聞いたところ「コヒーレンス」を使えばいいとのことで、今コヒーレンス関数を調べております。 http://oshiete1.goo.ne.jp/kotaeru.php3?q=2314537 で、一応式は検索できたのですが、 1、http://dspace.wul.waseda.ac.jp/dspace/bitstream/2065/396/9/Honbun-31_chapter3b.pdf 2、http://www.hulinks.co.jp/support/flexpro/v7/dataanalysis_crsp.html#02 3、http://www.cybernet.co.jp/matlab/support/manual/r14/toolbox/signal/spectra7.shtml 4、http://www.onosokki.co.jp/HP-WK/c_support/tech_term/cf_fft/cf3_2.htm たぶん2,3,4は同じ事を書いてるのだと思うのですが、1は左辺に二乗があり、右辺に二乗がありません。これは A)クロスパワースペクトル密度とクロススペクトル、クロスパワースペクトルは別物と言う事でしょうか? B)r^2がクロススペクトルなのでしょうか?それともrがクロススペクトルなのでしょうか? 次に、コヒーレンス関数の式が上の1,2,3,4で求められるとしたら、パワースペクトル、クロスパワースペクトルとはいったいどうやって計算すれば良いのでしょうか? C)パワースペクトル・・・FFTの計算結果の√(実数部^2+虚数部^2)と言う事でいいんでしょうか? D)クロススペクトル・・・FFTの計算結果で、XとYで(実数部、虚数部)がそれぞれ(X,iX)、(Y,iY)があった時、クロススペクトルは ((X+iX)*(Y-Yi))^2=(XY-iXY+iXY+XY)^2 = (2XY)^2 で良いんでしょうか?(虚数部の計算は打ち消しあうので実数部だけでいいんですか?) よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
noname#65504
noname#65504
回答No.4

#1~3です。 >データが2048個です。 >もしかしたら1024か2048辺りで割った方がいいのでしょうか? というと、N/2がかかっていそうですね(N:データ個数)。 このN*Δt/2(Δt:サンプリング間隔)=サンプリング時間/2という係数をかけてフーリエスペクトルとしているのは、東京大学の大崎先生が有名です(建築学)。 そして大崎先生は以下の著書で、フーリエ振幅スペクトルをそう定義して、fortranで書いたソースを公開しています。質問者が参考にしているのは、その流れをくむ計算アルゴリズムのように思います。 「地震動のスペクトル解析入門」 大崎 順彦著、鹿島出版会  現在は改訂版が出て、「新・地震動のスペクトル解析入門」という本になっています(ISBN:4306032701)。でも旧版の方が説明が丁寧で良い本なのですが。 上記の本は地震工学の分野にしぼってフーリエ解析までしか説明していませんので、おそらく分野が異なる質問者が購入してもあまり意味がなさそうですが。もし建築・土木分野の人でスペクトル解析を勉強したいのでしたらお薦めの本です。 また、パワースペクトルを周波数で基準化したものをパワースペクトル密度と呼びます(「ディジタル信号処理入門」 木戸健一著 丸善 p20:小野測器はこの著書を参考文献として紹介しているので、小野測器とは用語の定義は同じと思います。ただし絶版のため入手困難です) N*Δt/2=(N/2)*(1/サンプリング周波数)ですから、パワースペクトルではなく、大崎先生の定義する(一般的でない定義)フーリエスペクトルから、パワースペクトル密度を計算しているようにも思います。 このあたりの影響がどうなるかはちょっとわかりません(式をきちんと追えばわかると思いますが)。 >「スペクトル解析」日野幹雄著 の本を買ってきたんですが、それでも「???」でした。 日野先生の「スペクトル解析」はこの分野の定番の本ですが、かなり難しいですね。私もよくわからないことが多いです。初学者には敷居が高いので仕方ないと思います。 >そして、何個の平均を取れば良いのでしょうか? 私がアナライザーを用いて解析する際には少なくとも最低でも10個、通常100個ぐらいのデータを使用しています。でも正弦波だとばらつきがないので、平均化しても結果が変わらないので、コヒーレンスの検証データとしては利用できないかもしれません。 >この平均なんですが、どれの平均ですか??  平均化処理というのは、時間領域で平均化する方法もあるのですが、コヒーレンスを求める際にする平均化処理は、N個の信号からなるデータをM組用意して、FTT変換したスペクトル上で、各周波数ごとに平均値を求めるものです(申し訳ありませんが、パワー、フーリエ、クロスのどの段階ですればよいかはよく覚えていません) 小野測器のホームページで見るのならFFTアナライザーの使用法について解説してあるPDFファイルをご覧下さい(PDFにリンク貼るのはこのサイトでは違反らしいので、貼れません)。 >Ar[i] = (Ar[i] + Ar[i+1] + ar[i+2]) / 3 ちなみに上記の処理は平均化処理ではなく、複雑なスペクトルから全体的な傾向などを見るために行うスペクトルの「平滑化処理」です(平滑化処理の詳細は大崎先生の著書に書いてあります)。

silverbear
質問者

お礼

大崎先生の流れかどうかは分かりませんが、参考にしたサイトはこちらです。 http://momonga.t.u-tokyo.ac.jp/~ooura/fftman/ そして、残念ながら建築・土木分野の仕事ではないです。 平均化と平滑化は同じものだと思っていたのでとても参考になりました。 >FTT変換したスペクトル上で、各周波数ごとに平均値を求めるものです と言う事は数回測定したFFTの結果を平均すると言う事ですよね?どうも以前DLしたソフトのクロススペクトルは平滑化しているようでした。 http://www.ritsumei.ac.jp/se/rv/izuno/soft.html コヒーレンスの計算 ただ、一度FFTしてからパワー・クロススペクトルを出すのと、相互・自己相関関数の後にFFTするのだと後者の方が平滑化したようなデータになったので出来るかと思ったのですが、どうやっても無理でした。(1を超えるデータが出来てしまう事がある) 最終的にDSPで信号処理を考えていたのですが、どうやら処理時間が間に合いそうも無いためコヒーレンスはあきらめようと思います。(FFT1回でも処理時間が厳しいです) 長々と付き合ってもらった上に結果が出なくて申し訳ありません。 ありがとうございました。

その他の回答 (3)

noname#65504
noname#65504
回答No.3

#1です。 >音・振動のスペクトル解析  工博 金井浩 ISBN:4-339-01105-3 この本はかなり応用編ですね。 コヒーレンスは信号処理の中でも高度な部類ですので、コヒーレンスについて書いていなくとも信号処理の入門書を読んでから、コヒーレンスまで書いてある本に進んだ方がよいかもしれません。 また信号処理の入門書の後に出ている本はディジタル信号処理関係に比べて出版されている本がぐっと少なくなるのですが、モード解析の本を読んでみるのもよいかもしれません。コヒーレンスや伝達関数を使った解析法について述べてあることが多いです。 >自分でやる場合ですが、FFTを求めるとSIN波なのである周波数が1024で、他は0になります。 次に、パワースペクトルですが、ある周波数が1024で他は全部0でした。 1024というのは、振幅(縦軸の値)ですか? フーリエ振幅スペクトルの振幅と正弦波の振幅は関係があります。 著者によってフーリエ上の振幅に係数がかかっていることもあるのですが、基本的に正弦波の振幅とフーリエ振幅の値はほぼ同じになるはずです(計算誤差などがあるので一致はしないこともある)。 また振幅が最も大きくなる周波数と入力正弦波の振動数もほぼ一致するはずです。 ここはよくチェックしてみてください。 ちなみにFFTでは解析に用いるデータ個数は2の累乗個のデータであることが必要なので、それが1024ではないでしょうか? もし入力に用いた正弦波の振幅値が1なら振幅値にデータ個数がかかっているように思います。 また上記の状況から窓関数は使用していないのではないかと思います(窓関数がかかると正弦波の振動数付近にも0以外の値が現れるので)。 切り取った信号のがちょうどきりのいいところできれていれば正弦波なら問題ないのですが、複雑な信号を処理する際には目的に合わせた窓関数(ウィンドウ)をかけて処理しないと、リンク効果により変な結果が出ますので、窓関数を使用した方がよいです。 窓関数については小野測器のホームページにいろいろ解説がありますのでよく見てください。 >小野測器のHPでは平均しなければ駄目と書いてましたし コヒーレンスを求めるには平均化処理をしなければなりません。 ここは訂正です。 >C)パワースペクトル・・・FFTの計算結果の√(実数部^2+虚数部^2)と言う事でいいんでしょうか この分野では人によって多少言葉の定義が人によって異なるのですが、この式で表されるものは、私はフーリエ振幅スペクトルまたは単純にフーリエスペクトルと呼んでいます。そして平方根を取らないもの(2乗和)をパワースペクトルと呼んでいます。 >他にも何かする事があるのかな?と思ってます。 平均化と窓関数のほか、入力信号をディジタル化する前に、アンチエリアジングフィルターというアナログフィルターをかける必要があります。 >あと少しのところまで来てるのではないか?と思っているのですが今悩んでます。 お礼を見るとそんなところまで来ていそうですね。もう一息ですので頑張ってください。

silverbear
質問者

お礼

ありがとうございます。 とりあえずテストで試してたのが振幅1のSIN波で、データが2048個です。(取り込んでるのではなく、計算で出したSIN波です) 窓関数を使うと窓関数の周波数も入ってしまい、比較しにくくなるので使ってませんでした。 FFTは以前もやった事がありまして、それほど苦労せずに思い出せました。 もしかしたら1024か2048辺りで割った方がいいのでしょうか??(どっちにしろコヒーレンスは1以上にならないと思ったので気にしてませんでした) フーリエスペクトルとパワースペクトルはなんとなくそんな感じがしてました。 ただ、なんとも自信が無くてルートを取ったりつけてたりして比較してました。 >アンチエリアジングフィルター サンプリングエラーって奴ですよね。これは一応対策してます。 >コヒーレンスを求めるには平均化処理をしなければなりません。 「スペクトル解析」日野幹雄著 の本を買ってきたんですが、それでも「???」でした。(学が足りないのでほとんど理解できません) まず、現状ですが、 信号AのFFT(Ar[i],Ai[i]) (実部,虚部) 信号BのFFT(Br[i],Bi[i]) パワースペクトルA[i] = Ar[i]^2 + Ai[i]^2 パワースペクトルB[i] = Br[i]^2 + Bi[i]^2 クロススペクトル[i] = (Ar[i] * Br[i] + Ai[i] * Bi[i])^2 + (Ar[i] * Bi[i] + Ai[i] * Br[i])^2 コヒーレンス[i] = クロススペクトル[i]/(パワースペクトルA[i] * パワースペクトルB[i]) と言う式で、iを0~2047までループしてます。 多分これであってると思います。後は平均化処理だけじゃないかと思います。 で、平均化するのはコヒーレンス[i]だと遅すぎると思うのでパワースペクトルor(and)クロススペクトルor(and)フーリエスペクトルだと思います。(入力データを平均しても意味無さそうですし) この平均なんですが、どれの平均ですか?? そして、何個の平均を取れば良いのでしょうか? 例えば Ar[i] = (Ar[i] + Ar[i+1] + ar[i+2]) / 3 のように、数個(3~10個ぐらい?)の平均でやっていくのか、2048の平均をAr[0]~ar[2047]に入れてしまっていいのか、もっと良い平均のとり方があるのか、さっぱりです。

noname#65504
noname#65504
回答No.2

#1です。 訂正補足です 「自己相関関数をフーリエ変換したもので」は自己相関関数ではなく相互相関関でした。

noname#65504
noname#65504
回答No.1

リンク先をじっくり読んだわけではないこと(リンク先に飛ばないものもあったので)、私自身は独学でかじった程度なので自信がないことを前提に呼んでください。 「スペクトル解析」日野幹雄著 朝倉書店 p63によると、コヒーレンスの定義は統一されておらず、2乗がつくものとそうでないものの2種類があり、文献を読む際にはどれを定義しているか確認する必要があるそうです。 だから、いろいろなサイトを読むよりも1つのサイトや書物に頼った方がよいと思います。 A)クロスパワースペクトル密度とクロススペクトル、クロスパワースペクトルは別物と言う事でしょうか?  一般にクロスパワースペクトルと呼ばれるものは、クロスパワースペクトル密度あるいは、クロスパワースペクトル密度関数とも呼ばれています。 (「ディジタル信号処理の理論 1 基礎・システム・制御」谷萩隆嗣著 コロナ社 p113) だからクロスパワースペクトルとクロススペクトルは別物、クロスパワースペクトルとは同じ物だと思います。 なお、パワーという用語は一般に2乗を示しています。 B)については記号の定義がよくわからないので省略します。 C)についてはディジタル信号上の処理の結果として、そういうことになっていると思います。 D)の計算は式の考えは正しいと思いますが、記号の付け方による大きな誤解があると思います。先ずクロススペクトルは自己相関関数をフーリエ変換したもので、フーリエ変換結果は虚数となりますので虚部を持ちます。 虚部と実部を同じ記号を使っているので、勘違いをしてしまったのだと思いますので、(a+bi)と(c+di)などと記号を変えて検討してみてください。自分の計算間違いに気づくと思います 先に述べたように同じ物を示すのに違う用語が使われたり、逆に同じ用語なのに違った定義がされていますので、いろいろな資料を当たるよりも1つの資料を参考にした方がよいと思います。部分部分をつまみ読みするよりも、ディジタル信号処理関係の本に書いてありますので1冊通して読んだ方がよいと思います。 ちなみに私はFTTアナライザーユーザーなので、ここをよく参照しています。 http://www.onosokki.co.jp/HP-WK/c_support/tech_term/cf_fft/cf3.htm

silverbear
質問者

お礼

お礼が遅くなって申し訳ありませんでした。 >コヒーレンスの定義は統一されておらず そうですか。参考になります。 >パワーという用語は一般に2乗を示しています。 知りませんでした。参考にさせていただきます。 >自分の計算間違いに気づくと思います 気づきました。相殺できませんでした。 >ディジタル信号処理関係の本に書いてありますので1冊通して読んだ方がよいと思います。 先日本屋に行ってきたのですが、コヒーレンスについて書かれている本が一冊しか見つかりませんでした。 音・振動のスペクトル解析  工博 金井浩 ISBN:4-339-01105-3 本屋で読んだ感じではおそらくこの事について書いてあるんだと思いましたが、本に書いている事が理解できなかったためあきらめました。 で、ネットで調べた事とsemi-zzz様の解説を組み合わせ、あと少しのところまで来てるのではないか?と思っているのですが今悩んでます。 それは、ネット上のフリーソフトを使いコヒーレンスを求めたところ、同じサイン波同士だと全データが1になりました。おそらく正しいです。 自分でやる場合ですが、FFTを求めるとSIN波なのである周波数が1024で、他は0になります。 次に、パワースペクトルですが、ある周波数が1024で他は全部0でした。 クロススペクトルが自信ないのですが、計算式から行けばおそらくある周波数が1024^2になり、他は全部0になると思います。 その後コヒーレンスを求めるのですが、分母(パワースペクトル)が0で計算できない上に分子も0なので0を出すしかないです。さらにある周波数は1どころか1024^2 でも、0/0=1と言うのもありなのかな?とも思ってます。(もしそれが可能なら完成に近づきますが) で、小野測器のHPでは平均しなければ駄目と書いてましたし、他にも何かする事があるのかな?と思ってます。 とても参考になりました。 ありがとうございました。

関連するQ&A

  • 2つの時系列データのコヒーレンスの計算について

    工学系の学生をしております。時系列データの処理について勉強しているのですが、コヒーレンスの計算が理解できないので、質問させていただきます。 2つの時系列x(t),y(t)のコヒーレンスを計算したいのですが、教科書(例えば、日野幹雄:スペクトル解析)によると、 coh(w)=|Sxy(w)|^2/( Sxx(w)・Syy(w) )  coh:x(t)とy(t)のコヒーレンス Sxy:x(t)とy(t)のクロススペクトル  Sxx:x(t)のパワースペクトル  Syy:y(t)のパワースペクトル となっており、コヒーレンスcohは0から1の間の値ととると書かれています。 なのですが、x(t),y(t)のフーリエスペクトルをX(w),Y(w)とすると、  Sxx(w)=X*(w)・X(w)/T = |X(w)|^2/T  Syy(w)=Y*(w)・Y(w)/T = |Y(w)|^2/T  Sxy(w)=X*(w)・Y(w)/T = |X(w)|・|Y(w)|/T・exp(-theta) (ここで、X*,Y*はX,Yの複素共役、thetaはクロススペクトルSxyの偏角) となるため、cohの式に入れると、  coh(w)=|Sxy(w)|^2/( Sxx(w)・Syy(w) ) = ( |X(w)|・|Y(w)| )^2 / ( |X(w)|^2・|Y(w)|^2 ) = 1 となってしまい、周波数によらず常に1になってしまうのですが、 上記の考え方は間違っていますでしょうか? 他にもいくつか教科書を読んでみたのですが、どうにも一人で解決出来ず、こちらに質問させていただきました。 よろしくお願いいたします。

  • 振動計測結果をグラフにする

    電圧信号を取り込んで、加速度や速度を周波数領域のグラフにしたいのですが、専用のFFTアナライザで測定したグラフと結果が異なってしまいます。 計算式を直そうにもどこを直したら良いかわからないので、教えてもらえないでしょうか? 行っている計算は以下のとおりです。 Y軸はリニアスペクトルとします。 1.取り込んだ電圧信号を加速度の物理量に変換する。   1G=0.375Vとしています。例)0.2V=0.075G 2.1で求めた値をFFT演算する。 3.FFT演算で得られる実数部と虚数部からスペクトルを求める。   リニアスペクトル = {√(実数部の2乗)+(虚数部の2乗)} / 2 4.3で求めたスペクトルを実行値(RMS)に変換(1/√2)する。

  • FFT処理後のデータの変換について

    時間-加速度波形を、例えば、EXCELでのFFT処理でもって、 実数+虚数とし、これをIMABSという関数で実数化して (周波数-)パワースペクトル?に変換することができますが、 これを、(周波数-)加速度にさらに変換するにはどうすればよいのでしょうか。 FFTアナライザなどFFTをリアルタイムでかけられる機器はありますが、 FFT処理後、どのような過程(計算)を得て、Y軸はdBそして加速度等に標記されているのでしょうか。 教えていただけないでしょうか。

  • クロススペクトルを算出する方法

    クロススペクトルを計算して求める具体的な方法についてお尋ねします.2つの時系列があって,各周波数ごとのコヒーレンスとかフェイズを算出して周波数による変化を図示したようなものだと思います. 2つの量をいっぺんに処理するようなので複素数ということになると思いますが.実部,虚部をそれぞれコスペクトル,クオドラチャスペクトルなどと言っていたと思います. さて,そこで質問ですが,1つの時系列でスペクトルを算出するFFTプログラムがある場合,その結果を元にしてクロススペクトルを算出することは可能でしょうか.2つの時系列のそれぞれのスペクトル(振幅,位相)を個別に算出できるプログラムがあり,それらからクロススペクトルを求められないかということです.それともクロススペクトルを求めるルーチンは,2つの時系列を放りこんでそれ専用のFFTのルーチンを経て出力されるものなのでしょうか. スペクトルを求める方法は,FFT, 最大エントロピー,相関関数の変換などいろいろあると思います. FFTだけが手元にあります. よろしくお願いします.

  • 振動計測で

    振動計測を行うシステムを作ろうとしています。 周波数とスペクトルデータをグラフにし、スペクトルデータのOA(オーバーオール)値を表示します。 仕組みとしては、電圧信号を取り込み(A)→ 窓関数(B)→ FFT(C) → 周波数とスペクトルデータを求める(D) → グラフ、OA値表示(E) といった感じです。 (A)は機器で取った信号を機器に付属しているソフトウェアから取り込むようになっています。生データです。 スペクトルデータの求め方がいまいちよくわかっていないのですが、 FFT演算後のデータをR(実数部)、I(虚数部)、N(FFTした件数)とすると、 リニアスペクトルならば、√(Rの2乗+Iの2乗)、 パワースペクトルならば、Rの2乗+Iの2乗 で正しいんでしょうか? 実際の計算は、市販のソフトウェアで行うのですが、そのソフトの補足説明には、 リニアスペクトルは、√(Rの2乗+Iの2乗)/ N パワースペクトルならば、Rの2乗+Iの2乗 / Nの2乗 と書いてありました。 どちらが正しいんでしょうか? 自分なりに調べたところ、前者の方が正しい気がするんですが、 後者の方もソフトとして売っているくらいなので、間違いでないような気がするんです。 NやNの2乗で割ることの意味がわかっていないので、自分では判断できないんです。 よろしくお願いします。

  • スペクトル解析におけるコヒーレンス

    2つの変動している時系列をFFTによって複素フーリエ成分に分解し、それぞれの周波数成分での実部と虚部(2つの時系列なので4つの数値)の組み合わせからコヒーレンスとかフェイズを算出できるようになっています。クロススペクトルからの処理とも言えると思いますが。 実際に計算してみるとコヒーレンスの値がどの周波数成分でも1ばかりになっており、どうしたことかと思っています。コヒーレンスの差異は非常にケタの小さいところに出るのだろうかとか、計算が間違ってないかなとチェックしていますが、原因がわかりません。また、全く無相関なはずのランダムデータを2つで調べてもコヒーレンスが1になってしまい、お手上げです。 どのようなものでしょうか。また、ネットで調べてみるとコヒーレンスを計算する場合、特殊な処理が必要との記述もありました。その説明はMatlabによるものなので当方の環境(Fortran)と一致しません。コヒーレンスは1に近い値になるものでしょうか(つまり計算は正しい)。あるいはそれは間違いで何かの処理をしたら正しく(?)計算できるものでしょうか。コヒーレンスの計算はその定義どおりに計算しているので今でも間違っているはずはないのですが。 よろしくお願いします。

  • 連立二次関数の解

    判別式√b-4ac が負の値になるときは実数解は存在しないんですよね。 でも虚数解になるので、虚数空間で解を表せますか。 今高校9年生で虚数を表すときには、値を座標を使い、表すと習いました。 ということは、二次関数を表すには、xy座標を使う、つまり2次元で表しますが 虚数を表すためにx、y、それぞれに虚数軸を加えると、2次元+1次元+1次元=4次元で視覚的には表せないということでしょうか。 解りにくい説明だとは思いますが、回答をお待ちしております。

  • 実験による音響インテンシティの計算法

    2マイクロホン法で音響インテンシティを計算する方法があります。音響インテンシティは音圧Pと粒子速度Uの積ですが、長らく粒子速度Uを測定する方法がなかったので2マイクロホンの圧力の差分から計算で定めていました。ここで2マイクロホン法のクロススペクトル法について教えてください。 通常PとUのクロススペクトルの虚数部をインテンシティとしていると思います。これはPとUが90度位相が違う事を仮定していると思います。 しかし実際には振動面(発音部)近傍で流体が振動面に拘束されて付加マスになってしまうためUの位相がPと同じだったりするなど、空間内のPとUの位相差は90度とは限りませんし一定でもありません。おそらく近傍ならクロススペクトルの虚数部、遠方なら実部を使うことになるでしょう。中間は粒子速度を直接測るか2マイクロホンの圧力差分を直接積分するしかありません。 一般に振動面からどのくらい近ければ虚数部(音の波長との比?、空気のポアソン比との比による?)、どのくらい遠ければ実数部を使うべきなのか、教えてください。

  • FFT後の振幅値

    振幅値が1で5Hzのsin波をFFTにかけたところ、実数部と虚数部それぞれ出力されました。 横軸を周波数軸、縦軸を実数部としてグラフ化したところ、5Hzのところに鋭いピークがみられるのですが、スペクトルの値が元のsin波の振幅値1にならず、とても大きな値になります。 これは計算が間違っているのでしょうか?

  • パワースペクトルの周波数について

    FFTを使ってパワースペクトルを出したのですが、1データ数辺り何Hzかを求める計算式がわかりません。どのように求めればいいのでしょうか。 よろしくお願いします。