こんにちは。
一周期の三角波についての高速フーリエ変換して、そのすペクトラムのグラフのプログラムの組み方が分かりません。高速フーリエ変換自体が良く分からないので、勉強方法や分かりやすい参考書があったら教えてください。

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

A 回答 (5件)

古い本ですが、添田他「信号処理の基礎と応用」日新出版 はコンパクトに要点が説明してある良著です。



勉強法としては、手計算(^^; N=8位で、機械に成り代わって計算をやってみるのが一番良いと思いますよ。

三角波に限る理由はよく分かりませんが、FFTは知って置いて損はありません。
    • good
    • 0

すいません。

ほんの名前を間違えました。

Numerical Recipes in C です。

日本語版は、
ニューメリカルレシピ・イン・シー 日本語版―C言語による数値計算のレシピ
で、技術評論社 ; ISBN: 4874085601
です。
    • good
    • 0
この回答へのお礼

ありがとうございました。是非参考にさせていただきます。

お礼日時:2001/01/10 18:54

このページ(参照URL)にFFTの基礎から応用の解説、そしてフリーの


計算プログラムまであります。一度御覧になってはいかがでしょう。

参考URL:http://momonga.t.u-tokyo.ac.jp/~ooura/fftman/ind …
    • good
    • 0
この回答へのお礼

参考にさせていただきます。ありがとうございました。

お礼日時:2001/01/10 18:50

計算関係だと、Program Recipes in Cという本があります。


FFTを初めとして沢山乗っています。
プログラム上注意しなければならないことなども丁寧に書いてあります。
C言語がおわかりなら使いやすい本だと思います。
たくさんのサンプルプログラムもあります。

日本語訳もでています。ちょっと高いですがお勧めです。
    • good
    • 0

FFTについて解説してある本を紹介します。



FFTはDFTを高速に行うためのアルゴリズムなので、
DFTがわかればわかると思います。難しいですが。
昭晃堂の「ディジタル信号処理」
辻井重男 鎌田一雄 共著 がよいのではないかと
思います。解説部分が他の本より多い、FFTも
2種類載っているなど。

また、技術評論社のSoftwareTechnologyシリーズに
Cでかかれたアルゴリズムの本があります。
ここにFFTのプログラムのサンプルがあったと思います。
今、手元にないので書名がわからないのですが。

とりあえず、手元にある情報は以上です。
    • good
    • 0

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

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

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

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

QImageJを使ったFFTについて

フリーソフトのImageJを使って、画像をFFTします。
このとき、FFTのoptionでパワースペクトルも同時に表示することができるのですが、結果として出てくるFFT後の画像とパワースペクトルの二つの画像の違いは何なのでしょうか?

FFT後の画像とパワースペクトルの数値データを見たのですが大きさが違うように見えるだけで、どのような意味があるのかがさっぱり分かりませんでした。

FFTの原理もあまり理解できていないので、ネットで調べてみてもイマイチよく分かりませんでしたので質問させていただきました。

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

Aベストアンサー

#3です。
FHT(高速ハートレー変換)というのをちょっと調べてみると、フーリエ変換と同じようなことを実数だけでやるというものだそうです。結果をちょっと細工するとフーリエ変換と同じ結果になるので、持っている情報量は同じ。原画が再生される。そして、FHTから求めるパワースペクトルはフーリエ変換から求められるパワースペクトルと同じようです。

先に示したURLによれば、FFTの結果(実はFHT)として見せている画像はパワースペクトルを見せているということなので、「結果として出てくるFFT後の画像とパワースペクトルの二つの画像」は結局のところ同じものではないのでしょうか。

数値以前に、明るい画素は明るい、暗い画素は暗い、と画素毎に確実な対応関係が確認できれば、両者同じもの、見せ方が違うだけ、という結論でよさそうに思われますが。


「結果として出てくるFFT後の画像とパワースペクトルの二つの画像」と数値が対応しないということですが、対応しないのは次のどちらかではないでしょうか。
第一に、FFT結果として、見せている画像とは別に保持しているフーリエ変換結果の数値がある、と先に示したURLでは書かれているはずですが、違いますか?ここ大事。
すると、Text Imageで保存されるのは「見せている画像」と「それとは別に保持しているフーリエ変換結果の数値」と、どっちですか?前者「見せている画像」ではありませんか?それだと比べようもないかもしれませんよね。見せている画像というのは絶対値化とか自乗とかしただけでなく、適当なスケーリングをしているかもしれないし、表示ダイナミックレンジ圧縮のために対数化しているかもしれないのですから。そのような画素値がText Imageで保存されるのではないですか?ご確認ください。
第二に、ext Imageで保存されるのは「別に保持しているフーリエ変換結果の数値」だとしても、それはFFT結果とかいいつつも実はFHTの結果であり、別の値になります。FHTの結果を振幅自乗してもパワーにはなりません。FHT結果からFFT結果に焼き直すには細工が要ります。

結局、FFTといいつつFHTなるものを中で使っているということは、結果として見せるのは同じパワースペクトルであるからこそ、中身の保存値はFFTじゃなくFHT結果で構わない、ということなんではないでしょうか?

#3です。
FHT(高速ハートレー変換)というのをちょっと調べてみると、フーリエ変換と同じようなことを実数だけでやるというものだそうです。結果をちょっと細工するとフーリエ変換と同じ結果になるので、持っている情報量は同じ。原画が再生される。そして、FHTから求めるパワースペクトルはフーリエ変換から求められるパワースペクトルと同じようです。

先に示したURLによれば、FFTの結果(実はFHT)として見せている画像はパワースペクトルを見せているということなので、「結果として出...続きを読む

Q高速フーリエ変換とフーリエ変換の違い

高速フーリエ変換とフーリエ変換の違いについて教えて下さい。
高速フーリエ変換は何か近似を行うことによって、計算速度を速くしているのでしょうか?
もし、何かの極限で出てくる結果が違う場合などがあれば教えて下さい。

Aベストアンサー

>出てくる結果は全く同じだということなのでしょうか?
その通りです。

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フーリエ変換はsin波cos波で・・・

フーリエ変換についてなんですけど、
フーリエ変換はある波長でも何でもつまりは、方程式をsin波とcos波の実数倍をたし合わせたもので表現しようというものですよね?
なのに、なぜ、フーリエ変換した後のグラフはスペクトルがあるグラグになるのですか?

Aベストアンサー

グラフにあらわす時には波の周波数と強さ(振幅)だけに着目しています。
波の位相については無視してしまっているわけです。
なお、同じ周波数のsin波とcos波は一つの波に合成できます。(ベクトル合成)
グラフに表す目的は、どんな周波数の波が存在しているか、又その強さはどうかと言う事だけに興味があるわけです。
従って、当然のことですが、グラフから、元の波を合成する事は出来ません。

>なぜ、フーリエ変換した後のグラフはスペクトルがあるグラグになるのですか?

飛び飛びになるという意味でしょうか。元の波にどのような周波数成分が含まれているかによって飛び飛びになったり、連続になったりします。

QFFT(高速フーリエ変換)のプログラム

お世話になります。

仕事でFFTのプログラムを内製しようとしています。

初心者なので、他の人(今は退社していません)が昔作ったFFTのプログラムを参考にしようと思いそれを解読中です。

そのプログラムはC言語で書かれていますが、「ガウスの消去法を使って連立方程式を解く」というプロセスが含まれています。

私の認識では、FFTではガウスの消去法を使う事はないので、私が見たプログラムはFFTではなくDFTのプログラムではないかと思っています。

FFTのプログラムでガウスの消去法を使う事はあるのでしょうか?勉強中なのと、周りに知っている人がいないため、どなたか教えて下さい。

よろしくお願いします。

Aベストアンサー

http://ja.wikipedia.org/wiki/%E9%9B%A2%E6%95%A3%E3%83%95%E3%83%BC%E3%83%AA%E3%82%A8%E5%A4%89%E6%8F%9B
ここで、
e^ix=cos(x)+i * sin(x) を使って
f_real(j) + i*f_imag(j)
= Σ((x_real(k) + i * x_imag(k))*(cos(-2*π*(j^k)/n) + i*sin(-2*π*(j^k)/n))
※ -2*π*(j^k)/n=θとして、上記式を展開
= Σ(x_real(k)*cosθ + i * x_imag(k)*cosθ + i*x_real(k)*sinθ - x_imag(k)*sinθ )
∴ 実数部と虚数部に分けて
f_real(j)= Σ(x_real(k)*cosθ- x_imag(k)*sinθ )
f_imag(j) = Σ( x_imag(k)*cosθ + x_real(k)*sinθ )

つまり、DFTは、ひたすら「θを計算→sinθ,cosθを計算→掛けて足す」 を繰り返すだけです。
(三角関数の性質(周期等)を利用して、先に使用するcos,sinを計算しておく、等といった工夫を加えることもできますが)

FFTは、DFTの特殊なケース(xの数 n が2のべき乗個のとき)に、対称性等を利用して計算を減らしたものです。

どちらにも、多元連立方程式を解くようなものは出てきません。


もう一度、処理の流れを確かめてください。
・その消去法は、実際にプログラムで使用されているのでしょうか?
定義されているだけで、呼び出されていない(実行されていない)、ということは無いでしょうか?
・そのプログラムは、純粋にFFTを計算するだけのものでしょうか?
一連の処理の中にFFTがある、というものではありませんか?
生のデータ→前処理→FFT→後処理→欲しいデータ
という流れで、前処理や後処理に使われているだけではないでしょうか?


○VBA
プログラムを作ること自体は問題ありません。
http://ja.wikipedia.org/wiki/%E9%AB%98%E9%80%9F%E3%83%95%E3%83%BC%E3%83%AA%E3%82%A8%E5%A4%89%E6%8F%9B
にVisual Basicの例が載っていますが、ほぼここままでVBAでも動作すると思います。

ただし、メモリ量や計算速度が実用的なレベルになるかどうかまではわかりません。

http://ja.wikipedia.org/wiki/%E9%9B%A2%E6%95%A3%E3%83%95%E3%83%BC%E3%83%AA%E3%82%A8%E5%A4%89%E6%8F%9B
ここで、
e^ix=cos(x)+i * sin(x) を使って
f_real(j) + i*f_imag(j)
= Σ((x_real(k) + i * x_imag(k))*(cos(-2*π*(j^k)/n) + i*sin(-2*π*(j^k)/n))
※ -2*π*(j^k)/n=θとして、上記式を展開
= Σ(x_real(k)*cosθ + i * x_imag(k)*cosθ + i*x_real(k)*sinθ - x_imag(k)*sinθ )
∴ 実数部と虚数部に分けて
f_real(j)= Σ(x_real(k)*cosθ- x_imag(k)*sinθ )
f_imag(j) = Σ( x_imag(k)*cosθ + x_real(k)*sinθ...続きを読む

Q方形波をフーリエ変換した理由と分かる事

A――――――――
|       | 
=       |   
|B       発振器
>       |   
<       | 
――――――――
C
AC間とコンデンサーの両端の電圧波形とスペクトル波形があります。(400Hzと4kHzの方形波を流しました。)何が何故最初のピークの奇数倍となってるのでしょうか?またフーリエ変換した理由が分かりません。教えてください。

Aベストアンサー

フーリエ変換する理由はスペクトルアナライザでスペクトルを観測しているから計算結果と比較できるからです。

方形波をフーリエ級数展開したあとフーリエ変換すれば奇数倍の理由はわかります。

補足に方形波をフーリエ変換した結果を書いてみてください。

QFFTアナライザーについて

音でグラスを割る実験をした際に「FFTアナライザー」を使用したのですが、この実験でのFFTアナライザーの役目とは何ですか?

Aベストアンサー

http://www.onosokki.co.jp/HP-WK/c_support/newreport/analyzer/FFT1/fft_1.htm#mark1
友達と会話したらと思います。

Qラプラス変換とフーリエ変換について教えて下さい。

ラプラス変換とフーリエ変換の違いは後者が虚数だけなのに対して、前者はそれを拡張して複素数に使えるようにしたものであるということ分かるのですが、その使い分け方がさっぱり分かりません。

・一般的に微分方程式を解くときにはラプラス変換を用いますが、これをフーリエ変換でしないのはなぜなのでしょうか?

・逆格子ベクトルを作るときや、スペクトラムアナライザーではフーリエ変換を使いますが、これをラプラス変換でしてはいけないのでしょうか?

・計算機用にフーリエ変換にはFFTというものがありますが、ラプラス変換を離散的にしたZ変換の計算機用に速くしたものがないのはなぜなのでしょうか?

よろしくお願い致します。

Aベストアンサー

お世話さまです。
>一般的に微分方程式を解くときにはラプラス変換を用いますが、これをフーリエ変換でしないのはなぜなのでしょうか?
無限に続く関数はフーリエ変換できないため。sin関数が例です。
積分した値が無限無限大以下となるような関数しか扱えません。

ラプラス変換でもスペクトラムアナライザー変換できます。
フーリエ変換の中にラプラス変換があるイメージで考えるとわかりやすいです。まず使用はないです。積分・微分演算子の分野として確立してます。

QFFTによるフィルタの可能性について

はじめまして、信号処理については初心者です。教えていただけると幸いです。

ソフト処理でディジタルフィルタを作成したいと思っています。
リアルタイム処理が最終目標です。
IIRとかFIRとかの手法がありますが、FFTによるフィルタリングの可能性はあるのか知りたいです。

エクセルを用いて、模擬的に作った方形波をFFT演算して、
その結果の高い周波数部分を0にして逆FFTすると、綺麗に高調波が除去されていました。
この方法でのフィルタリングは実現可能なものと考えてよいのでしょうか?

FFT処理では、エクセルの結果を見る限り、(当たり前ですが)遮断周波数でスパッと切れた波形が得られています(遮断周波数以上の振幅は0になる)。
一方、フィルタの本などでは、振幅減衰は1次で-20dB/dec、2次で-40dB/decと書かれており、
物理法則上そうなるものと思っていました。
FFTを利用したフィルタリング(遮断周波数以上の振幅は0)というのは、
何か原理的に(物の理として)おかしいところはないのか、不安に思っています。

また、電気系の雑誌にはIIRフィルタ等の使用について書かれている記事を見受けますが、
FFTフィルタリングが可能だとすれば、こちらの方が理想的なフィルタが得られることになります。
何か問題があってFFTフィルタリングが採用されていないと思いますが、どのような問題を秘めているのでしょうか。
(FFTフィルタが理想なのに、IIRフィルタが使用される理由は?)

上にも記載しましたが、将来的には高速マイコン(DSP,FPU付き)を使用してリアルタイム的な処理を行いたいと考えています(サンプリング周波数は16kHz程度です)。
FFTフィルタリングの設計の肝、IIR(FIR)フィルタとの使い分けについても、ご教示いただけると幸いです。

どうぞよろしくお願いいたします。

はじめまして、信号処理については初心者です。教えていただけると幸いです。

ソフト処理でディジタルフィルタを作成したいと思っています。
リアルタイム処理が最終目標です。
IIRとかFIRとかの手法がありますが、FFTによるフィルタリングの可能性はあるのか知りたいです。

エクセルを用いて、模擬的に作った方形波をFFT演算して、
その結果の高い周波数部分を0にして逆FFTすると、綺麗に高調波が除去されていました。
この方法でのフィルタリングは実現可能なものと考えてよいのでしょうか?

FFT処理では、エ...続きを読む

Aベストアンサー

>FFT結果の各ポイントの振幅は変えずに、位相だけを変更することも、やはり不連続が生じたりして無理があるのでしょうか?
>(例えばFFT後のデータで、1kHzの周波数成分の位相を45度進めて、3kHzの成分の位相は15度遅らせて、逆FFTして出力するといった処理)
>(フェイズシフターというのでしょうか)

一般的な信号入力を考えると、不連続点が生じると思われます。

Q矩形波と正弦波の半波整流

矩形波の半波整流を行っていますが、半波整流した直流電圧を算出できる式はないでしょうか?
実験値と比較してみたいのです。
また、正弦波を半波整流した時と矩形波を半波整流した時では整流後の直流電圧値は異なります。(実験結果から矩形波の方が高い)
感覚的には分かるのですが、理論的にこの理屈を説明できる方がいれば助言お願い致します。

Aベストアンサー

概算なら、ダイオードを理想的なものとして、

矩形波の場合
1. 正の半波では出力電圧は入力電圧最大値と一致する。
2. 負の半端では、出力電圧はCR(Rは負荷抵抗)の時定数で指数関数的に減少する。
として、平均値を計算できます。

正弦波の場合には、
a. 正弦波の正のピークから出力電圧vdはCRの時定数で減少する。
b. 次の周期で、正弦波電圧と直流電圧が一致した時点(この時刻を上記電圧と交流電圧の周期から計算)で、コンデンサに充電がはじまり、出力電圧と交流電圧の瞬時値が一致する。
とすれば、直流電圧の波形が決まるので、平均電圧を計算できます。
(厳密には、CRの時定数で出力電圧の減少がおきるのは、入力のピークを少し過ぎたところからですが、概算ということでその部分を無視しています。)


人気Q&Aランキング