位置情報で子どもの居場所をお知らせ

scilabを使ったフーリエ変換についての質問です。

あるデータ(メトロノームに合わせた指タッピングの時間間隔データでっす)を、フーリエ変換しなければいけないのですが分かりません。゜゜(´□`。)°゜。

具体的には、その時系列データ(512個あってexcelに収まってマス、A列に時間(5432ミリ秒とか)、B列に強さ(200g重とか))を、scilabを用いてフーリエ級数変換・・・スペクトル密度のグラフをつくる、な感じなことをするらしいのですが、プログラムがぜんぜんうまく書けません(今月末までつくらないといけないのに・・・)゜(゜≧□≦゜)゜

生データの自己相関関数をつくって、フーリエ級数変換、高速フーリエ変換、グラフをプロット、のような流れなのかなぁ?と思うのですが、合ってますかぁ?

もしよかったらサンプルプログラムを書いてくださると助かります(*^o^*)
先週から私なりにチャレンジしているんですが、エラーばっかりなんですぅ(涙)

どうか、よろしくお願いします☆

このQ&Aに関連する最新のQ&A

A 回答 (2件)

スペクトル密度を求めるには、


1.生データをFFTして2乗
ていうのと、
2.生データの自己相関関数を計算してそれをFFT
ていう2通りの道筋があるわけですが、(ウィーナー=ヒンチン)
ノイズを大量に含むデータで、ノイズをたくさん含む生データの場合は、2.の方がノイズの処理がしやすくていいでしょう。
    • good
    • 0
この回答へのお礼

ありがとうございます!

2通りやり方があるのですね。
勉強してみます!

お礼日時:2008/09/24 21:19

Excelからのデータの読み込みはうまくいっているのでしょうか。

参考URLにその方法が書かれています。フーリェ級数変換は関係ないと思います。FFTを使えばよいと思いますが、FFTの使い方はコツが必要です。単にFFTしても512個のデータをフーリェ変換しますので、グラフに出力しても周波数との対応がとれません。そこらへんは自分で考えるかwebで検索してみて下さい。scilabではあまり情報がありませんので、matlab関連で検索するとよいかもしれません。

参考URL:http://tokida.sakura.ne.jp/Hobbies/computer/Scil …
    • good
    • 0
この回答へのお礼

いろいろやっているのですが、まだうまくいっていません。。。(涙)

MATLABのファイルを参考にしてプログラムをつくっているのですが、scilabにはない関数があったりして、それを代替する関数がうまくかみ合っていないのかもしれないです。。。

お礼日時:2008/09/24 21:21

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QExcelで4096点以上のFFTの方法

Excelでは4096点までのFFTしかできませんが、4096点以上のFFTをかける方法(VB?)をご存知の方いらっしゃいましたらお教えください。

Aベストアンサー

下記などご参考まで。プログラムをそのまま公開されています。
http://tsuyu.cocolog-nifty.com/blog/2007/03/publi.html


#プログラムの始めのn=の行とDimの行の数字を適切に修正して使います。

QEXCELにてローパスフィルタを作成する

実験の測定データをEXCELでデータ整理しようと考えております。データ整理のためローパスフィルタをかけたいのですが、具体的にどういった式、もしくはEXCELの機能を使用したらいいのでしょうか?デジタルフィルタが良く分からないのでよろしくお願いします。
ちなみにローパスフィルタは1000Hzをかけたいです。

Aベストアンサー

時系列データの処理ならば

OutputData(n+1) = OutputData(n) + (InputData(n+1) - OutputData(n)) * dt / T

dt:データのサンプリング間隔
T:フィルタの時定数 1/2πf
f:カットオフ周波数
n,n+1:それぞれn個目,n+1個目のデータをしめす。

でいけると思いますが、一次のパッシブなんで効果が薄いかも。(普通はベッセルかけるんでしょうけど、そこまではわからない)

Q原波形のノイズ除去方法(FFT、逆FFT)

始めに、僕は数値解析等にはかなりの未熟者です。
今、微量な電流を拾ってそれを200倍に増幅した原波形があるのですが、それには多くのノイズがはいってしまい見にくいんです。それでそのノイズを除去したいのです。
今考えているのはFFTをかけてでてきた周波数を逆FFTを行いノイズを除去しようと考えています。もし他に簡単にノイズを除去できる方法があれば教えていただきたいのですが。
今、自分のなりの考えで行うとしてもその処理の仕方がまったくわかりません。どのソフトを使うのが最適なのかがわかりません。こういう場合で使いやすいソフトってありますか?

わかりにくい説明ではありますが、分かる人がいましたらアドバイスください。

Aベストアンサー

No.2です。

画面全体がノイズだらけになるとしたらデータの処理だけで
ノイズを除去する事は難しいかもしれません。
データの再取得が可能であるならば再取得してください。
その際、あらかじめアナログ回路部分でノイズを除去しておいてデータを取得するようにしてください。
データのサンプリング時にエイリアシングが発生して信号にかぶさった場合には後処理でノイズを除去する事は不可能です。


フィルタについてはアナログ回路で実現するもの、AD変換後にデジタル回路で実現するもの、データ取得後にソフトウエアで行うものなどが有ります。

>多少信号のでている時間、大きさに誤差が出てきてしまう
とのことですが、フィルタを通した場合一般的には時間遅れが生じます。
どれだけ遅れるかはフィルタが決まれば決定されるのでその分補正すれば良いです。
大きさについては適切に設計されていれば大きくずれる事はありませんが
フィルタの種類によっては通過域でゲインが変化しないものと多少の変化があるものとが有るので用途によって使い分けします。

フィルタ処理の具体例を挙げます。
No.3さんの計算と同じものです。
/* FIRフィルタのサンプル */
#define DATA_SZ1000 /* データの個数 */
#define KN2
#define KEISU_SZ(2*KN+1) /* フィルタの係数の個数 */

float input[DATA_SZ]; /* 入力データ 適当な方法で初期化すること */
float output[DATA_SZ]; /* 出力データ */
float keisu[KEISU_SZ] = {1.0/KEISU_SZ} ; /* 移動平均フィルタの場合 */

void fir( float *in, float *out, float *ks ){
int i,j ;
float x;

  for( i=KN ; i<DATA_SZ-KN ; i++ )
    {
      x= 0 ;
      for( j=-KN : j<=KN ; j++ )
      {
         x += in[i+j] * ks[j+KN] ;
      }
      out[i] = x ;
   }
} /* インデントを付けるため全角スペースを使用しています */

もっと具体的には
入力データ d0,d1,d2,d3,d4,d5,d6,d7
係数データ k0,k1,k2,k3,k4
出力データ ______x2______  上下をそれぞれ掛け算したものの合計
x2 = ( d0*k0 + d1*k1 + d2*k2 + d3*k3 + d4*k4 )

出力のx3を求める場合は入力データを1個左にシフトします。
入力データ d1,d2,d3,d4,d5,d6,d7
係数データ k0,k1,k2,k3,k4
出力データ ______x3______ 
x3 = ( d1*k0 + d2*k1 + d3*k2 + d4*k3 + d5*k4 )

これから分かるように x0,x1 を求めるにはデータが足りません。
どこかから(例えばd0で置き換える)データを持ってくるか、無いものとするしかありません。

係数の数を増やせばより高性能なフィルタとすることが出来ます。
係数を決める、つまりはフィルタを設計する方法の説明はここでは難しいです。
次数がそれほど大きくなけれはエクセルでも計算できます。

No.2です。

画面全体がノイズだらけになるとしたらデータの処理だけで
ノイズを除去する事は難しいかもしれません。
データの再取得が可能であるならば再取得してください。
その際、あらかじめアナログ回路部分でノイズを除去しておいてデータを取得するようにしてください。
データのサンプリング時にエイリアシングが発生して信号にかぶさった場合には後処理でノイズを除去する事は不可能です。


フィルタについてはアナログ回路で実現するもの、AD変換後にデジタル回路で実現するもの、データ取得...続きを読む

QFFT・PSDの縦軸は何を意味するのでしょう?

加速度計測の結果について、PSD(パワースペクトラムデンシティ)をかけた場合、その縦軸の意味を教えてください。
また、FFTとPSDはどういう違いが有るのでしょうか?
これまでは、周波数の分布のみに着目していました。
どなたか、わかりやすく教えてください。
よろしくお願いします。

Aベストアンサー

一般に加速度センサー信号の出力は電圧です。

縦軸は係数をかけていない状態では#1さんがおっしゃるように計測した電圧の値を示しています。

よって、縦軸に物理的な意味を持たせるのには、電圧と加速度の間の換算係数をかけてやる必要があります。

フーリエ解析は時刻歴波形は正弦波の組み合わせで構成されるという仮定の下で計算を行っています。FFTの結果は横軸で示される周波数の正弦波の振幅を示しています。
電圧と加速度の換算係数をかけてやると、FFTの縦軸はその周波数成分を持つ加速度振幅を示しています。

ここで1つ問題があります。FFTはサンプリング周波数により分解能が変わります。FFTによる周波数分析は正確にいうと、離散値なので、ジャストの周波数のもをだけを表しているのではなく、ある範囲の周波数範囲にある成分を表しています。
このため分解能が変わると周波数範囲が変わり、同じ波形を分析しても振幅が変わります。
これでは分解能が異なるデータ同士は比較できないなどの問題が生じます。
そのため、周波数幅で振幅を基準化して、1Hzあたりの振幅としたものがPSDです。
PSDならサンプリング周波数が異なるデータ同士の比較ができます。

要はフーリエ振幅(FFT)はサンプリング周波数・分解能により変わる値であり、PSDはそのようなことのないように周波数幅で基準化した値という差があります。

なお、2乗表示したものをパワースペクトルと呼び、それを周波数で基準化したものをPSDと呼びますが、PSDは表示方法によって2乗した状態のあたいを表示(パワー表示)するときと、2乗した値の平方根を計算して表示することがありますので、使用する際には縦軸の表示方法については要注意です。

一般に加速度センサー信号の出力は電圧です。

縦軸は係数をかけていない状態では#1さんがおっしゃるように計測した電圧の値を示しています。

よって、縦軸に物理的な意味を持たせるのには、電圧と加速度の間の換算係数をかけてやる必要があります。

フーリエ解析は時刻歴波形は正弦波の組み合わせで構成されるという仮定の下で計算を行っています。FFTの結果は横軸で示される周波数の正弦波の振幅を示しています。
電圧と加速度の換算係数をかけてやると、FFTの縦軸はその周波数成分を持つ加速...続きを読む

Q高速フーリエ変換でデータ数が2のべき乗でない時

こんにちは。現在、フーリエ変換について勉強しているのですが、ちょっとわからないことがあったので質問させていただきました。

質問内容は高速フーリエ変換についてで、cooley&tukeyのアルゴリズムを利用すると、データが2の冪乗個のときは計算量をО(NlogN)に減らせる事ができるというものでした。

しかしデータが2の冪乗個でないとき。例えばN=5000くらいのときはデータを切り取って無理やりN=4096(=2^12)みたいな感じにすれば良いんですよね?
やっぱりその時って、N=5000で通常の離散フーリエ変換したときと周波数値に誤差が出ると思うのですが、それはどうやったら計算できるのでしょうか。。。

どなたかご教授していただければ幸いです。

Aベストアンサー

離散フーリエ変換は、信号が周期的であることを前提としています。
離散フーリエ変換でのデータ数Nは、離散時間信号の周期に当たります。変換の結果は線スペクトルとなります。
N=5000がその信号の1周期なのでしょうか。
もしそうならば、4096にすれば、誤差が大きくなるでしょう。
N=5000で変換すべきです。この場合にも高速アルゴリズムが
存在します。#1の方のとおりです。
FORTRANの時代には、パッケージがありました。
NはN=2^m*3^n*5^k*7^Lだったと思います。

もうひとつの考え方は、有限持続時間信号のフーリエ変換としての
適用です。これは、連続スペクトルとなります。データ数Nは
スペクトルの分解能に関係します。サンプリング周波数をNで割った
ものが周波数分解能となります。
実際のデータよりも2倍程度のNを使うことが多いと思います。
データ数が5000ならば、Nは8192とし足りないデータには、
0を詰めます。これならば、2のべき乗のNを選べます。
この場合、逆変換は周期的な拡張が行われることに注意が必要です。

離散フーリエ変換は、信号が周期的であることを前提としています。
離散フーリエ変換でのデータ数Nは、離散時間信号の周期に当たります。変換の結果は線スペクトルとなります。
N=5000がその信号の1周期なのでしょうか。
もしそうならば、4096にすれば、誤差が大きくなるでしょう。
N=5000で変換すべきです。この場合にも高速アルゴリズムが
存在します。#1の方のとおりです。
FORTRANの時代には、パッケージがありました。
NはN=2^m*3^n*5^k*7^Lだったと思...続きを読む

QScilabで行列をグラフ化したいのですが…

Scilabで行列をグラフ化したいのですが…

すみません、Scilabを使っていて詰まってしまったので初心者なゆえ質問させてください。

行列をMatplotを使ってグラフ化しようとしたのですが、
グラフ化するとなぜかオートスケールがきかず出力画面が真っ黒になってしまいます。

おそらく、カラーマップでナンバー1が黒なので行列内にある2未満の数値がすべて
黒として表示されているのだと思います。
行列内の数値はすべて0以上1未満でしたので。


ここで例えば、
A=[0 0.5:1 2];
Matplot(A)

とすると要素(2,2)だけが青色でほかすべてが黒の二次元グラフができるかと思います。
(カラーマップ2が青なので)


理想は行列内のMAX値を一番明るくし、0を今までどおりの黒にしたいです。
ここに行列Bがあり、

B=[0 0.3 0.2:0 0 0.5]
とするならば、

0.5を一番明るくして0に近づくほどその色を黒にしていく。
こんなグラフが欲しいと思っています。
できますでしょうか??

無知ですみません、よろしくお願いします。

Scilabで行列をグラフ化したいのですが…

すみません、Scilabを使っていて詰まってしまったので初心者なゆえ質問させてください。

行列をMatplotを使ってグラフ化しようとしたのですが、
グラフ化するとなぜかオートスケールがきかず出力画面が真っ黒になってしまいます。

おそらく、カラーマップでナンバー1が黒なので行列内にある2未満の数値がすべて
黒として表示されているのだと思います。
行列内の数値はすべて0以上1未満でしたので。


ここで例えば、
A=[0 0.5:1 2];
Matplot(A)

とす...続きを読む

Aベストアンサー

ご希望の感じになるのかどうかわかりませんが、
グレースケールでやるっていうのはどうでしょう?
//--------------------------------------------------------
lines(0)
Crange=100 // 増やすと分解能が上がる。(上限不明)
B=[0:0.1:0.9 ; 1:0.1:1.9 ; 2:0.1:2.9 ; 3:0.1:3.9]

Bg=B.*(Crange/max(B)) // Bの最大値をCrangeの最大値にしたMatrix
Matplot(Bg) // ColorMap
xset("colormap",graycolormap(Crange)) //グレースケール化
lines(50)
//--------------------------------------------------------

Qエクセルを使用してデジタルフィルタのハイパスフィルタ・ローパスフィルタの掛け方を教えてください。

タイトルどおりなのですが、エクセルを使用してデジタルフィルタのハイパスフィルタ・ローパスフィルタをかけたいです。

ご存知の方、よろしくお願いします。

Aベストアンサー

わたしはわかりませんが、こんなページがありました。

エクセルを使用してデジタルフィルタのハイパスフィルタ・ローパスフィルタの掛け方を教えてください。
出来ましたらそのまま使える式をお願いいたします。

http://q.hatena.ne.jp/1204546061

QMATLABの乱数生成関数 rand( ) について

一様乱数を生成する関数rand()について
 ・Y = rand(n);

 ・rand('state',sum(100*clock));
  Y = rand(n);

という2つのやり方があるようなのですが,以下のmatlabの関数の説明
のページをみても2つの違いが理解できません.
http://infoshako.sk.tsukuba.ac.jp/ShakoDoc/MATLAB5/jhelp/techdoc/ref/rand.html

どういう違いがあるのでしょうか?
また,この関数は[0,1]の一様乱数としていますが,[-a,a]みたいに範囲指定はできないのでしょうか?

回答よろしくお願いします.

Aベストアンサー

Y = rand(n);
は乱数発生器が固定されています。
ですので、rand関数を実行するたびに同じルールに従って乱数を生成します。

対して、
rand('state',sum(100*clock));
Y = rand(n);
は使用する乱数発生器を実行時の時間を基準に決定します。
ですので、rand関数を実行するたびにルールを変更して乱数を生成します。(変更した結果、同じルールが選択される場合もあります)

任意の範囲で正負を付けたい場合は、例えば以下のようにすれば可能です。

例:-1000~1000の乱数の場合
(1) 乱数1生成
(2) 乱数2生成
(3) Ans = 1000 * 乱数1
(4) 乱数2が奇数の場合 Ans = -Ans

QFFTとパワースペクトルの違いについて教えてください。

FFTとパワースペクトルの違いについて教えてください。
勉強不足で申し訳ありません。よろしくお願いします。

Aベストアンサー

信号をFFTで出したスペクトルというのは、
単にある信号をフーリエ展開した係数をプロットしたものに過ぎません。
ですので、位相によっては値がプラスにもマイナスにもなることがあります。

これに対してパワースペクトルというのは、信ある信号について
ある周波数における信号強度そのものをプロットしたものです。
ですので、位相にかかわらずかならず値がプラスになります。

確かFFTスペクトルを2乗したものがパワースペクトルになったと思います。
間違ってるかもしれないので、一応教科書も調べてみてください。

QExcel VBAにてFFT

Excel VBAにておよそ5万点のデータをFFTする方法についての質問をさせてください。

いつもはあるソフトを用いて実験データのFFTを行っているのですが、作業効率を改善したいと考えExcel VBAにてFFTをしたいと考えています。

私はC言語を少しですが学習したことがあるので、FFTWのようなFFT を実装したフリーソフトウェアが存在しているのを知っています。
時間節約のためExcel VBAにてFFTのコードを位置から書くのではなく、FFTWのアルゴリズムでExcel VBAで利用できるプログラムを使いたいと考えています。
この場合、自分でFFTWのコードを見ながらExcel VBA用にコードを書きかえるしか手はないのでしょうか。私はC言語もExcel VBAも未熟であるため、この作業を行うことができそうにありません、、、
Excel VBAで利用することのできるFFTのコードはあるのでしょうか。

なお、FFTするためのデータ点数は約5万点、多いと10万点ほどで、データ点数が2の累乗に限定しないものを使いたいと考えています。

Aベストアンサー

今晩は。ちょっとお節介かもしれませんが、
大量のデータの処理をこれからもなされるのでしたら、No.3の回答と重なるところもありますが、
1) scilab, Octave, Rなどの科学計算に特化したソフトウエアの中からを1つ
2) Ruby, Python, Perlなどのテキスト処理と科学計算も可能なプログラム言語の中から1つ
を習得されることをお勧めします。

前者は、Excelに読み込める程度に整形されているのでしたら直接読むことができますし、行列計算やグラフ作成、統計計算などが簡単にできます。(PDFなどのファイルにグラフを直接書けます、また計算やグラフはかなり高速です)
http://hotic.blog129.fc2.com/blog-entry-10.html
http://cse.naro.affrc.go.jp/takezawa/r-tips/r/40.html
1、2行のプログラムで読み込むことができます。

後者はというと、テキストデータから必要の部分を切り出したり、基本的な計算をしたりするのに使えます。
最近では行列計算ライブラリやGSLやFFTなどのC言語で書かれたライブラリを直接使うライブラリが提供されていますので、ほとんどの場合は2)だけ処理が可能です。行列計算ライブラリは結構強力で計算速度もかなりでます。最近回答したものですが、
http://oshiete1.nifty.com/qa7525007.html
のNo.7に100万個の128次元ベクトルの中から、特定の点にもっとも近いものを選び出すというプログラムを掲載していますが、計算部分は実質2行で2秒で結果を出してくれます。後でC言語で書き直して0.2秒と速くなりましたが、プログラムを書くエネルギーを比べるとCで書くのはとても引き合いませんでした。

Octave→scilab→Rと使うプログラムを変えてきましたが、初めてだったらscilabがとっつきやすいように思います。

私自身は最近ではruby+Rを直接呼び出すライブラリ+行列計算ライブラリを使っています。多量のテキストの中からデータ部分を取り出す必要が有るので基本的にはRubyでデータ処理をし、多変量解析やFFTなどの高度な計算やグラフはRを直接呼び出して使う方法をとっています。

今晩は。ちょっとお節介かもしれませんが、
大量のデータの処理をこれからもなされるのでしたら、No.3の回答と重なるところもありますが、
1) scilab, Octave, Rなどの科学計算に特化したソフトウエアの中からを1つ
2) Ruby, Python, Perlなどのテキスト処理と科学計算も可能なプログラム言語の中から1つ
を習得されることをお勧めします。

前者は、Excelに読み込める程度に整形されているのでしたら直接読むことができますし、行列計算やグラフ作成、統計計算などが簡単にできます。(PDFなどのファイルにグラフ...続きを読む


人気Q&Aランキング