« 息抜きです。 | トップページ | Wimax接続失敗 »

2010年2月 1日 (月)

エクセルでFFTを使う

必要があってFFTを使ったので、
メモとして記録しておく。

FFTをネットで検索すると、ファイナルファンタジーなんとか、が
沢山ひっかかり、本当に調べたいものへの障害になる。


■20120726追記 参考ファイルを修正した.

「FFT-memo.pdf」をダウンロード に、メモをまとめたpdfを置く。
「FFT-test.xls」をダウンロードに、サンプルのエクセルファイルを置く。
サンプルシートを2枚にしました.

まだ誤りがあるかもしれない。



=== フーリエ解析

ひょんなことからフーリエ解析なるものを使うことになった。
理系(工学系?)の大学生ならば一度は通る道である。

一番身近なのは、音の分析だろう。
・高周波成分(高音域)
・低周波成分(低音域)
がそれぞれどれくらい含まれているのか、
を見るときに使うのである。

人間の耳は、
20ヘルツ(1秒間に20回振動)の低音から、
2万ヘルツまで認識できるそうだが、
周波数成分に分解して、それぞれの成分がどれくらい強いのか、という分布をみて音の特徴を見出すことができる。
その周波数ごとの成分の強さをスペクトルと呼び、
横軸に周波数(あるいは周期)をとってスペクトルの強さを縦軸にとったグラフを、スペクトル分布と呼ぶ。

余談だが、
2つの音がオクターブの関係にあるときは、周波数や周期で互いに倍半分の関係になるから、スペクトルをとると、倍半分の周波数でピークを見ることになる。
また、和音も、互いに整数の比(1~5が多い)をとる。
(平均律をとるピアノなどは正確にはそうはならないが、近似的にそうなる。)

フーリエ解析は、時間的に変化する音のような信号を元データから、
各周波数の波の成分ごとの強さを計算する方法である。

ーーー

フーリエ解析の理論と、プログラムの知識があれば、計算するのは難しくはない。また、ケース数が少なく、計算時間さえ気にしなければ、周波数帯が限られていれば、ひたすら積分すれば求められる。

プログラムさえいらない場合もある。

例えば、データは6万くらいまで、周波数が120くらいまでであればエクセル(2003)でも1シートで計算できる。データ列を一番左に、そしてその右に、周波数ごとのSIN関数、COS関数を計算しておき、SUMPRODUCT関数を使って、積の積分
 ∫x(t)sin(2πkt/T)dt
をすれば必要な量が求められるのである。

この方法でやるならば何の問題もないのであるが、
長いデータでかつ広い周波数成分にわたる計算が必要ならば、専用のツールを使った方がよい。

ーーー FFTを使ってみる。

よく使われるのがFFT、高速フーリエ変換、と呼ばれる計算方法とのこと。
私はFFTのアルゴリズムを理解していないし、そのつもりもないのであるが、
出力結果が何を表すのかくらいは知っていないとお話にならない。

4069個(=2の12乗)までの短い信号、短いデータであれば、エクセルで解析することができる。専用ツールでやればよいのだが、「本当になるのか?」と思って使ってみる。

インストールしたままでは使えないので、
アドインに「分析ツール」を追加して使う。
2007の場合は、画面左上のマークから「EXCELのオプション」、2003の場合は、「ツール」「オプション」から、
(場合によってはインストールディスクが必要かもしれない。)

試しに使ってみる。2007の場合は、「データ」から「データ分析」をみてフーリエ解析を選ぶ。
Photo

入力(信号・データ)の範囲と、出力の範囲を指定する。
この図では、同じシートの、データの4列右に出力している。
Photo_2
Kaiseki

この結果をみてみる、
入力データは、平均値2cm、波の高さ2cm、周期16秒の波で、データ間隔は2秒である。

FFTで出力されたデータは、スペクトル(振幅ではなく、積分値)の値である。
(クリック拡大) ■ 表中の説明を再修正しました2012/07/26 ■
Trialfft_3_3


1行目(k=0)は、周波数成分を持たない平均定常値(正確には平均値xデータ長16秒)である。(周期無限大)
だから、周期に対するスペクトルとして扱ってはいけないはずである。
周波数も0である。これは結構忘れがちだ。
Web上の解説でも、k=1としているものがかなりある。

2行目以降は、その16秒の間の波数kに対してのスペクトル(積分)値であるが、sin,cosではなく、複素数exp(-i2πk/N)で計算している。その関係で、
計算結果③はkのマイナス領域まである。
kの範囲は、-N/2~0~N/2である。

実数のデータを入力した場合、複素数で現れるスペクトルX(k)とX(-k)は共役の関係になる。どちらにもsineとcosineの両方の情報が含まれている。
どちらも複素数の絶対値④は同じになり、その値は、合成した波の振幅x(N/2)として現れている。

FFTの計算では時間刻みは1として計算されている。
本当はΔT=2秒づつなので、
その周波数成分のスペクトル|X(k)|は⑤のように、
FFTの結果にΔTをかけたものになる。

パワースペクトルP(k)を計算する時には、これ⑤を2乗してT0で割ればよい。

また、工業数学の初期に習う離散フーリエ級数の係数⑥を求めるには、
・定常項 a0 は、k=0のスペクトル値X(k=0)をT0で割る。
・そのほかの項は、
 コサインの振幅akに対しては③の実数成分(IMREAL関数)にΔTをかけて(T0/2)で割ればよく、
 サイン の振幅bkに対しては③の虚数成分(IMAGINARY関数)に-ΔTをかけて(T0/2)で割ればよい。(マイナスを忘れていましたので修正しました.2012/7/26)

ーーー
エクセルのフーリエ解析の実際への応用については、ウェブ上で詳細まで掲載されているものはあまりないようである。(検索方法が悪いだけかもしれないが)

特にデータ刻みや単位の問題、パワースペクトルへの変換、定義との関係など、よくわからなかった。 また、なぜN/2の項は一つしかないのか、なども考えてみればわかるものの、そのあたりの「かゆいところに手の届く」情報は見つからなかった。

ーーー
もちろんツールは万能ではない。
限界もあるが、それより何より、それをわかっているか、という問題である。
私は、わからない場合は、
ツールを使わずに自分で計算し、既知のデータで検算してしまうので、そう言ったことはおこらない代わりに作業時間がかかる。

道具を使う方が早いか、自分で組んだ方が早いか。
いつも迷うところである。
 

|

« 息抜きです。 | トップページ | Wimax接続失敗 »

コメント

エクセルでFFTが出来るとは知りませんでした。sumisumiさんでさえ色々調べなければいけないのなら、この機能は誰の為に作られたのでしょうかね。学生なんかが使うには説明不足で、上級者が使うにはデータの量が限られているとなると、利用する機会が限られますね。ちなみに私はMatLabを使っています。Windowingの詳しい事は良く分からないのですが、スペクトルのアンサンブル平均も結局同じ事みたいなので、データをいくつかに分けてスペクトルを出して、その平均をとっています。

投稿: みやしん | 2010年2月 2日 (火) 09時53分

最近、スペクトルの他にコヒーレンスやフェイスを計算する必要があり、ふとFFTのアルゴリズムを見たらその簡潔さとプログラムの短さ(実質10数行?)に魅せられて(取り憑かれて)しまいました。結局細かい所でつまずきながらプログラミングに丸一日費やしてしまいました。。。とても複雑なアルゴリズムで数ページにも及ぶプログラムなら最初から諦めていたのに、ついついハマってしまいました。途中で逃げ出さずに完成したのは良いのですが、学生にのみできる業ですね。アルゴリズムは沢山の”蝶々”を使って説明してあり、なかなか面白いです。”病気”を伝染させたくはありませんが、”万が一”興味があればどうぞ。
http://www.relisoft.com/science/Physics/fft.html

投稿: みやしん | 2010年3月11日 (木) 11時58分

あはは、とりつかれましたか!

まさしくチョウチョの世界へ、ようこそ。。。ですね。

すごく短いすぐれたアルゴリズムだっていうのは博士課程の頃に知って、ふーん、すごいなぁと思っていたのですが、プログラムを組んで使うのは容易というところまではよく、アルゴリズムを理解するのは、読み始めて「やめておこうね」、とそれ以来読んでいません。

そのときはやめてしまったと思うのだけれど、昔開いてみた本を読んだときはwikipediaの日本語版のように行列形式か何かで説明がなされていて、自分にはその説明の方がビット反転でいける、というのは理解しやすい気がします。(チョウチョには悪いけれど。)

パズルを解きたくなったときに読んでみます!!

投稿: sumisumi | 2010年3月11日 (木) 22時26分

そうなんです。ビット反転さえ出来ればあとは5行程度の実行文で蝶々が次々と勝手に飛んで行ってくれます。

投稿: みやしん | 2010年3月12日 (金) 11時08分

そろそろしつこいのですが、又、既にご存知かもしれませんが、一応書き込ませて頂きます。FFTを勉強した勢いでBurgのMEM(最大エントロピー法、又はAR(自己回帰)法)にまで手を出してしまいました。。。導出の途中の数学が少し手に負えない所もありましたが、結果としてMEMはかなりかなり強力です。直接法(BT法やFFT法)に比べてとにかく安定性が良いです。なので、特にデータが短い場合に良いと思います。MEMの中でもBurgより良い方法があるようですが(最小二乗モデル、又はCovariance法)、私の扱っているデータではどちらもほぼ同じ結果が出るので今回はこれで一区切りというところです。オーダーを(2~3*N^0.5、N=データ長)くらいで見積もってMatlabを使えば簡単です。

投稿: みやしん | 2010年3月21日 (日) 07時54分

ありがとうございます。手法としてのMEMやARは理解できてしまえばいいでしょうね。

組んだことはないので、比較してみて感覚としてどれがどういうのでよい、というのがわかるのはとてもいいと思います。

勉強していないので、こういう比較をするときにそれらの差がどこにあるのかは書いてあったりしますが、どこから生まれているのか、というところを自分の中で理解したり、使ってみて知ることは大事なのでしょう。

投稿: sumisumi | 2010年3月23日 (火) 05時49分

とても参考になりました。なかなか分かりやすい解説が見つからず、苦労していました。

投稿: あき | 2010年12月31日 (金) 02時16分

お役に立てたようでしたら何よりです.
コメントいただき,励みになります.

このページは検索にかかるのでアクセスが多いです.
他の人にも読んでいただいているようで,自分のために書いたのですが,書いてみて良かったかなと思い始めています.

まだいくつか誤りがある(式番号の引用など)なので,修正が必要なので,直したらまた追加していきたいと思います.

投稿: sumisumi | 2010年12月31日 (金) 13時35分

エクセルを使っての解説、ありがとうございます。
私のような初学者にとって、とても、とても、わかりやすく、 有用な内容でした。 ウェブに紹介されている解説の多くは式ばかりで、それに比べると貴ページは、具体的な数字を、計算過程と共に示してくれているので、本当に素晴らしいです。

投稿: ああああ | 2012年7月26日 (木) 15時44分

ありがとうございます.
これを書いたのも,毎回,過程を忘れてしまうだろうことを予測してのことです.毎日のように検索先から見ていただいているようです.

先ほど説明に誤りがあるのを発見しました.
離散フーリエ解析のところです.
最後の画像を差し替えました.
また,エクセルファイルのサンプルも更新しました.

途中の本筋に影響はありません.

投稿: sumisumi | 2012年7月26日 (木) 17時26分

最近、パワースペクトルを勉強しているのですが、同僚でもこの事を勉強している者がいなく自分の理解があっているのか自信が持てない状況でした。
貴ページををたまたま見つける事ができ理解が間違ってない事が確認でき安心しました。ありがとうございました。

投稿: じゅん | 2013年4月 6日 (土) 23時51分

じゅん さま

お役に立っているようでしたら、何よりです。
コメント頂き、ありがとうございます。

投稿: sumisumi | 2013年4月 7日 (日) 02時53分

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/102394/47446920

この記事へのトラックバック一覧です: エクセルでFFTを使う:

« 息抜きです。 | トップページ | Wimax接続失敗 »